Tim*_*tch 7 ios scenekit sprite-kit
假设我的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")
Run Code Online (Sandbox Code Playgroud)
是否有用于"轨道运行"的动画,以及指定目标节点的方法?
Sul*_*vus 10
这样做的方法是使用一个额外的(辅助)SCNNode.您将使用它添加自己的坐标系统并且其所有子节点将与该(辅助)坐标系统一起移动的事实.如果您从世界坐标系中查看它们,那么偏离中心的子节点将有效地绕轨道运行.
您添加HelperNode在中心的FixedPlanetNode(运行轨道的行星)的在相同的位置,也许它的孩子,但绝对
您将OrbitingPlanetNode作为子项添加到HelperNode,但在其中一个轴上有一个偏移,例如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];
Run Code Online (Sandbox Code Playgroud)
我使用了动作和目标-c,因为这是我熟悉的,但在Swift和动画中应该是完全可行的.