夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MRDL Surfacesを学ぶ FingerSurface その2

本日はMRDLの[Surfaces]の調査枠です。

前回から[FingerSurface]クラスを見ています。

コード全文は次の様になっています。

github.com

前回はLateUpdateで指を定義しているところまでを見ていきました。

redhologerbera.hatenablog.com

今回は続きを読み解いていきます。

    protected virtual void LateUpdate(){

   //各指のTipの定義
    ...

   if (palms.Length == 2)
        {
            if (handJointService.IsHandTracked(Handedness.Right))
            {
                Transform palmTransform = handJointService.RequestJointTransform(TrackedHandJoint.Palm, Handedness.Right);
                palms[0].gameObject.SetActive(true);
                palms[0].position = palmTransform.position;
                palms[0].rotation = palmTransform.rotation;
            }
            else if (!Application.isEditor || disableInactiveFingersInEditor)
            {
                palms[0].gameObject.SetActive(false);
            }

            if (handJointService.IsHandTracked(Handedness.Left))
            {
                Transform palmTransform = handJointService.RequestJointTransform(TrackedHandJoint.Palm, Handedness.Left);
                palms[1].gameObject.SetActive(true);
                palms[1].position = palmTransform.position;
                palms[1].rotation = palmTransform.rotation;
            }
            else if (!Application.isEditor || disableInactiveFingersInEditor)
            {
                palms[1].gameObject.SetActive(false);
            }
        }
}

LateUpdateでは左右のHandTracking情報を取得するほかにTransform[]型の[palm]の大きさが2の場合別の処理が実行されます。

この[palm]はFixedUpdateで取得されます。

Unityでは毎フレーム処理を実行する[Update]のほかに[LateUpdate]、[FixedUpdate]といったものが用意されています。

これらの違いは以下の記事でわかりやすく解説されています。

gametukurikata.com

[LateUpdate]は通常[Update]の処理の後に実行されます。[FixedUpdate]は物理挙動の変更の直前に呼ばれます。

[Update]との違いとして[Update]はFpsに依存していますが、[FixedUpdate]は1秒間に実行される数が決まっておりfpsの影響を受けません。

一つのクラスで[FixedUpdate]と[]デバッグログを入れて確認してみるとその違いが分かります。

f:id:Holomoto-Sumire:20210417220708j:plain

[FixedUpdate]では次の様な処理が行われています。

 protected virtual void FixedUpdate()
    {
        if (!Initialized)
            return;

        #region physics
        // Disable finger colliders when menu is open to prevent them from interfering with menu operation
        if (menu != null)
        {
            for (int i = 0; i < fingerColliders.Length; i++)
            {
                fingerColliders[i].enabled = !menu.IsOpen;
            }

            for (int i = 0; i < palmColliders.Length; i++)
            {
                palmColliders[i].enabled = !menu.IsOpen;
            }
        }

        // Move rigid bodies to follow finger positions
        for (int i = 0; i < fingerRigidBodies.Length; i++)
        {
            if (fingers[i].gameObject.activeSelf)
            {
                fingerRigidBodies[i].MovePosition(fingers[i].position);
                fingerRigidBodies[i].MoveRotation(fingers[i].rotation);
            }
        }

        for (int i = 0; i < palmRigidBodies.Length; i++)
        {
            if (palms[i].gameObject.activeSelf)
            {
                palmRigidBodies[i].MovePosition(palms[i].position);
                palmRigidBodies[i].MoveRotation(palms[i].rotation);
            }
        }
        #endregion
    }

ここでは

Disable finger colliders when menu is open to prevent them from interfering with menu operation

で記載されているようにメニューを開いているときにコライダーを無効にして、メニュー操作の妨げにならないようにする処理を行っています。

まとめるとFingerSurfaceでは手の指の情報を取得して、メニュー操作を行う際はコライダーを無効化しています。

本日は以上です。