ios - 在不改变方向的情况下改变 SCNNode 位置

标签 ios swift scenekit scnnode

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

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

关于ios - 在不改变方向的情况下改变 SCNNode 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26168847/

相关文章:

ios - 在 iOS 中基于 Storyboard的应用程序中使用我的 View Controller

swift - 从协议(protocol)扩展实例方法中读取静态变量

Swift 字符串 lastPathComponent

ios - 当状态更改时,如何防止 SceneKit 场景重新渲染不佳?

ios - 物理对象在 SceneKit 中落入无穷大

ios - 使用约束保持两个 TableView 具有相同的高度和相同的距离

ios - 绑定(bind)到 MvvmCross 中的 UIBarButtonItem 事件

ios - 协议(protocol)要求委托(delegate)继承自 UIViewController

ios - 如何从 Swift 中删除 Parse 中的对象

IOS 我可以将 scenekit 或 spritekit 与单 View 应用程序集成吗