SCNBezier 1.3.1

SCNBezier 1.3.1

Max Cobb 维护。



SCNBezier 1.3.1

SceneKit-Bezier-Animations

在 SceneKit 中沿着曲线路径对一个 SCNNode 进行动画处理。

Linter Status Build Status

License Platform SwiftPM Swift 5.0


安装

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 是任意值。


Bézier example