我正在用Swift 5编写一个游戏(但是在Swift 4上也有同样的问题,我最近通过game更新了这个问题),我所有的SCNNode都以SCNVector3Zero为中心。换句话说(0,0,0)在我的游戏区域的中心。
SCNCamera连接到一个SNCNode,位于游戏区域的界限之外,看(0,0,0)。cameraNode.look(at: SCNVector3Zero)
如果我在场景中放置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,
半径:半径,
纹理名称:“地球”)
我试着给每个质量为零的节点添加一个固定的物理体,但没有效果。就像相机不再直接看(0,0,0),而是受场景中节点的影响。
我已经尝试了添加节点的各种排列,在一些测试中,添加了Z轴引起的问题。
这是addSphere方法。。。
内部func addSphere(x:Float,y:Float,z:Float,radius:Float,color:UIColor,textureName:String)->SCNNode{
设球面测量法=SCNSphere(半径:CGFloat(半径))
球测。第一材料?.diffuse.contents=UIImage(imageLiteralResourceName:纹理名称)
设sphereNode=SCNNode(几何:球面测量)
sphereNode.name=“点”
sphereNode.position=SCNVector3(x:x,y:y,z:z)
sphereNode.lines=[];
sphereNode.ignoreTaps=错误
sphereNode.categoryBitMask=NodeBitMasks.dot
//sphereNode.physicsBody=scnpphysicsbody(类型:.static,形状:nil)
self.rootNode.addChildNode(sphereNode)
返回球面
}
没有错误,正如您所料,任何位于(0,0,0)的点在“注视”该点的同时旋转时应保持静止。
任何一个指针都是非常值得赞赏的,因为我不知道它为什么会这样。
最佳答案
我假设你用SCNView.allowsCameraControl = true
来移动相机。SceneKit的这个内置设置实际上仅用于场景的调试目的。它不适合任何时候,你想有专门的控制你的相机运动。
您应该尝试实现相机动态观察,请参见https://stackoverflow.com/a/25674762/3358138。
我可以用场景的“摇摆”中心再现你的问题,请参见“游乐场要点”。
一个相机轨道解决了这个“摇摆”,让相机保持在中心,见游乐场要点https://gist.github.com/dirkolbrich/e2c247619b28a287c464abbc0595e23c。
关于ios - 如何确保SceneKit相机始终指向特定位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56449492/