2014-10-02 124 views
5

我正在使用SceneKit并且有多个SCNNodes的应用程序,当用户点击一个时,它将按照他们的手指(使用UILongPressGestureRecognizer)。在国家开始和改变,我使用下面的代码行更改节点的位置:在不改变方向的情况下更改SCNNode位置

_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

您的节点是否有physicBody集?如果您正在以编程方式移动它,您是否使用“运动学”机构? – Toyos 2014-10-03 20:44:56

+0

@Toyos它确实有一个physicsBody,但它是动态的,而不是运动学的。 – Jsdodgers 2014-10-05 18:10:47

+0

节点的变换不应该受其位置的影响,除非你有一些限制。你能分享最小的代码来重现这个问题吗? – Gusutafu 2014-10-06 02:11:37

回答

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建模经验),它们会稍微改变。

相关问题