我正在尝试使用GKOctree来有效检索3D空间中的对象。但是,以下代码似乎没有按预期工作:
import GameplayKit
let tree = GKOctree(boundingBox: GKBox(
boxMin: vector_float3(x: -10, y: -10, z: -10),
boxMax: vector_float3(x: 10, y: 10, z: 10)
), minimumCellSize: 0.1)
tree.add(NSObject(), at: vector_float3(x: 0, y: 0, z: 0))
tree.elements(at: vector_float3(x: 0, y: 0, z: 0)).count // 1, fine
tree.elements(in: GKBox(
boxMin: vector_float3(x: -1, y: -1, z: -1),
boxMax: vector_float3(x: 1, y: 1, z: 1)
)).count // 0, ??
tree.elements(in: GKBox(
boxMin: vector_float3(x: 1, y: 1, z: 1),
boxMax: vector_float3(x: -1, y: -1, z: -1)
)).count // 0, well I tried
答案 0 :(得分:2)
我做了一些测试,似乎 GKOctree
中存在一个错误,它会反转 z 轴的符号。
如果您像这样更改代码,它会起作用:
import GameplayKit
let tree = GKOctree(boundingBox: GKBox(
boxMin: vector_float3(x: -10, y: -10, z: 10), // <---- check this out
boxMax: vector_float3(x: 10, y: 10, z: -10) // <---- check this out
), minimumCellSize: 0.1)
tree.add(NSObject(), at: vector_float3(x: 0, y: 0, z: 0))
tree.elements(at: vector_float3(x: 0, y: 0, z: 0)).count // 1, fine
tree.elements(in: GKBox(
boxMin: vector_float3(x: -1, y: -1, z: -1),
boxMax: vector_float3(x: 1, y: 1, z: 1)
)).count // 1, works
tree.elements(in: GKBox(
boxMin: vector_float3(x: 1, y: 1, z: 1),
boxMax: vector_float3(x: -1, y: -1, z: -1)
)).count // 1, works indeed