SceneKit-Bezier-Animations
在 SceneKit 中沿着曲线路径对一个 SCNNode 进行动画处理。
安装
Swift 包管理者
将此存储库的 URL 添加到具有最低版本 1.3.0 的 Xcode 11
CocoaPods
将以下内容添加到您的 Podfile 中 pod 'SCNBezier'
用法
动画处理
使用本框架,您可以使用以下示例代码来在贝塞尔路径上对节点进行动画处理:
let myNode = SCNNode(geometry: SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0))
let bezPositions = [
SCNVector3(-1, 1, 0.01),
SCNVector3(1, 0.5, 0.4),
SCNVector3(1.0, -1, 0.1),
SCNVector3(0.4, -0.5, 0.01)
]
myNode.runAction(SCNAction.moveAlong(points: bezPositions, duration: 3, fps: 12))
动画将通过 duration * fps
个点来进行动画处理;这需要 Double 类型或其 TypeAlias 时间区间类型。这并不意味着它不流畅,只是意味着它会用这么多点来绘制曲线,所以在这个示例中,它将使用 36 个点沿着贝塞尔曲线进行。
获取贝塞尔曲线
如果您想要沿路径收集 n 个点来定位对象等,可以创建 SCNBézierPath 类,如下所示:
let path = SCNBezierPath(points: points)
for point in path.getNPoints(count: 20) {
let newNode = SCNNode(geometry: nodeGeometry)
newNode.position = point
parent.addChildNode(newNode)
}
在贝塞尔曲线上定位
如果您想要获得曲线上某一百分比点的位置,有一个函数可以使您轻松地做到这一点。
let path = SCNBezierPath(points: points)
let quaterWay = path.posAt(time: 0.25) // gets the point 25% along from start to end
其中点、nodeGeometry 和 parent 是任意值。