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

10

我正在使用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);

但是如果我尝试获取卫星节点的位置,我总是得到相同的值。我尝试通过获取positionnode来知道卫星节点的真实位置,但是什么也没有改变。

当我更改父节点的旋转时,如何获取子节点的真实位置?

提前感谢您的帮助。

2个回答

8

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

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

您可以查看worldTransform-convertPosition:toNode:


1
这个答案是正确的,不过我倾向于使用“node.worldPosition”。它可以立即给出节点在世界坐标系中的位置。非常简单。“确定接收器相对于场景根节点的世界空间位置。”可能在回答时还没有这个选项... - zumzum

7

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

node.presentationNode.position

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接