在SceneKit中使一个物体绕另一个物体轨道运动

8

假设我在SceneKit场景中有两个节点。我想让其中一个节点围绕另一个节点旋转或者轨道运动(就像行星绕着恒星旋转一样),每隔一段时间转一圈。我知道可以通过以下方式设置动画:

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")

有没有“轨道”动画,并且有指定目标节点的方法?

1
你可以为距离设置一个SKConstraint(即,你的“卫星”被设置为与其绕行的天体保持固定距离),然后给它一个冲量。 - Steve Ives
2
这可能是你正在寻找的内容:http://stackoverflow.com/questions/34243964/follow-a-path-inverse - 0x141E
@0x141E 这正是我正在寻找的。如果您将其作为答案添加,我可以接受它。 - Brandon Slaght
1个回答

13
这可以通过使用一个额外的(辅助)SCNNode来完成。您将利用它添加自己的坐标系以及所有子节点将与该(辅助)坐标系一起移动的事实。那些偏离中心的子节点将在世界坐标系下呈轨道运动。
1. 在您的FixedPlanetNode(被绕行星)的中心位置上添加HelperNode,可能作为其子项,但肯定在同一位置。 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中并且使用动画应该完全可行。


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