在我之前的问题中,我已经找到了如何在对象的一个轴上进行旋转变换,现在我希望它被动画化。
有没有办法在 RealityKit 中做到这一点?
在我之前的问题中,我已经找到了如何在对象的一个轴上进行旋转变换,现在我希望它被动画化。
有没有办法在 RealityKit 中做到这一点?
您可以使用实例方法在 RealityKit 中移动、旋转和缩放模型。.move(...)
为了更快地编译,我使用了 macOS 应用程序——不过,您也可以在 iOS 应用程序中使用此代码。
import RealityKit
class ViewController: NSViewController {
@IBOutlet var arView: ARView!
let boxAnchor = try! Experience.loadBox()
override func awakeFromNib() {
boxAnchor.steelBox?.scale = [10, 10, 10]
let rotation = Transform(pitch: 0, yaw: 0, roll: .pi)
boxAnchor.steelBox?.orientation = rotation.rotation
arView.scene.anchors.append(boxAnchor)
boxAnchor.steelBox?.move(to: rotation,
relativeTo: boxAnchor.steelBox,
duration: 5.0,
timingFunction: .linear)
}
}
对于那些喜欢使用矩阵数学的人,我建议阅读这篇文章:
在 RealityKit 中更改 AnchorEntity 的旋转
对于那些喜欢使用动态的人,我给出了这篇文章的链接:
要播放在 Maya 或 Houdini 等 3D 应用程序中制作的资产动画(无论是骨骼角色动画还是一组变换动画,包括围绕网格的枢轴点旋转),请使用animationPlaybackController:
import RealityKit
class ViewController: NSViewController {
@IBOutlet var arView: ARView!
override func awakeFromNib() {
do {
let robot = try ModelEntity.load(named: "drummer")
let anchor = AnchorEntity(world: [0, -0.7, 0])
anchor.transform.rotation = simd_quatf(angle: .pi/4,
axis: [0, 1, 0])
arView.scene.anchors.append(anchor)
robot.scale = [1, 1, 1] * 0.1
anchor.children.append(robot)
robot.playAnimation(robot.availableAnimations[0].repeat(),
transitionDuration: 0.5,
startsPaused: false)
} catch {
fatalError("Cannot load USDZ asset.")
}
}
}
复制盒子的当前变换
var rotationTransform = boxAnchor.steelBox?.transform
将框设置为在 z 轴上旋转 90 度
rotationTransform?.rotation = simd_quatf(angle: .pi/2, axis: [0,0,1])
将盒子移动到新的变换超过 10 秒
boxAnchor.steelBox?.move(to: rotationTransform!, relativeTo: boxAnchor.steelBox?.parent, duration: 10, timingFunction: .easeInOut)
var translationTransform = boxAnchor.steelBox?.transform
translationTransform?.translation = SIMD3<Float>(x: 5, y: 0, z: 0)
boxAnchor.steelBox?.move(to: translationTransform!, relativeTo: boxAnchor.steelBox?.parent, duration: 10, timingFunction: .easeInOut)
var scaleTransform = boxAnchor.steelBox?.transform
scaleTransform?.scale = SIMD3<Float>(x: 1, y: 1, z: 1)
boxAnchor.steelBox?.move(to: scaleTransform!, relativeTo: boxAnchor.steelBox?.parent, duration: 10, timingFunction: .easeInOut)