Ios 更改SCNNode位置而不更改方向
我正在使用SceneKit,有一个带有多个SCNNodes的应用程序,当用户点击一个SCNNodes时,它将跟随他们的手指(使用UILongPressGestureRecognitor)。在“开始并更改”状态下,我使用以下代码行更改节点的位置:Ios 更改SCNNode位置而不更改方向,ios,swift,scenekit,scnnode,Ios,Swift,Scenekit,Scnnode,我正在使用SceneKit,有一个带有多个SCNNodes的应用程序,当用户点击一个SCNNodes时,它将跟随他们的手指(使用UILongPressGestureRecognitor)。在“开始并更改”状态下,我使用以下代码行更改节点的位置: _currentlyMoving?.position = SCNVector3Make(worldPoint.x, worldPoint.y, worldPoint.z) 在这行中,\u currentlyMoving是SCNNode,worldPoi
_currentlyMoving?.position = SCNVector3Make(worldPoint.x, worldPoint.y, worldPoint.z)
在这行中,\u currentlyMoving
是SCNNode,worldPoint是我手指的位置
这是将节点移动到正确的位置;但是,它似乎也在将节点的旋转更改为(0,0,0)(节点始终处于其开始旋转位置。)
有没有办法在不影响旋转的情况下改变SCNNode的位置
此外,我尝试了以下方法,但也不起作用(发生了同样的情况):
我对节点所做的另一件事是在拾取节点时使用以下三行代码阻止其移动:
_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,0,0])自动重新计算节点的变换,从而有效地重置节点的旋转 因此,为了解决这个问题,必须将节点的旋转更改为presentationNode的旋转 这是我当前在PangestureRecognitor的
.start
状态下所做的操作(将触摸的节点设置为currentlyMoving
:
if let currentlyMoving = _currentlyMoving {
if let presentationNode = currentlyMoving.presentationNode() {
currentlyMoving.rotation = presentationNode.rotation
}
currentlyMoving.position = newLocation
}
这只是在移动节点之前将节点的旋转设置为其表示旋转,以便根据用户可以看到的内容正确设置变换
我在这方面遇到的一个问题是,我下载的一些模型仍然以微小的数量进行奇怪的旋转,尽管我自己创建的所有模型都运行良好。我必须创建其他模型的我自己版本,之后所有模型都运行良好。因此,我仍然不太清楚问题出在哪里当我将它们的旋转设置为演示旋转时,导致它们发生轻微移动的第一个模型(我没有任何3D建模经验)。您的节点是否设置了physicBody?如果您以编程方式移动它,是否使用了“运动学”body?@Toyos它确实有一个physicsBody,但它是动态的,而不是运动学的。节点的变换不应该受其位置的影响,除非你有一些适当的约束。你能分享最小的代码来重现这个问题吗?
if let currentlyMoving = _currentlyMoving {
if let presentationNode = currentlyMoving.presentationNode() {
currentlyMoving.rotation = presentationNode.rotation
}
currentlyMoving.position = newLocation
}