おたくのテクノ

ピアノ男(notピアノ弾き)のブログ

blenderでアニメーション付きusdzを作る時のメモ

usdzがまたまだ未整備なんかなんなのか知らんけど、静止モデルをusdzにする分には楽なのだがアニメーション入りになると結構つまづきポイント多くて時間溶けまくったので、今後時間溶かさないためにメモ💦

usdzとは?

AR向けの3Dモデルのファイルフォーマットで、iOS12以上なら

<a href="model.usdz" rel="ar">
model
</a>

みたいな感じでaタグのrel属性にarを指定してリンク貼っておくと、開いた時にAR Quick Lookなる機能でお手軽に3DモデルをAR表示できる。

変換ツールの準備

まず、usdzに変換するにあたり、いくつか方法がある。複数試したが結論から言うとReality ConverterかUSDZツールのusdzconvertを使うのがよい、どちらもAppleのページから手に入る。usdzに変換する仕組みはどちらも同じな気がする。そして残念だがどちらもMac向けだ…。他のOSの人は、まぁ頑張れ…。とはいえ他にも方法はあるので、記事の最後に書いておく(でもアニメーションができる様子は確認できていない。)。

developer.apple.com

Reality ConverterはCatalinaからしか使えないのだが、私は諸般の事情で未だにMojaveを使っているためにReality Converterを使用する権利がないので、usdzconvertを使うことにする。
上記リンクからUSDZツールを選択、USDPython0.64.zipをダウンロード(要Developerアカウント)。
解凍するとpkgが出てくるのでインストール。デフォルトだとApplicationsにusdpythonというディレクトリができるはず。
usdpythonの中のUSD.commandを実行するとusdzconvertを使うための諸々のパスを通してくれる。
なんか他にも手順とかハマりポイントがあったような気がしなくもないが、忘れた。

モデルの制限

  • テクスチャは2048x2048まで
  • アニメーションは10秒まで
  • 10万ポリゴンまで
    とのこと

モデルを作る

f:id:oldskoolrave:20220204214537p:plain
tanuki
とりあえず簡単にたぬき棒を作った。モデリングに関してそんなに注意する点はないかと思う、複雑なことをしてないから分からない。あんまり複雑なことをしないように。 テクスチャは貼り付けたらFile -> External Data -> Pack Resourcesでテクスチャをパックしておく、念のため。

ボーンを入れる

f:id:oldskoolrave:20220204214949p:plain
bone
巷のチュートリアル同様にボーンを入れる。特に追加で言うことはない。

モーションを作る

ここで一点ハマりポイント、自分はこれで時間を溶かした。

f:id:oldskoolrave:20220204215136p:plain
最初に全部キーフレーム入れとこう
例えばRotationしか使わないからといってRotationしかキーフレームを打たないでいると、usdzにした時にモデルがハチャメチャに崩れる。全ボーンにRotationだけでなくLocationのキーフレームも最初に打っておくこと。Aで全ボーン選択-> I -> Location, Rotation & Scale打っとくのがよい。
f:id:oldskoolrave:20220204215452p:plain
たぬきアニメ
それだけ注意しておいてあとはフツーに打つ。
f:id:oldskoolrave:20220204215522p:plain
NLAエディタでストリップにしよう
打ち終わったらNLAエディタを開いて、画像のArmatureActionって書いてあるとこの右のアイコンを押してアクションをストリップにする。 f:id:oldskoolrave:20220204220016p:plain

書き出し・変換

usdzconvertはgltfをusdzに変換してくれるものなので、まずはgltf(またはglb)を書き出す。
書き出し設定はほとんどデフォルトで多分よくて、AnimationのところのGroup by NLA Trackはチェックを入れるのだが、なんかあえて入れてない人もいたりしてよく分からん、自分のやり方だと入れないとアニメーションしなかった。調べときます。
f:id:oldskoolrave:20220204222607p:plain

書き出したgltfをusdzconvertに投げる。ターミナルで
usdzconvert -metersPerUnit 1 <読み込ませたいファイル.glb>
を入力。-metersPerUnitはスケールに関する設定で、正直まだどの値が正しい設定なのか調べきれてなくて分からないのだが、1にしとくとなんとなくAR表示させた時にblenderのスケールと合ってる気がする。

表示

あとは記事の最初で述べたようにaタグでリンクを貼って開くとAR Quick Lookが開く。

f:id:oldskoolrave:20220204223140j:plain
ARたぬき棒
オクルージョン処理も勝手にいい感じにやってくれる。iPhoneSE2で撮影してこれなので、LiDARがついてる機種だともっといい感じにオクルージョン処理やってくれたりするんだろうか?ついでに爪かわいい💕 f:id:oldskoolrave:20220204223200j:plain

わからん

このプレビュー画面てきなやつ?がオブジェクトでデカデカと埋め尽くされるんだけどなんで?単にモデルのスケールがでかいから? f:id:oldskoolrave:20220204223518p:plain

マカー以外向け

マカー以外の人のために書いておくと、これ以外の手法は、Blender用のusdz import/exportアドオンusd_from_gltfUnityを使う方法などがある。

Blender用アドオン

github.com 静止モデルを書き出す程度ならこれでよさげだが、アニメーションになるとダメだった。

usd_from_gltf

github.com ビルドするのにそもそも結構つまづきポイントが多すぎる。修正しないとビルドできない箇所もいくつかある。
覚えてる範囲でのつまづきポイントを書くと、

  • 2020/06/09のバージョン(コミットハッシュ: 6d288cce8b68744494a226574ae1d7ba6a9c46eb)を使うならUSDはv20.05あたりを使わないと足りないライブラリがあるっぽくてビルド通らない。

  • usd_from_gltf/convert内のconverter.ccとmaterializer.cc内のConnectToSource()の第1引数は全てConnectToSource(pbr_shader.ConnectableAPI(), pbr_shader_path)のように変数の後ろに.ConnectableAPI()をつけるよう書き換えないといけない( https://developer.blender.org/T90842 参考にした)

  • python2.7

  • PySide2, PyOpenGL, jinja2をあたりを入れないといけなかった気がする

他にも色々やった気がするが、こんだけやってもMacではビルドがまだ通ってない、ld: dylib /opt/local/USD/lib/libGLEW.dylib missing LC_ID_DYLIB load command file '/opt/local/USD/lib/libGLEW.dylib' for architecture x86_64とか言われてる。
Ubuntu18.04ではなんとかビルド通った。でも前述の通りアニメーションを含んでくれない、何かオプション指定要るのだろうか?

Unityを使う方法

qiita.com

試してないのでわからない

おわりに

usdzもfbxもそうだけどハマりどころが多すぎる、なんかもうちょっといい感じにしてくれーい