6

我正在使用 SceneKit 并且有一个具有多个 SCNNodes 的应用程序,当用户点击一个时,它将跟随他们的手指(使用 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)
4

1 回答 1

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 建模经验)。

于 2014-10-08T08:06:15.100 回答