我正在为 macOS 编写一个简单的SceneKit 点云查看器,并使用SCNView
cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(x: 4, y: 4, z: 4)
cameraNode.look(at: SCNVector3(x: 0, y: 0, z: 0))
scene.rootNode.addChildNode(cameraNode)
我启用
SCNView
的相机控制:
sceneView.allowsCameraControl = true
sceneView.defaultCameraController.interactionMode = .orbitTurntable
下图左上角的截图为初始视图:
在我添加任何其他内容之前,相机控件按预期工作并且相机在我平移时使用 (0,0,0) 作为旋转中心。
稍后应用加载点云并将其添加到场景图中(见右上角的屏幕截图):
let indices: [Int32] = Array(0..<Int32(vertices.count))
let element = SCNGeometryElement(indices: indices, primitiveType: .point)
let geometry = SCNGeometry(sources: [vertexSource, colorSource], elements: [element])
let node = SCNNode(geometry: geometry)
node.rotation = SCNVector4Make(1, 0, 0, .pi) // yaxis up
sceneView.scene?.rootNode.addChildNode(node)
点云的原点是 (0,0,0)(这应该使事情变得简单)。我确实将点云绕 x 轴旋转 180 度,因为 y 轴在模型中指向下方,但需要向上以适应场景套件的默认方向。我重新定位相机,但它仍然指向 (0,0,0):
let rad = 10.0
let theta = Double.pi/4
let phi = Double.pi/3
let x = CGFloat(rad * cos(phi) * cos(theta)) // assume center at (0,0,0)
let z = CGFloat(rad * cos(phi) * sin(theta))
let y = CGFloat(rad * sin(phi))
self.cameraNode.position = SCNVector3(x, y, z)
self.cameraNode.look(at: SCNVector3Zero)
这是奇怪的部分。如果我立即加载点云,相机将围绕某个未知点向左平移(请参见左下角的屏幕截图)。如果我在 before 加载点云之前与相机交互(或者有时只是稍等一下或以不同的方式保持沉默),旋转中心就是所需的点 (0,0,0),如右下角所示。
我还需要指定其他内容才能获得所需的行为吗?我尝试设置 相机控制器的目标到原点
self.sceneView.defaultCameraController.target = SCNVector3Zero
无济于事。文档基本上是空的。我在我的设置中遗漏了什么吗?不确定的行为似乎表明我可能缺少我应该调用的 API 的其他部分。