5

在我之前的问题中,我已经找到了如何在对象的一个​​轴上进行旋转变换,现在我希望它被动画化。

有没有办法在 RealityKit 中做到这一点?

4

2 回答 2

9

变换动画

您可以使用实例方法在 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.")
        }
    }
}

在此处输入图像描述


于 2019-12-14T16:24:04.070 回答
8

旋转动画:

复制盒子的当前变换

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)
于 2019-12-14T12:25:38.727 回答