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の人は、まぁ頑張れ…。とはいえ他にも方法はあるので、記事の最後に書いておく(でもアニメーションができる様子は確認できていない。)。
Reality ConverterはCatalinaからしか使えないのだが、私は諸般の事情で未だにMojaveを使っているためにReality Converterを使用する権利がないので、usdzconvertを使うことにする。
上記リンクからUSDZツールを選択、USDPython0.64.zipをダウンロード(要Developerアカウント)。
解凍するとpkgが出てくるのでインストール。デフォルトだとApplicationsにusdpythonというディレクトリができるはず。
usdpythonの中のUSD.commandを実行するとusdzconvertを使うための諸々のパスを通してくれる。
なんか他にも手順とかハマりポイントがあったような気がしなくもないが、忘れた。
モデルの制限
- テクスチャは2048x2048まで
- アニメーションは10秒まで
- 10万ポリゴンまで
とのこと
モデルを作る
とりあえず簡単にたぬき棒を作った。モデリングに関してそんなに注意する点はないかと思う、複雑なことをしてないから分からない。あんまり複雑なことをしないように。 テクスチャは貼り付けたらFile -> External Data -> Pack Resourcesでテクスチャをパックしておく、念のため。
ボーンを入れる
巷のチュートリアル同様にボーンを入れる。特に追加で言うことはない。
モーションを作る
ここで一点ハマりポイント、自分はこれで時間を溶かした。 例えばRotationしか使わないからといってRotationしかキーフレームを打たないでいると、usdzにした時にモデルがハチャメチャに崩れる。全ボーンにRotationだけでなくLocationのキーフレームも最初に打っておくこと。Aで全ボーン選択-> I -> Location, Rotation & Scale打っとくのがよい。 それだけ注意しておいてあとはフツーに打つ。 打ち終わったらNLAエディタを開いて、画像のArmatureActionって書いてあるとこの右のアイコンを押してアクションをストリップにする。
書き出し・変換
usdzconvertはgltfをusdzに変換してくれるものなので、まずはgltf(またはglb)を書き出す。
書き出し設定はほとんどデフォルトで多分よくて、AnimationのところのGroup by NLA Trackはチェックを入れるのだが、なんかあえて入れてない人もいたりしてよく分からん、自分のやり方だと入れないとアニメーションしなかった。調べときます。
書き出したgltfをusdzconvertに投げる。ターミナルで
usdzconvert -metersPerUnit 1 <読み込ませたいファイル.glb>
を入力。-metersPerUnitはスケールに関する設定で、正直まだどの値が正しい設定なのか調べきれてなくて分からないのだが、1にしとくとなんとなくAR表示させた時にblenderのスケールと合ってる気がする。
表示
あとは記事の最初で述べたようにaタグでリンクを貼って開くとAR Quick Lookが開く。
検証用にタヌキ棒作ったねん pic.twitter.com/zJZAp47d4w
— ピアノ男 (@pianoid) 2022年2月4日
オクルージョン処理も勝手にいい感じにやってくれる。iPhoneSE2で撮影してこれなので、LiDARがついてる機種だともっといい感じにオクルージョン処理やってくれたりするんだろうか?ついでに爪かわいい💕
わからん
このプレビュー画面てきなやつ?がオブジェクトでデカデカと埋め尽くされるんだけどなんで?単にモデルのスケールがでかいから?
マカー以外向け
マカー以外の人のために書いておくと、これ以外の手法は、Blender用のusdz import/exportアドオンやusd_from_gltf、Unityを使う方法などがある。
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を使う方法
試してないのでわからない
おわりに
usdzもfbxもそうだけどハマりどころが多すぎる、なんかもうちょっといい感じにしてくれーい