在不改变方向的情况下更改SCNNode位置
问题描述:
我正在使用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,0,0])自动重新计算,从而有效地重置节点的旋转。
所以,为了解决这个问题,你必须改变节点的旋转到presentationNode的旋转。
这是我目前在做我panGestureRecognizer的.Began
状态(触摸节点设置为currentlyMoving
后:
if let currentlyMoving = _currentlyMoving {
if let presentationNode = currentlyMoving.presentationNode() {
currentlyMoving.rotation = presentationNode.rotation
}
currentlyMoving.position = newLocation
}
这只是设置节点的旋转其提交的转动而移动它,这样的变换是前
我遇到的一个问题是,我下载的一些模型仍然被微小的奇怪旋转,尽管我自己创建的所有模型都在工作好,我必须创造我自己的其他模型的版本,之后一切工作正常。所以,我仍然不知道第一个模型出了什么问题,当我将它们的旋转设置为演示旋转时(我没有任何3D建模经验),它们会稍微改变。
您的节点是否有physicBody集?如果您正在以编程方式移动它,您是否使用“运动学”机构? – Toyos 2014-10-03 20:44:56
@Toyos它确实有一个physicsBody,但它是动态的,而不是运动学的。 – Jsdodgers 2014-10-05 18:10:47
节点的变换不应该受其位置的影响,除非你有一些限制。你能分享最小的代码来重现这个问题吗? – Gusutafu 2014-10-06 02:11:37