vrm-c / vrm-specification

vrm specification

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[1.0] Expressions MorphTargetBind where initial morph value is not zero

0b5vr opened this issue · comments

commented

#279 の検討中に一件気になった箇所を共有します。

現状、MaterialColorBindおよびTextureTransformBindについて、初期状態に対して値を加算するという仕様になっていますが、
MorphTargetBindについても、 mesh.weights を考慮し初期状態に対して差分を加算するという仕様にするのが適切と思いました。

commented

@ousttrue ごめんなさい、揚げ足取りのようで申し訳ないのですが、本件お目通しいただけますと幸いです。

これはやりたくないです。

  • ランタイムロードはともかく、アセットロードでトラブルの元になりそうです。

  • Unity で、シーンのインスタンスではなく prefab に対して blendShape の初期値を設定してアセットして保存できるかどうかわからないことと、できたとしてもユーザーにとってシーンの変更か、アセットの変更かの区別が付きにくく、
    また、保存されるタイミングが不明瞭になるなど、アセットのライフサイクル上のトラブルを抱え込む。blender 等のインポーター・エクスポーターでも困るのではないでしょうか。

すでに0に比べて実装するのが大変になってます。

@fms-cat

要するに bake してください 🙏

commented

それはmesh.weights自体の利用を非推奨としたいという話でしょうか?

commented

@ousttrue 上記どうでしょうか?mesh.weightsについてのVRMにとっての方針を確認したいです。

私見

  • mesh.weights の存在自体をすっかり忘れていた

なので、非推奨を明示するのを怠ってしまったと言うべきかもしれません。

  • ソースを確認したところ UniGLTF では glTFMesh.weights のシリアライズはあるが、アクセスは無い(使ってない)
  • Unity の Editor の prefab のライフサイクルとの相性が悪そう(Runtime ではなく Editor の Asset)SkinnedMeshRenderer.blendShape の直接操作と BlendShapeProxy による操作が混在するので、混乱しそう(処理順によって上書きされたり)。その変更が一時的なものなのか、シーンに保存されるのか、アセットに保存されるのかの区別
  • シンプルさを損なうので反対(mesh の morphTarget をクリアするということが、すべてを 0 にするではなくなる)。

@fms-cat

VRM実装は、下層の BlendShape(MorphTarget) を BlendShape(Expression) でラップしていて、直接操作しない(他の経路で変わらない)というのが前提となっております。特に書いてないですが。

初期値の概念が難しくなるのを懸念しております。
初期値が 0 でないとすれば、 awake, start で取得する(早すぎる、遅すぎる問題、async load(SpringBoneの初期化でISSUEがあります)、 enable, disable との関連)、シーンの値か、prefabの値か、vrmに格納されている値かなどの問題。

commented

GLTFの実装方針としては難しくなりますね。
正直、実装としてはインポート時に焼き込む、もしくは対応しないという方針でも良いと思うのですが、
VRMの仕様としては他のExpressionsのBindに合わせて、初期値との差分を用いるとしたほうがクリーンかと思いました。

commented

本件、donmccurdy先生にお伺いしましたが、Animationのweightは mesh.weights を上書きするようです。なので、やはりmorphTargetBindについては0を基準とするので良さそうな気がしてきました。
一方で、 mesh.weights の意図としては、モーフにweightをデフォルトで入れたいモデルもあり得るのではないかと回答をいただきました。

参考URL:

https://discord.com/channels/685241246557667386/686304808994340865/877935212619771975
https://discord.com/channels/685241246557667386/686304808994340865/877968124278865970