2015-05-01 89 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其他旋转。

我不得不承认我仍然非常困惑,至于什么是旋转方法,但很高兴我有一些我现在可以使用的东西。