我正在使用SceneKit并拥有一个包含多个SCNNode的应用程序,当用户点击一个时,它将跟随他们的手指(使用UILongPressGestureRecognizer)。在状态开始和更改时,我使用以下代码行来更改节点的位置:
_currentlyMoving?.position = SCNVector3Make(worldPoint.x, worldPoint.y, worldPoint.z)
在这一行中,_currentlyMoving
是SCNNode,worldPoint是我手指的位置。
这是将节点移动到正确的位置;但是,它似乎也将节点的旋转更改为(0,0,0)(节点始终处于其起始旋转位置。)
有没有办法在不影响旋转的情况下更改SCNNode的位置?
另外,我尝试了以下但是它也没有用(发生了同样的事情):
_currentlyMoving?.transform.m41 = worldPoint.x
_currentlyMoving?.transform.m42 = worldPoint.y
_currentlyMoving?.transform.m43 = worldPoint.z
我对节点做的唯一其他事情就是以下三行来阻止它在拾取时移动:
_currentlyMoving?.physicsBody?.velocity = SCNVector3Make(0.0, 0.0, 0.0)
_currentlyMoving?.physicsBody?.velocityFactor = SCNVector3Make(0.0, 0.0, 0.0)
_currentlyMoving?.physicsBody?.angularVelocity = SCNVector4Make(0.0, 0.0, 0.0, 1.0)
答案 0 :(得分:5)
所以在经过几天的测试后,我发现旋转实际上并没有在节点上设置;它只在表示节点上设置。因此,每当我设置位置时,根据我的新位置和当前旋转(它认为是[0,0,0])自动重新计算节点的变换,从而有效地重置节点'轮换。
因此,为了解决这个问题,您必须将节点的旋转更改为presentationNode的旋转。
这是我目前在我的panGestureRecognizer .Began
状态下执行的操作(将触摸的节点设置为currentlyMoving
之后:
if let currentlyMoving = _currentlyMoving {
if let presentationNode = currentlyMoving.presentationNode() {
currentlyMoving.rotation = presentationNode.rotation
}
currentlyMoving.position = newLocation
}
这只是将节点的旋转设置为其显示旋转,然后再移动它,以便根据用户可以看到的内容正确设置变换。
我遇到的一个问题是,我下载的一些模型仍然被奇怪地旋转了很少量,尽管我自己创建的所有模型都运行良好。我必须创建自己的其他模型版本,之后一切都运行正常。因此,当我将它们的旋转设置为它们的演示旋转时,我仍然不清楚第一个导致它们稍微移动的模型出了什么问题(我没有任何3D建模经验)。