2014-10-02 91 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建模經驗),它們會稍微改變。

相關問題