如何指定SceneKit相机控制旋转中心?

问题描述 投票:0回答:0

我正在为 macOS 编写一个简单的SceneKit 点云查看器,并使用SCNView

 提供的内置相机控件。最初我将坐标轴添加到放置在原点的场景根节点,然后我在 (4,4,4) 处添加一个相机指向原点(y 轴默认为“向上方向”):

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 的其他部分。

3d scenekit appkit
© www.soinside.com 2019 - 2024. All rights reserved.