【发布时间】:2021-10-13 19:01:48
【问题描述】:
我遇到了一个问题,SCNView.hitTest 没有检测到我在 cpu 上动态修改的几何图形。
概述如下:我有一个节点使用从 MTLBuffer 的顶点创建的 SCNGeometry:
func createGeometry(vertexBuffer: MTLBuffer, vertexCount: Int) -> SCNGeometry {
let geometry = SCNGeometry(sources: [
SCNGeometrySource.init(
buffer: vertexBuffer,
vertexFormat: .float3,
semantic: .vertex,
vertexCount: vertexCount,
dataOffset: 0,
dataStride: MemoryLayout<SIMD3<Float>>.stride),
], elements: [
SCNGeometryElement(indices: ..., primitiveType: .triangles)
])
}
let vertexBuffer: MTLBuffer = // shared buffer
let vertexCount = ...
let node = SCNNode(geometry: createGeometry(vertexBuffer: vertexBuffer, vertexCount: vertexCount))
当应用程序运行时,我会在 SceneKit 更新循环中动态修改顶点缓冲区:
// In SceneKit update function
var ptr = vertexBuffer.contents().bindMemory(to: SIMD3<Float>.self, capacity: vertexCount)
for i in 0..<vertexCount {
ptr[i] = // modify vertex
}
这个动态几何图形被 SceneKit 正确渲染。然而,当我尝试使用SCNView.hitTest 对node 进行命中测试时,没有检测到针对修改后的几何体的命中。
我可以通过在修改数据后重新创建节点的几何来解决这个问题:
// after updating data
node.geometry = createGeometry(vertexBuffer: vertexBuffer, vertexCount: vertexCount)
但是这感觉就像是一个 hack。
对于动态变化的SCNGeometry 的节点,让命中测试可靠工作的正确方法是什么?
【问题讨论】:
-
我不知道,如果我想说的方向正确,但这可能与 i.Ex 类似的问题。当您使用动画角色时,我前段时间读到,身体的变形仅由 GPU 执行,并且可以命中测试的数据实际上始终是原始数据(通常是人类性格),而不是修改过的性格。也许你的问题是相关的。
-
这个线程中有一些有趣的建议可能会有所帮助:developer.apple.com/forums/thread/91618(创建新的 SCNGeometry 性能很好/使用 SCNMorpher)
标签: swift augmented-reality scenekit arkit metal