【问题标题】:How to get the real position of a sub node in SceneKit after rotation?旋转后如何获取SceneKit中子节点的真实位置?
【发布时间】:2015-01-03 07:30:18
【问题描述】:

我正在使用 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 来制作一些动作和一些动画。在计时器事件中,我这样做:

行星旋转 += 0.1; planet.rotation = SCNVector4Make(0,1,0, planetRotation);

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

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

提前致谢

【问题讨论】:

    标签: objective-c scenekit


    【解决方案1】:

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

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

    你可以看看worldTransform-convertPosition:toNode:

    【讨论】:

    • 这个答案是正确的,但是,我倾向于使用“node.worldPosition”。立即给我节点在世界坐标中的位置。很容易。 “确定接收器在世界空间中的位置(相对于场景的根节点)。”在给出答案时它可能不可用......
    【解决方案2】:

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

    node.presentationNode.position
    

    【讨论】:

      猜你喜欢
      • 2018-11-01
      • 2018-12-17
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 2015-09-17
      • 2015-07-10
      • 2018-02-28
      • 1970-01-01
      相关资源
      最近更新 更多