Apple Vision Pro の3Dキャラクターのモーション切り替え
「Apple Vision Pro」の3Dキャラクターのモーション切り替えを試したので、まとめました。
前回
1. モーションの準備
「usdz」内の1モデルに複数のモーションを登録したかったのですが、まだできなさそうだったので、モーションの数だけusdzを用意しました。
「Walking」(モデルとしても利用)と「Waving」(モーションのみ利用)の2つの「usdz」を用意して、「Reality Composer」に追加します。
2. モーションを切り替える
タップジェスチャーを追加して、タップ時にモーションを切り替えます。
(1) 「ImmersiveView.swift」の編集。
import SwiftUI
import RealityKit
import RealityKitContent
struct ImmersiveView: View {
@State private var action = 0
@State var animationResource: [AnimationResource] = []
@State var model: Entity!;
// ボディ
var body: some View {
RealityView { content in
if let scene = try? await Entity(named: "Immersive", in: realityKitContentBundle) {
content.add(scene)
// モデルの取得
let walking: Entity! = scene.findEntity(named: "Walking")
let waving: Entity! = scene.findEntity(named: "Waving")
waving.isEnabled = false
self.animationResource.append(walking.availableAnimations[0])
self.animationResource.append(waving.availableAnimations[0])
//モデルの準備
self.model = walking
// 入力ターゲットコンポーネントの追加
scene.components.set(InputTargetComponent())
// コリジョンコンポーネントの追加
var collision = CollisionComponent(shapes: [.generateSphere(radius: 0.1)])
collision.filter = CollisionFilter(group: [], mask: [])
scene.components.set(collision)
// アニメーションの開始
playAnimation(0)
}
}
// タップジェスチャー
.gesture(TapGesture().targetedToAnyEntity().onEnded { _ in
// アニメーションの切り替え
playAnimation((self.action + 1) % 2)
})
}
// アニメーションの切り替え
func playAnimation(_ action: Int) {
self.action = action
self.model.playAnimation(
self.animationResource[action].repeat(),
transitionDuration:0.5
)
}
}
#Preview {
ImmersiveView()
.previewLayout(.sizeThatFits)
}
エンティティ「Walking」「Waving」からアニメーションリソースを取得し、「Waving」のモデルは非表示にしています。
入力ターゲットコンポーネントとコリジョンコンポーネントは、タップジェスチャーに必要なため追加しています。今回のコリジョンは、半径0.1の球なので、モデルの足元(原点)をタップするとイベントが発生します。
playAnimation()のtransitionDurationでトランジションを効かせてます。
(2) 実行。
関連
この記事が気に入ったらサポートをしてみませんか?