✈️

【visionOS】Blender から Reality Composer Pro にモデルを書き出す

2024/12/04に公開

初めに

今回は3Dモデルを Blender から Reality Composer Pro に書き出す手順についてまとめていきたいと思います。実際に書き出したモデルを表示するところまで実装していきます。

記事の対象者

  • Apple Vision Pro などで Blender のモデルを扱いたい方
  • 3Dモデルの基本的な表示方法が知りたい方

目的

今回は先述の通り、3Dモデルを Blender から Reality Composer Pro に書き出して使用できるようになることを目的としています。

実は以下の記事で Blender からモデルを書き出す方法についてはまとめています。
ただ、今回は別の方法で書き出して使用できるようにします。

https://zenn.dev/koichi_51/articles/c2766f3728c3d6

実装

実装は以下の手順で進めていきます。

  1. Blender からモデルの書き出し
  2. Reality Composer Pro への取り込み
  3. モデルの配置

1. Blender からモデルの書き出し

まずは、Apple Vision Pro のアプリ内で使用したいモデルを含む Blender のプロジェクトを開きます。今回は以前の記事と同様の以下のモデルをエクスポートしていきます。
ただ、前回とは異なる点が以下の二点です。

  1. UDSC 形式でエクスポートする
  2. アニメーションも含めてエクスポートする

プロジェクトを開いたら、 File > Export > Universal Scene Descrition(.usd*) を選択します。

すると以下のようなウィンドウが開きます。
ここでエクスポートの設定をすることができます。
いくつかよく使用する設定について述べておきます。

  • General > Include > Selection Only
    選択されているオブジェクトのみをエクスポート対象にする
    複数のオブジェクトが同じプロジェクトに含まれており、そのうちの一つだけをエクスポートしたい際などに使用します。

  • General > Include > Visible Only
    Blender では command + h で選択したオブジェクトを隠すことができるようになっています。この設定をONにすると隠されていないオブジェクトのみがエクスポート対象になります。
    逆に、エクスポートしたはずのオブジェクトが確認できない場合は意図せず隠された状態になっていることがあるため、この項目の確認が必要です。

  • General > Include > Animation
    この設定をONにしておくことでアニメーションを含めた状態でモデルをエクスポートできます。
    エクスポートする形式によってアニメーションを含められないものもあるため、注意が必要です。

  • Materials > Export Textures
    この項目にチェックを入れることで、モデルで使用されているテクスチャを一緒にエクスポートすることができるようになります。ただ、この項目にチェックを入れてもエクスポートされないテクスチャもあるため、エクスポートできるものを選択して使用するか、Reality Composer Pro の方で新たにテクスチャを作成する必要があります。


設定が完了したら「Export USD」を選択して書き出しは完了です。

2. Reality Composer Pro への取り込み

次に、エクスポートしたモデルを Reality Composer Pro への取り込んでいきます。

まずはモデルを使用したいアプリケーションの Reality Composer Pro のプロジェクトを開きます。Xcode から開く場合は、プロジェクトを開いて、上部バーの Xcode > Open Developer Tool > Reality Composer Pro を選択することで開くことができます。

Reality Composer Pro を開いたら、以下のようにモデルをドラッグ&ドロップすれば完了です。

なお、モデルを取り込んだ際に以下の画像のようにモデルの一部がピンク色になることがあります。
これはこの部分のマテリアルが見つからない際に起こります。

ピンク色になっているモデルを選択して、「Material Bindings」の Binding にマテリアルを割り当てれば解消できます。

割り当てると以下のように見た目が治ることがわかります。
ここで割り当てるマテリアルがない場合は Reality Composer Pro で作成するなどの対処が必要かと思います。

また、アニメーションが正常にエクスポートできている場合は再生ボタンを押すことでアニメーションを再生することができます。

これでモデルの読み込みは完了です。

3. モデルの配置

次にモデルの配置を行なっていきます。
まずは以下のようなコードで実行してみます。

import SwiftUI
import RealityKit
import RealityKitContent

struct AirplaneView: View {
    @State private var worldEntity: Entity = Entity()
    @State private var airplaneEntity: Entity?
    var body: some View {
        RealityView { content in
            do {
                let model = try await Entity(named: "airplane", in: realityKitContentBundle)
                model.transform.scale = SIMD3<Float>(0.1, 0.1, 0.1)
                model.position = SIMD3<Float>(0, 1.0, -1.5)
                let animation = model.availableAnimations[0]
                model.playAnimation(animation.repeat())
                
                worldEntity.addChild(model)
                content.add(worldEntity)
            } catch {
                print("Error loading model: \(error)")
            }
        }
    }
}

実行すると、以下のようなエラーになるケースがあります。

Tool terminated by signal 'Segmentation fault: 11'

このエラーの解消法は以下のリンクにありました。
https://forums.developer.apple.com/forums/thread/760614

再度 Reality Composer Pro に取り込んだモデルを見てみると以下のように「env_light」というモデルが含まれていることがわかります。

この「env_light」があるとエラーになるようなので、削除して再度ビルドしてみます。
すると以下の動画のようにアニメーションがループして再生されるかと思います。

https://youtu.be/UcVGCEoNe5c

まとめ

最後まで読んでいただいてありがとうございました。

以前は別の形式でエクスポートしたものを Reality Converter で変換して、それを読み込む形で実装していました。しかし、USD形式であればそのまま Xcode のプロジェクトに取り込むことができるためかなり短縮になるかと思います。

誤っている点やもっと良い書き方があればご指摘いただければ幸いです。

参考

https://forums.developer.apple.com/forums/thread/760614

Discussion