視点コントロール用ボーンの回転をRoll constraintがコピーできない / Roll Constraint Cannot Copy Rotation of Viewpoint Control Bone
環境情報
- UniVRM version:
0.128.~2 - Unity version:
Unity-2022.3.22.f1 - OS:
Windows 11
バグについて
今回報告する事例では、VRM1.0の視点コントロール用ボーンの回転に対し、補助ボーンのRoll constraintがコピーできていないようです。
下のBlender画像では。「Eye_L」がHumanoidに登録された左目制御用ボーンで、その奥のボーンがX軸で制限をかけたコンストレイント用補助ボーンです。これで、上まぶたの動きを上下方向に制限しています。
次の図はThree.jsで動く「VRMお手軽ポーズ」とUniVRMで動く「VRM Posing Desktop」において、視線を下に向けた時のまぶたの挙動の比較です。UnityでのSceneビューは、「VRM Posing Desktop」と同じ結果になります。
ロールコンストレイントボーンのウエイトは、上まぶたにのせているので、期待する挙動は、「VRMお手軽ポーズ」が示していますが、UniVRM で動く、「VRM Posing Desktop」や「cluster」では、コンストレイントが機能していないように見えます。 そもそも、視点制御用ボーンの回転情報はコピーできない仕様なのでしょうか? もし、回避方法があればご教示いただければ幸いです。
必要であれば、画像で使ったVRMファイルをお送りします。
宜しくお願いします。
書いてあるだけでは、なんとも言えない感じです。 問題を再現できる必要があります。 モデルだけでなく、シーンと手順が全体的に分かることが必要です。 VRM、シーン、もしくは両方の組み合わせに原因があるかもしれません。
単純なシーンでは問題が無いようです。
- Alicia 配置
- Alicia root に cube を追加し rollconstraint を追加。eye_L を参照
- world に独立した sphere を配置。lookat target にこれを指定
- play
sphere を動かす。cube 連動する
言い忘れましたが、Unityのシーンビューでは、私が提示したアバターであっても、正しくロールコンストレイントは機能しました。さらに、過去バージョンのv0.115.0でも、正常に機能しました。ただし、その間のバージョンは未確認です。 コンストレイントが機能しないUniVRMを利用したアプリは、私が確認したもので、cluster、VRM Posing Desktop,VPic.です。 アプリ側で、古いバージョンのどれかが、原因になってる可能性も否定できないので、そちらの開発者様にうかがってみます
update か lateUpdate 経由で Vrm10Runtime.Process が呼び出されます。 なんらか順番問題が発生しているかもしれません。
https://github.com/vrm-c/UniVRM/blob/master/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs#L201
https://github.com/vrm-c/UniVRM/blob/master/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs#L95
vrm-1.0 の中での処理順は
/// * Update from VrmAnimation
/// * Constraint
/// * Spring
/// * LookAt
/// * Expression
Constraint が動作するときは前のフレームの LookAt の結果を利用することになりそうです。 このとき EyeBone の回転がクリアされているとうまくいかなそうです。 もし、そういう挙動をするコンポーネントがあるならば、 Constraint を後ろに移動するなどライブラリ側の修正が必要です。 この順番を決めたときは LookAt により Constraint を稼働するという想定はありませんでした。 (LookAtによりExpressionを稼働するというのは考慮に入っていました)
UniVRMベースのVRM0.0と1.0の両方に対応しているアプリでは、報告した問題が起きますが、Three.jsベースでは、両バージョンに対応するアプリでも、問題は起きていません。この違いから、何か手がかりはつかめないでしょうか