在不更改方向的情况下更改SCNNode位置



我使用的是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,0,0])自动重新计算,从而有效地重置节点的旋转。

因此,为了解决这个问题,必须将节点的旋转更改为presentationNode的旋转。

这是我目前在panGestureRecognizer的.Began状态下所做的(在将触摸节点设置为currentlyMoving:之后

if let currentlyMoving = _currentlyMoving {
    if let presentationNode = currentlyMoving.presentationNode() {
        currentlyMoving.rotation = presentationNode.rotation
    }
    currentlyMoving.position = newLocation
}

这只是在移动节点之前将节点的旋转设置为其表示旋转,以便根据用户所能看到的内容正确设置变换。

我遇到的一个问题是,我下载的一些模型仍然在奇怪地进行微小的旋转,尽管我自己创建的所有模型都运行良好。我不得不创建其他模型的自己版本,之后一切都很好。所以,我仍然不太清楚第一个模型出了什么问题,当我将它们的旋转设置为演示旋转时,导致它们发生了轻微的变化(我对3D建模没有任何经验)。

最新更新