旋转后如何在SceneKit中获取子节点的实际位置?

时间:2014-11-06 17:17:32

标签: objective-c scenekit

我正在用SceneKit开发一个场景。我有一个带有子节点的主节点:

// Main node
SCNNode* planet = [SCNNode node];
planet.geometry = [SCNSphere sphereWithRadius:2];
planet.position = SCNVector3Make(0, -3, 5);
// sub-node
SCNNode* satellite = [SCNNode node];
satellite.geometry = [SCNSphere sphereWithRadius:0.4];
satellite.position = SCNVector3Make(4, 0, 0);
[planet addChildNode:satellite];
[scene.rootNode addChildNode:planet];

我使用NSTimer来制作一些动作和一些动画。在计时器事件中,我这样做:

planetRotation + = 0.1; planet.rotation = SCNVector4Make(0,1,0,planetRotation);

但是,如果我试图获得卫星节点的位置,我总是得到相同的值。 我试图让位置节点知道卫星节点的真实位置,但没有任何变化。

当我改变父节点的旋转时,如何获得子节点的实际位置?

提前致谢

2 个答案:

答案 0 :(得分:6)

节点的位置以其父坐标系表示。就像UIKIt / AppKit中的视图一样。如果更改视图的框架,则其子视图的框架不会更改。

你想要的是我们称之为子节点的世界变换(即它在场景的根节点的坐标系中表示的变换)。

您可以查看worldTransform-convertPosition:toNode:

答案 1 :(得分:5)

由于物理原因,节点的位置不会发生变化,这就是为什么你没有看到它发生变化的原因。您需要调用节点的presentationNode来获取节点在屏幕上显示的位置:

node.presentationNode.position