SceneKit-贝塞尔曲线动画

在 SceneKit 中沿弯曲路径动画 SCNNode。

Linter Status Build Status

License Platform SwiftPM Swift 5.0


安装

Swift Package Manager

Xcode 11 中添加此仓库的 URL,最低版本为 1.3.0

Cocoapods

将以下内容添加到您的 Podfile pod 'SCNBezier'


用法

动画

使用此框架,您可以使用以下示例代码沿贝塞尔曲线路径动画一个 Node

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 TimeInterval。这并不意味着它不会平滑,它只是意味着它将使用那么多点来创建曲线,因此在本例中它将使用贝塞尔曲线上的 36 个点。

获取贝塞尔曲线

如果您想收集路径上的 n 个点以用于定位对象等,则可以创建类 SCNBezierPath,如下所示

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

其中 points、nodeGeometry 和 parent 是任意值。


Bézier example