[1.0] Expressions MorphTargetBind where initial morph value is not zero
0b5vr opened this issue · comments
#279 の検討中に一件気になった箇所を共有します。
現状、MaterialColorBindおよびTextureTransformBindについて、初期状態に対して値を加算するという仕様になっていますが、
MorphTargetBindについても、 mesh.weights
を考慮し初期状態に対して差分を加算するという仕様にするのが適切と思いました。
これはやりたくないです。
-
ランタイムロードはともかく、アセットロードでトラブルの元になりそうです。
-
Unity で、シーンのインスタンスではなく prefab に対して blendShape の初期値を設定してアセットして保存できるかどうかわからないことと、できたとしてもユーザーにとってシーンの変更か、アセットの変更かの区別が付きにくく、
また、保存されるタイミングが不明瞭になるなど、アセットのライフサイクル上のトラブルを抱え込む。blender 等のインポーター・エクスポーターでも困るのではないでしょうか。
すでに0に比べて実装するのが大変になってます。
要するに bake してください 🙏
それはmesh.weights自体の利用を非推奨としたいという話でしょうか?
私見
mesh.weights
の存在自体をすっかり忘れていた
なので、非推奨を明示するのを怠ってしまったと言うべきかもしれません。
- ソースを確認したところ UniGLTF では
glTFMesh.weights
のシリアライズはあるが、アクセスは無い(使ってない) - Unity の Editor の prefab のライフサイクルとの相性が悪そう(Runtime ではなく Editor の Asset)SkinnedMeshRenderer.blendShape の直接操作と BlendShapeProxy による操作が混在するので、混乱しそう(処理順によって上書きされたり)。その変更が一時的なものなのか、シーンに保存されるのか、アセットに保存されるのかの区別
- シンプルさを損なうので反対(mesh の morphTarget をクリアするということが、すべてを 0 にするではなくなる)。
VRM実装は、下層の BlendShape(MorphTarget) を BlendShape(Expression) でラップしていて、直接操作しない(他の経路で変わらない)というのが前提となっております。特に書いてないですが。
初期値の概念が難しくなるのを懸念しております。
初期値が 0 でないとすれば、 awake
, start
で取得する(早すぎる、遅すぎる問題、async load(SpringBoneの初期化でISSUEがあります)、 enable, disable との関連)、シーンの値か、prefabの値か、vrmに格納されている値かなどの問題。
GLTFの実装方針としては難しくなりますね。
正直、実装としてはインポート時に焼き込む、もしくは対応しないという方針でも良いと思うのですが、
VRMの仕様としては他のExpressionsのBindに合わせて、初期値との差分を用いるとしたほうがクリーンかと思いました。
本件、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