Ios 如何确保SceneKit摄像头始终指向特定位置

Ios 如何确保SceneKit摄像头始终指向特定位置,ios,swift,camera,scenekit,Ios,Swift,Camera,Scenekit,我正在用Swift 5编写一个游戏(但Swift 4也有同样的问题,我最近从游戏中更新了这个问题),我所有的SCNNode都以SCNVector3Zero为中心。换句话说,(0,0,0)是我游戏区域的中心 SCNCamera与SNCNode相连,位于游戏区域界限之外,观察(0,0,0) cameraNode.look(查看:scinvector3zero) 如果我在场景中放置5个节点,所有节点都位于y=0平面上,(0,0,0),(-1,0,-1),(1,0,1),(-1,0,1)和(1,0,-1

我正在用Swift 5编写一个游戏(但Swift 4也有同样的问题,我最近从游戏中更新了这个问题),我所有的SCNNode都以SCNVector3Zero为中心。换句话说,(0,0,0)是我游戏区域的中心

SCNCamera与SNCNode相连,位于游戏区域界限之外,观察(0,0,0)

cameraNode.look(查看:scinvector3zero)

如果我在场景中放置5个节点,所有节点都位于y=0平面上,(0,0,0),(-1,0,-1),(1,0,1),(-1,0,1)和(1,0,-1),就像一个骰子的面显示五个节点一样,效果非常好。我可以在节点位于(0,0,0)的情况下围绕场景旋转,保持居中而不移动

如果我添加第二行,那么第一行移动到y=1,第二行获得y=-1的节点,旋转时场景会稍微抖动

节点从中心移动得越远,抖动就变得越严重

下面是设置场景的代码(此示例有三行,看起来像一个骰子的三维“五”面,点在(0,0,0)的中心,其他点在立方体的每个角)

addSphere( x:0.0, y:0.0, z:0.0, 半径:半径, 纹理名称:“地球”) addSphere( x:-2.0*间距, y:-2.0*间距, z:0.0, 半径:半径, 纹理名称:“地球”) addSphere( x:2.0*间距, y:2.0*间距, z:0.0, 半径:半径, 纹理名称:“地球”) addSphere( x:-2.0*间距, y:2.0*间距, z:0.0, 半径:半径, 纹理釉:“花岗岩”) addSphere( x:2.0*间距, y:-2.0*间距, z:0.0, 半径:半径, 纹理釉:“花岗岩”) addSphere( x:0.0, y:-2.0*间距, z:-2.0*间距, 半径:半径, 肌理胺:“粘液”) addSphere( x:0.0, y:2.0*间距, z:2.0*间距, 半径:半径, 肌理胺:“粘液”) addSphere( x:0.0, y:2.0*间距, z:-2.0*间距, 半径:半径, 纹理名称:“木材”) addSphere( x:0.0, y:-2.0*间距, z:2.0*间距, 半径:半径, 纹理名称:“木材”) 这段代码的行为是,所有东西都围绕(0,0,0)对称,位于(0,0,0)的节点正好保持在它应该保持的位置

如果我把这个节点引入到场景中,一切都会大错特错

addSphere( x: 6.0, y: 6.0, z: 6.0, radius: radius, textureName: "earth") addSphere( x:6.0, y:6.0, z:6.0, 半径:半径, 纹理名称:“地球”) 我试着给每个质量为零的节点添加一个固定的物理体,但没有效果。这就像摄影机不再直接注视(0,0,0),而是受到场景中节点的影响

我尝试过各种添加节点的排列,在一些测试中,它似乎添加了任何z轴引起的问题的值

这是addSphere方法

internal func addSphere(x: Float, y: Float, z: Float, radius: Float, color: UIColor, textureName: String) -> SCNNode { let sphereGeometry = SCNSphere(radius: CGFloat(radius)) sphereGeometry.firstMaterial?.diffuse.contents = UIImage(imageLiteralResourceName: textureName) let sphereNode = SCNNode(geometry: sphereGeometry) sphereNode.name = "dot" sphereNode.position = SCNVector3(x: x, y: y, z: z) sphereNode.lines = []; sphereNode.ignoreTaps = false sphereNode.categoryBitMask = NodeBitMasks.dot //sphereNode.physicsBody = SCNPhysicsBody(type: .static, shape: nil) self.rootNode.addChildNode(sphereNode) return sphereNode } 内部func addSphere(x:Float,y:Float,z:Float,radius:Float,color:UIColor,textureName:String)->SCNNode{ 让球墨法=SCNSphere(半径:CGFloat(半径)) sphereGeometry.firstMaterial?.diffuse.contents=UIImage(imageLiteralResourceName:textureName) 设sphereNode=SCNNode(几何学:球墨法) sphereNode.name=“点” sphereNode.position=SCInvector3(x:x,y:y,z:z) sphereNode.lines=[]; sphereNode.ignoreTaps=错误 sphereNode.categoryBitMask=NodeBitMasks.dot //sphereNode.physicsBody=SCNPPhysicsBody(类型:。静态,形状:无) self.rootNode.addChildNode(sphereNode) 返回球面 } 没有错误,并且正如您所期望的,在“注视”该点时,在(0,0,0)处定位的任何点在旋转时都应保持静止


如果有任何指示,我都会非常感激,因为我不知道它为什么会这样。

我假设您使用
SCNView.allowsCameraControl=true
来移动相机。SceneKit的此内置设置实际上仅用于调试场景。当你想要对你的相机运动有专门的控制时,它不适合任何事情

您应该尝试实现摄影机动态观察,请参见

我可以用场景的“摆动”中心重现你的问题,见要点


相机轨道解决了这个“抖动”,让相机保持在中心位置,请参见游乐场要点。

我假设您使用
SCNView.allowsCameraControl=true
来移动相机。SceneKit的此内置设置实际上仅用于调试场景。当你想要对你的相机运动有专门的控制时,它不适合任何事情

您应该尝试实现摄影机动态观察,请参见

我可以用场景的“摆动”中心重现你的问题,见要点


摄像机轨道解决了这一“抖动”,让摄像机保持在中心位置,请参见游乐场要点。

摄像机的设置是什么,摄像机的位置在哪里?抱歉,我不知道有人回应了。没有人告诉我。相机沿X轴定位,y=0上方约30度,指向0,0,0,你的相机设置是什么?相机定位在哪里?对不起,我不知道有人回应了。没有人告诉我。相机沿X轴定位,在y=0上方约30度,指向0,0,0 internal func addSphere(x: Float, y: Float, z: Float, radius: Float, color: UIColor, textureName: String) -> SCNNode { let sphereGeometry = SCNSphere(radius: CGFloat(radius)) sphereGeometry.firstMaterial?.diffuse.contents = UIImage(imageLiteralResourceName: textureName) let sphereNode = SCNNode(geometry: sphereGeometry) sphereNode.name = "dot" sphereNode.position = SCNVector3(x: x, y: y, z: z) sphereNode.lines = []; sphereNode.ignoreTaps = false sphereNode.categoryBitMask = NodeBitMasks.dot //sphereNode.physicsBody = SCNPhysicsBody(type: .static, shape: nil) self.rootNode.addChildNode(sphereNode) return sphereNode }