Jsd*_*ers 6 ios scenekit swift scnnode
我正在使用SceneKit并拥有一个带有多个SCNNode的应用程序,当用户点击一个时,它将跟随他们的手指(使用UILongPressGestureRecognizer).在状态开始和更改,我使用以下代码行来更改节点的位置:
_currentlyMoving?.position = SCNVector3Make(worldPoint.x, worldPoint.y, worldPoint.z)
Run Code Online (Sandbox Code Playgroud)
在这一行中,_currentlyMoving是SCNNode,而worldPoint是我手指的位置.
这是将节点移动到正确的位置; 但是,它似乎也在将节点的旋转更改为(0,0,0)(节点始终处于其起始旋转位置.)
有没有办法在不影响旋转的情况下改变SCNNode的位置?
此外,我尝试了以下但它也没有工作(同样的事情发生):
_currentlyMoving?.transform.m41 = worldPoint.x
_currentlyMoving?.transform.m42 = worldPoint.y
_currentlyMoving?.transform.m43 = worldPoint.z
Run Code Online (Sandbox Code Playgroud)
我正在对节点做的唯一其他事情是以下三行来阻止它在拾取时移动:
_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)
Run Code Online (Sandbox Code Playgroud)
因此,经过几天的测试,我发现旋转实际上从未在节点上设置过; 它只在表示节点上设置.因此,每当我设置位置时,根据我的新位置和当前旋转(它认为是[0,0,0])自动重新计算节点的变换,从而有效地重置节点的旋转.
因此,为了解决此问题,您必须将节点的旋转更改为presentationNode的旋转.
这就是我目前在panGestureRecognizer的.Began状态下所做的事情(将触摸的节点设置为currentlyMoving:
if let currentlyMoving = _currentlyMoving {
if let presentationNode = currentlyMoving.presentationNode() {
currentlyMoving.rotation = presentationNode.rotation
}
currentlyMoving.position = newLocation
}
Run Code Online (Sandbox Code Playgroud)
这只是在移动节点之前将节点的旋转设置为其显示旋转,以便根据用户可以看到的内容正确设置变换.
我遇到的一个问题是,我下载的一些模型仍然被微小的旋转奇怪,尽管我自己创建的所有模型都运行良好.我必须创建自己的其他模型版本,之后一切都运行正常.所以,当我将它们的旋转设置为它们的演示旋转时,我仍然不太清楚导致它们稍微移动的第一个模型出了什么问题(我没有任何3D建模经验).
| 归档时间: |
|
| 查看次数: |
3040 次 |
| 最近记录: |