3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

FinalIKのLookAtIK(顔の向き)とVRMのVRMLookAtHead(視線の向き)を組み合わせる

Last updated at Posted at 2019-09-06

#やりたかったこと
動的に読み込んだVRMに対して、カメラに顔の向きと視線を追従させたい。
視線追従はVRMLookAtHeadを利用し、顔向きの追従はLookAtIKを利用。
(両方ともLookAtIKで行うこともできそうだったが、視線追従は目の可動域が考慮されるVRMLookAtHeadを利用したかった)
また、アニメーションを上書きして追従させたかったので、両方ともLateUpdateのタイミングで実行する必要がある。

#ハマったポイント
実行順が、視線の追従→顔向きの追従(それに伴い視線も移動)となり、視線があさっての方向に向いてしまう。
tsubaki_t1氏のブログによると、コンポーネントやオブジェクトを動的に追加した場合は、生成順になる
とのことらしいので、以下のようなLateUpdateで視線追従の関数を呼ぶだけの関数を作り、

[RequireComponent(typeof(VRMLookAtHead))]
public class DelayUpdateVRMLookAtHead : MonoBehaviour
{
    private VRMLookAtHead vrmLookAtHead;
    // Start is called before the first frame update
    void Start()
    {
        vrmLookAtHead = GetComponent<VRMLookAtHead>();
        vrmLookAtHead.UpdateType = UpdateType.None; // 視線追従の関数を自動で呼ばれないようにしておく
    }

    // Update is called once per frame
    void LateUpdate()
    {
        vrmLookAtHead.LookWorldPosition();
    }
}

LookAtIKの生成後にAddComponentしても実行順は変わらない。
念の為[DefaultExecutionOrder(1)]とかしてもダメ。

#解決方法
LookAtIKの機能として、姿勢変更後に実行するイベントの登録ができました…。

var lookAtIk = model.AddComponent<LookAtIK>();
var vrmLookAtHead = GetComponent<VRMLookAtHead>();
vrmLookAtHead.UpdateType = UpdateType.None; // 視線追従の関数を自動で呼ばれないようにしておく
lookAtIk.solver.OnPostUpdate += vrmLookAtHead.LookWorldPosition;

#Before / After
2019-09-06_23-17-30.png 2019-09-06_23-20-55.png

#更新履歴
2019/12/12
・解決方法において端折っていたVRMLookAtHeadの取得、設定処理を明記

2019/9/8
・サイトの管理者を明記
・VRMLookAtHead自身でのアップデートを処理を切る必要があることを明記

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?