2015-05-01 88 views
3

我在努力理解節點的多次旋轉。在SceneKit中旋轉節點

首先,我創建和定位的平面:

SCNPlane *plane = [SCNPlane planeWithWidth:10 height:10]; 
SCNNode *planeNode = [SCNNode nodeWithGeometry:plane]; 
planeNode.rotation = SCNVector4Make(1, 0, 0, (M_PI/2 * 3)); 
[scene.rootNode addChildNode:planeNode]; 

然後我定位並設置一個聚光燈節點的方向上該平面:

SCNLight *light = [[SCNLight alloc] init]; 
light.type = SCNLightTypeSpot; 
light.spotInnerAngle = 70; 
light.spotOuterAngle = 100; 
light.castsShadow = YES; 
lightNode = [SCNNode node]; 
lightNode.light = light; 
lightNode.position = SCNVector3Make(4, 0, 0.5); 
lightNode.rotation = SCNVector4Make(0, 1, 0, M_PI/2); 
[planeNode addChildNode:lightNode]; 

然後我動畫的光的旋轉圍繞x軸順時針旋轉90度:

[SCNTransaction begin]; 
[SCNTransaction setAnimationDuration:2.0]; 

lightNode.rotation = SCNVector4Make(1, 0, 0, M_PI/2); 

[SCNTransaction commit]; 

但我很困惑,爲什麼以下翼旋轉光節點回繞同一軸線原來的位置:

[SCNTransaction begin]; 
[SCNTransaction setAnimationDuration:2.0]; 

lightNode.rotation = SCNVector4Make(0, 1, 0, M_PI/2); 

[SCNTransaction commit]; 

對我來說這讀取,我們旋轉節點順時針y軸90度。

任何人都可以解釋爲什麼這個工程?或者,更好的是,建議一個更清晰的方法來旋轉節點,然後將其返回到原來的位置?

回答

3

我不確定是否完全理解了這個問題,但是當您編寫lightNode.rotation = SCNVector4Make(0, 1, 0, M_PI/2);時,您並未連接節點當前旋轉的旋轉。你正在指定一個新的「絕對」旋轉。

由於SCNVector4Make(0, 1, 0, M_PI/2)lightNode的原始旋轉,設置SCNVector4Make(0, 1, 0, M_PI/2)再次會使節點回到其原始狀態。

EDIT

下面的代碼做兩件事情

  1. 第一它爲節點的旋轉的初始值
  2. 然後它規定了節點的旋轉的新的值。因爲它是在一個事務中完成的(其持續時間不是0),那麼SceneKit將爲該更改添加動畫。但是SceneKit選擇了包括旋轉軸在內的動畫的參數。

    lightNode.rotation = SCNVector4Make(0, 1, 0, M_PI/2); 
    
    [SCNTransaction begin]; 
    [SCNTransaction setAnimationDuration:2.0]; 
    lightNode.rotation = SCNVector4Make(1, 0, 0, M_PI/2); 
    [SCNTransaction commit]; 
    

這對position屬性相同。 以下代碼將節點的位置從(1,0,1)設置爲(2,3,4),而不是從(1,1,1)設置爲(3,3,5)

aNode.position = SCNVector3Make(1, 0, 1); 

    [SCNTransaction begin]; 
    [SCNTransaction setAnimationDuration:2.0]; 
    aNode.position = SCNVector3Make(2, 3, 4); 
    [SCNTransaction commit]; 

它要設置動畫的節點,並且希望能夠控制動畫參數,你可以使用一個CABasicAnimationbyValue

+0

感謝您的回覆,雖然我覺得我現在比以前更困惑:(我根本不知道什麼是絕對旋轉與我在此嘗試做的比較(只需旋轉光節點我想我的問題基本上是這樣的:我怎樣才能以一種方式旋轉一個節點,然後返回到原來的位置,這兩個時間都是與同一個軸相關的?如果我做了什麼導致了絕對的輪換(我猜測是錯誤的),是否有另一種方法可以用來實現我的目標? – bcl

+0

我編輯了我的答案。 – mnuages

+0

再次感謝您的回覆。不知道這是我所追求的。因爲我不希望SceneKit爲我的動畫選擇旋轉軸;我需要在給定方向上進行非常具體的運動。它看起來像我eulerAngles給了我這個級別的控制加上它不會混淆m e通過切換我需要使用的旋轉軸。 – bcl

6

我想我已經通過使用eulerAngles解決了這個問題,這似乎以我理解的方式工作。

所以我代替:

lightNode.rotation = SCNVector4Make(0, 1, 0, M_PI/2); 

有了:

lightNode.eulerAngles = SCNVector3Make(0, M_PI/2, 0); 

27:11其他旋轉。

我不得不承認我仍然非常困惑,至於什麼是旋轉方法,但很高興我有一些我現在可以使用的東西。