夜風のMixedReality

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

Hololens用のオリジナルUIを作成する。 ~スイッチレバー その②~  上下左右の動きの検知

本日はMRTKを基にHoloLensで使用できるオリジナルのUIを作成します。

過去にSFチックのUIを作成していました。 今回は続編です。

redhologerbera.hatenablog.com

本シリーズで作成したものは以下でMITライセンスで公開しています。(自由に使ってください)

github.com

〇ターゲットオブジェクトを動かす

前回『握っていること』の検知機能を実装しました。

今回は動きを検知する機能を実装します。

その前にオブジェクトが動けないのでは検知するどころではありません。オブジェクトを動けるようにします。

MRTKには[ManupurationHandler]と呼ばれるコンポーネントが用意されておりアクションによるインプットでのオブジェクトの移動を実現します。

オブジェクトに[ManupurationHundelr]をアタッチします。

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

これでオブジェクトが移動できるようになりました。

〇左右上下の動きを検知する。

ターゲットオブジェクトが移動できるようになりました。次はどちらへ入力が行われているのかの検知を行います。

最初に今回実装したスクリプトを記載します。

 public void Update()
    {
        dpos = this.gameObject.transform.localPosition;

        float yaxisparm = System.Math.Abs(dpos.y);
        float xaxisparm = System.Math.Abs(dpos.x);

      bool result = yaxisparm > xaxisparm;
        bool resulty = dpos.y > 0;
        bool resultx = dpos.x > 0;
        bool resultabsy = yaxisparm > 1;
        bool resultabsx = xaxisparm > 1;

        Debug.Log(resultabsx);

        if (!resultx && !resulty)
        {
          
        }

        if (result && resulty && resultabsy)
        {
            Debug.Log("+Y Axis");
        }

        if (result && !resulty && resultabsy)
        {
            Debug.Log("-Y Axis");
        }

        if (!result && resultx && resultabsx)
        {
            Debug.Log("+X Axis");
        }

        if (!result && !resultx && resultabsx)
        {
            Debug.Log("-X Axis");
        }
    }

Update関数で毎フレームごとに処理を行っています。

        dpos = this.gameObject.transform.localPosition;

dposは自分自身(ターゲット)のローカル座標を取得します。

        float yaxisparm = System.Math.Abs(dpos.y);
        float xaxisparm = System.Math.Abs(dpos.x);

yaxisparm、xaxisparmにはターゲットのx、yそれぞれの軸の値の絶対値を入れています。

        bool result = yaxisparm > xaxisparm;
        bool resulty = dpos.y > 0;
        bool resultx = dpos.x > 0;
        bool resultabsy = yaxisparm > 1;
        bool resultabsx = xaxisparm >1;

resultはターゲットのローカル座標のY成分とx成分のそれぞれの絶対値のうちどちらが大きいかを判定します。

resultがTrueの時X軸の移動よりY軸の移動のほうが大きいと判断しY軸へのInputを検知します。(上下)

resultがfalseの場合逆にx軸へのInputを検知します。(左右)

resulty,resultxはそれぞれ上下、左右の判定を行います。

例えばresultyがTrueの場合はターゲットのローカル座標のy成分が+の値、つまり上へ入力が行われていると処理します。

resultabsx,resultabsyは入力の感知強度で、この場合x座標にそれぞれ+-1以上の変異があった場合イベントを起こすようにしています。

        if (!resultabsx && !resultabsy)
        {

        }

resultabsxとresultabsyがfalseの場合…つまり検知最小範囲よりも動きが小さい場合に呼ばれます。

        if (result && resulty && resultabsy)
        {
            Debug.Log("+Y Axis");
        }

resultとresulty、resultabsyがそれぞれTrueの場合…つまりY軸方向の移動がX軸方向よりも大きく、y軸の値がプラスで、検知最小範囲よりも大きく移動した場合 上向きに入力が行われていると処理します。

        if (result && !resulty && resultabsy)
        {
            Debug.Log("-Y Axis");
        }

result、resultabsyがそれぞれTrueでresultyがfalse・・・・つまりY軸方向に入力が行われており、検知最小範囲よりも大きいけれどy座標の値がー値の時下向きに入力が行われたと処理します。

        if (!result && resultx && resultabsx)
        {
            Debug.Log("+X Axis");
        }

resultがfalseでresultx,resultabsxがTrueの場合・・・つまりY軸よりもx軸への移動が大きく、x座標は正の値、検知最小範囲よりも大きく移動した場合右へ入力が行われたと処理します。

        if (!result && !resultx && resultabsx)
        {
            Debug.Log("-X Axis");
        }

result、redultxがfalseでresultabsxがtrueの場合、つまりy軸よりもx軸への移動が大きく、x座標が負の値で検知最小範囲よりも大きく移動している場合左へ入力が行われたと処理します。

以上で入力方向の検知を実装しました。