首页 文章

更改 SCNNode 位置而不更改方向

提问于
浏览
6

我正在使用 SceneKit 并拥有一个带有多个 SCNNode 的应用程序,当用户点击一个时,它将跟随他们的手指(使用 UILongPressGestureRecognizer)。在状态开始和更改,我使用以下代码行来更改节点的位置:

_currentlyMoving?.position = SCNVector3Make(worldPoint.x, worldPoint.y, worldPoint.z)

在这一行中,_currentlyMoving是 SCNNode,而 worldPoint 是我手指的位置。

这是将节点移动到正确的位置;但是,它似乎也在将节点的旋转更改为(0,0,0)(节点始终位于其起始位置 rotation.)

有没有办法在不影响旋转的情况下改变 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)

1 回答

  • 5

    因此,经过几天的测试,我发现旋转实际上从未在节点上设置过;它只在表示节点上设置。因此,每当我设置位置时,根据我的新位置和当前旋转(它认为是[1])自动重新计算节点的变换,从而有效地重置节点的旋转。

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

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

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

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

    我遇到的一个问题是,我下载的一些模型仍然被微小的旋转奇怪,尽管我自己创建的所有模型都运行良好。我必须创建自己的其他模型版本,之后一切都运行正常。所以,当我将它们的旋转设置为它们的演示旋转时,我仍然不太清楚导致它们稍微移动的第一个模型出了什么问题(我没有任何 3D 建模经验)。

相关问题