ios - 在 SceneKit 中使一个对象绕另一个对象运行

标签 ios sprite-kit scenekit

假设我的 SceneKit 场景中有 2 个节点。我想让一个绕着或绕轨道旋转(就像行星绕着恒星旋转),另一个节点在一定的时间间隔内旋转一次。我知道我可以像这样设置动画:

let anim = CABasicAnimation(keyPath: "rotation")
anim.fromValue = NSValue(scnVector4: SCNVector4(x: 0, y: 1, z: 0, w: 0))
anim.toValue = NSValue(scnVector4: SCNVector4(x: 0, y: 1, z: 0, w: Float(2 * Double.pi)))
anim.duration = 60     
anim.repeatCount = .infinity
parentNode.addAnimation(aim, forKey: "spin around")

有没有“绕行”的动画,以及指定目标节点的方法?

最佳答案

做到这一点的方法是使用一个额外的(助手)SCNNode。您将使用这样一个事实,即它添加了自己的坐标系,并且它的所有子节点都将与该(辅助)坐标系一起移动。如果您从世界坐标系中查看,偏离中心的子节点将有效地绕轨道运行。

  1. 您将 HelperNode 添加到您的 FixedPlanetNode(绕行行星)的中心,也许作为它的子节点,但肯定在相同的位置

  2. 您将 OrbitingPlanetNode 作为 子节点 添加到 HelperNode,但在其中一个轴上有一个偏移,例如X轴上10个点

  3. 您启动HelperNode 围绕不同 轴旋转(与其坐标系一起),例如Y轴

  4. 这将导致 OrbitingPlanetNode 围绕 HelperNode 的 Y 轴运行,轨道半径为 10 个点。

例子

earthNode - 固定轨道行星

moonNode - 绕行行星

helperNode - 添加辅助节点以提供坐标系统

// assuming all planet geometry is at the centre of corresponding nodes
// also helperNode.position is set to (0, 0, 0)
[earthNode addChildNode:helperNode];
moonNode.position = SCNVector3Make(10, 0, 0);
[helperNode addChildNode:moonNode];

// set helperNode to rotate forever
SCNAction * rotation = [SCNAction rotateByX:0 y:3 z:0];
SCNAction * infiniteRotation = [SCNAction repeatActionForever:rotation];
[helperNode runAction:infiniteRotation];

我使用了 actions 和 objective-c,因为这是我所熟悉的,但在 Swift 和动画中应该是完全可行的。

关于ios - 在 SceneKit 中使一个对象绕另一个对象运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43073698/

相关文章:

ios - Endless Runner 重新定位播放器,无论纵横比如何,难度均等

macos - SceneKit 从动画 SCNNode 中获取当前 SCNNode 位置

ios - 我多次尝试都收到错误。存档验证因错误而失败

ios - Sprite Kit - 隐藏 SKSpriteNode

ios - Uber API 沙箱请求状态未正确更新

swift - 使节点以相同的速度从不同的起点移动到终点

ios - Swift:关于 presentScene() 的安全实践

swift - SceneKit Swift - 使用文件中的 HDR 环境光照贴图

ios - 为什么我的正则表达式中存在多个捕获组会使我的应用程序崩溃?

ios - iTunesConnect 是否使用最近的翻译?