VRM ビューワーを作った

@pixiv/three-vrm を使って VRM を個人サイトに表示し、VRMA でアニメーションもできるビューワーを作って公開した。

https://gitlab.com/k1350/vrm-viewer

これが作ったものである。

私は 3D については過去に Unity で浮体の動的解析結果を描画するソフトを作ったくらいの知識しかなく、three.js と VRM については初心者だったので、色々参考にした。

下記が参考にした公式ドキュメントや記事である。

やっていて詰まった点は主に VRM のバージョン関連であった。
VRM はバージョン 0.0 から 1.0 になるときに Z 軸方向が逆になっている。

https://github.com/pixiv/three-vrm/blob/dev/docs/migration-guide-1.0.md

に書いてある通り VRMUtils.rotateVRM0 を呼んでおかないと、モデルが後ろを向いた状態で空間に降り立ってしまう。

また上記を入れたとしても、たとえばデフォルトの T 字ポーズから腕を下げようとして Z 軸周りの回転を加えると、VRM 0.0 と 1.0 では回転方向が逆になる。
少なくとも VRoid Studio で出力したモデルは vrm.meta.metaVersion にバージョン情報が入っているので、これを元にして制御した。

VRMA でのアニメーションは VRM 0.0 でも 1.0 でも問題なく読み込めるのだが、VRMA 自体に制御が入っているのか、Z 軸方向に関係なく動かせるように指定することができるのかはよくわかっていない。

それ以外には様々なリソースの破棄について

https://threejs.org/docs/#manual/ja/introduction/How-to-dispose-of-objects

のように個別に破棄しなければならないのが難しかった。

幸い three-vrm には deepDispose という関数があって、マテリアルとかジオメトリとか持ってそうなやつは deepDispose を使えばよさそうであった。

https://github.com/pixiv/three-vrm/blob/bb924d4869b4afdbf2f3e918637d96192f8f7a79/packages/three-vrm/src/VRMUtils/deepDispose.ts

ただ、正直未だにきちんと全てが破棄できているかは自信が無い。


もともと Unity で 3D をやっていた当時は平面を繋げて波面を作るというようなことをしていて、単に市販のモデルを配置するというよりも詳しく扱っていたと思うので、マテリアルだとかテクスチャだとか、そういうものへの理解は役だったと思う。

以上