UniVRM icon indicating copy to clipboard operation
UniVRM copied to clipboard

視点コントロール用ボーンの回転をRoll constraintがコピーできない / Roll Constraint Cannot Copy Rotation of Viewpoint Control Bone

Open MelvinaSakura opened this issue 10 months ago • 4 comments

環境情報

  • UniVRM version: 0.128.~2
  • Unity version: Unity-2022.3.22.f1
  • OS: Windows 11

バグについて

今回報告する事例では、VRM1.0の視点コントロール用ボーンの回転に対し、補助ボーンのRoll constraintがコピーできていないようです。

下のBlender画像では。「Eye_L」がHumanoidに登録された左目制御用ボーンで、その奥のボーンがX軸で制限をかけたコンストレイント用補助ボーンです。これで、上まぶたの動きを上下方向に制限しています。

Image

次の図はThree.jsで動く「VRMお手軽ポーズ」とUniVRMで動く「VRM Posing Desktop」において、視線を下に向けた時のまぶたの挙動の比較です。UnityでのSceneビューは、「VRM Posing Desktop」と同じ結果になります。

Image

ロールコンストレイントボーンのウエイトは、上まぶたにのせているので、期待する挙動は、「VRMお手軽ポーズ」が示していますが、UniVRM で動く、「VRM Posing Desktop」や「cluster」では、コンストレイントが機能していないように見えます。 そもそも、視点制御用ボーンの回転情報はコピーできない仕様なのでしょうか? もし、回避方法があればご教示いただければ幸いです。

必要であれば、画像で使ったVRMファイルをお送りします。

宜しくお願いします。

MelvinaSakura avatar Mar 01 '25 08:03 MelvinaSakura

書いてあるだけでは、なんとも言えない感じです。 問題を再現できる必要があります。 モデルだけでなく、シーンと手順が全体的に分かることが必要です。 VRM、シーン、もしくは両方の組み合わせに原因があるかもしれません。

単純なシーンでは問題が無いようです。

  • Alicia 配置
  • Alicia root に cube を追加し rollconstraint を追加。eye_L を参照
  • world に独立した sphere を配置。lookat target にこれを指定
  • play

sphere を動かす。cube 連動する

Image

ousttrue avatar Mar 03 '25 04:03 ousttrue

言い忘れましたが、Unityのシーンビューでは、私が提示したアバターであっても、正しくロールコンストレイントは機能しました。さらに、過去バージョンのv0.115.0でも、正常に機能しました。ただし、その間のバージョンは未確認です。 コンストレイントが機能しないUniVRMを利用したアプリは、私が確認したもので、cluster、VRM Posing Desktop,VPic.です。 アプリ側で、古いバージョンのどれかが、原因になってる可能性も否定できないので、そちらの開発者様にうかがってみます

MelvinaSakura avatar Mar 03 '25 16:03 MelvinaSakura

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を稼働するというのは考慮に入っていました)

ousttrue avatar Mar 06 '25 13:03 ousttrue

UniVRMベースのVRM0.0と1.0の両方に対応しているアプリでは、報告した問題が起きますが、Three.jsベースでは、両バージョンに対応するアプリでも、問題は起きていません。この違いから、何か手がかりはつかめないでしょうか

MelvinaSakura avatar Mar 07 '25 00:03 MelvinaSakura