Yuki Shimada
Yuki Shimada
Sorry, I just made an unforced error. For now, please make this issue pending or close.
議論に参加させていただきます。 私もローカル軸の情報は残した方が相互運用性と互換性(現実的な意味でどのソフトでも作り手やユーザーが望む結果になるという意味での)がむしろ高まると思います。 VRMが元々どこまでの用途を想定して作られたのかは私は定かではないのですが、今はモーキャプデータを元にリターゲットでVRMボーンにアニメーションを流し込んで(回転情報を上書きして)動かすだけではなく、プログラム制御で望む動きをさせたい(ローカル軸からの相対値変化で回転させたい)という需要もあり、そうした中でこのような徹底した正規化をされてしまうとそれができなくなってしまうと考えます。 しげぽんさんの以下の指摘については、これはMaya等のボーン自体の姿勢によらずボーンの回転の基準となる座標系をボーンごとに決められる(Mayaのジョイント方向=ローカル方向軸=Local Rotation Axis)DCCツールでなければできないと考えており、 > (完全な正規化を行うなら人体の基礎ボーンの回転値を一度0値にしボーンの向きと軸の向きを一致させた状態が正しい正規化かと思います) 例えばMayaを例に取ると、Maya上での操作として各ボーンを平行移動値だけを使って配置しジョイント方向(ローカル方向軸:Local Rotation Axis)をボーンの向きに沿うように調整することですね。 ただし、こうしたMayaなどのDCC独自のローカル方向軸の仕様はglTFレベルではそもそも存在しませんので、glTFレベルではどうなるかというと、親指などの「作り手が意図する斜めの軸」が必要なボーンについては、Mayaのジョイント方向で設定した斜め軸情報がglTFのボーンノードのTransformとして(0, 0, 0, 1)以外のrotation(クォータニオン)値に変換されるか、あるいは(0, 0, 0, 1)に完全統一される場合でもアニメーションキーフレームの回転情報の方がMaya上とは異なる(glTFで正規化されたボーンでもアニメーション結果がMaya上と一致するような)回転情報に修正されてアニメーション情報が出力されるはずです。 それを、今のVRMの正規化仕様(及びUniVRMの正規化実装)では、こうしたさすがにrotationを残さなくてはならないボーンまですべからくrotation=(0, 0, 0, 1)にリセットしてしまうのが問題なのではないでしょうか。 仮に全てのボーンを完全にrotation=(0, 0, 0, 1)にリセットしてしまうのであれば、そのボーンに対するアニメーションを作り手の想定と一致させるため、アニメーションキーフレームの回転情報を本来のローカル軸でのアニメーション結果と一致するように修正することが必要で、それにはやはりローカル軸の情報が必要となります。 現状、プログラム制御でVRMモデルを(モーキャプなどでの回転値の上書き以外の方法で)動かしたい人たちは、VRM Addonなどのボーン方向(ローカル軸)の推定機能を使ってなんとか運用しようとしてますが、これらの推定は作り手がDCCツール上で意図したボーンのローカル軸と完全には一致しません。その結果、「ソフト間で挙動が異なってしまう」「作り手の想定どおりのアニメーション結果にならない」という現実的な相互運用性・互換性の欠如につながってしまう現状があると思います。 また、今後の議論としてはDCCレベルでのローカル軸機能(ボーン姿勢とは別に回転の基準座標をボーンごとに設定できる機能)とglTFレベルでのローカル軸は概念として明確に区別して議論した方が混乱が少ないと思います。 自分の参考ツイート:...
@KaYaF How about this now?
@KaYaF What should we do about this issue now?
I see. I can wait.
Thank you @cx20 . This is very helpful!
Nice! We'll support this!
Ammo.js & Three.js Demo by lo-th san. http://lo-th.github.io/Ammo.lab/#car_terrain
@cx20 Thank you. We'll make a plan.
Current RnPromise isn't good. Because the following code has error currently: ```js await rnPromise; ``` So Promise[Rn].xxx ('Rn' is a Symbol) is more appropreate.