在 SceneKit 中使一个对象绕另一个对象运行
Make an object orbit another in 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")
是否有"orbiting"的动画,以及指定目标节点的方法?
做到这一点的方法是使用一个额外的(助手)SCNNode。您将使用这样一个事实,即它添加了自己的坐标系,并且它的所有子节点都将与该(辅助)坐标系一起移动。如果您从世界坐标系查看它们,则偏离中心的子节点将有效地绕轨道运行。
您将 HelperNode 添加到 FixedPlanetNode(轨道行星)的 centre,也许作为它的子节点,但肯定在同一个位置
您将 OrbitingPlanetNode 作为 child 添加到 HelperNode,但具有 offset 在其中一个轴上,例如X轴上10个点
您启动 HelperNode 围绕 不同 轴旋转(与其坐标系一起),例如Y轴
这将导致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];
我使用动作和 objective-c 因为这是我熟悉的,但在 Swift 和动画中应该是完全可行的。
假设我的 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")
是否有"orbiting"的动画,以及指定目标节点的方法?
做到这一点的方法是使用一个额外的(助手)SCNNode。您将使用这样一个事实,即它添加了自己的坐标系,并且它的所有子节点都将与该(辅助)坐标系一起移动。如果您从世界坐标系查看它们,则偏离中心的子节点将有效地绕轨道运行。
您将 HelperNode 添加到 FixedPlanetNode(轨道行星)的 centre,也许作为它的子节点,但肯定在同一个位置
您将 OrbitingPlanetNode 作为 child 添加到 HelperNode,但具有 offset 在其中一个轴上,例如X轴上10个点
您启动 HelperNode 围绕 不同 轴旋转(与其坐标系一起),例如Y轴
这将导致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];
我使用动作和 objective-c 因为这是我熟悉的,但在 Swift 和动画中应该是完全可行的。