Ios 如何确保SceneKit摄像头始终指向特定位置
我正在用Swift 5编写一个游戏(但Swift 4也有同样的问题,我最近从游戏中更新了这个问题),我所有的SCNNode都以SCNVector3Zero为中心。换句话说,(0,0,0)是我游戏区域的中心 SCNCamera与SNCNode相连,位于游戏区域界限之外,观察(0,0,0)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
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 }