したかみ ぶろぐ

Unity成分多め

UnityでValve Index Controllerの入力を試す

f:id:vxd-naoshi-19961205-maro:20210808180654j:plain

始めに

Valve Index Controllerを最近購入しましたので、握る部分の入力をどのようにすれば取得できるかを調べてみました。



用意するもの

Valve Index Controllerを扱うためにアセットのSteamVRを使用しました。

assetstore.unity.com


あとはVive Controllerを使う要領でコントローラーのbind設定をしました。

詳しくはこちらを参考にしてください。

framesynthesis.jp

指を曲げているかの取得

それぞれの指がどれくらい曲げられているかはSteamVR_Action_Skeletonから取得できます。

SteamVR_Action_Skeleton.xxxxCurl(xxxx = 指) で指をどれくらい曲げたかを 0 ~ 1 で取得できます。

試しに値を取得するプログラムを書いてみました。

ValveIndexControllerInputChecker.cs

using UnityEngine;
using UnityEngine.UI;
using Valve.VR;

public class ValveControllerInputChecker : MonoBehaviour
{
    [SerializeField] private SteamVR_Action_Skeleton _skeleton;
    [SerializeField] private Text[] _texts;

    [SerializeField] private SteamVR_Input_Sources _controller;
    [SerializeField] private SteamVR_Action_Single _squeeze;
    
    // Update is called once per frame
    void Update()
    {
        CheckFingersCurl();

        // グリップを握る力を取得(後述)
        _texts[5].text = "Squeeze:" + _squeeze.GetAxis(_controller);
    }

    private void CheckFingersCurl()
    {
        _texts[0].text = "親指:" + _skeleton.thumbCurl;
        _texts[1].text = "人差し指:" + _skeleton.indexCurl;
        _texts[2].text = "中指:" + _skeleton.middleCurl;
        _texts[3].text = "薬指:" + _skeleton.ringCurl;
        _texts[4].text = "小指:" + _skeleton.pinkyCurl;
    }
}


このプログラムを動かした結果が次の通りです。

f:id:vxd-naoshi-19961205-maro:20210808162915g:plain



親指に関してはアナログスティックやタッチパッド、ボタンを押すことでSteamVR_Action_Skeleton.thumbCurlの値が増えました。が、こちらは値が1まで増えることはありませんでした。

アナログスティックに触れた場合

f:id:vxd-naoshi-19961205-maro:20210808163234p:plain


ボタンを押した場合

f:id:vxd-naoshi-19961205-maro:20210808163212p:plain


人差し指はボタンを押すことでSteamVR_Action_Skeleton.IndexCurlの値が増えました。

f:id:vxd-naoshi-19961205-maro:20210808184106p:plain


最後に中指、薬指、小指はグリップに指を近づけるだけで値が増加し、グリップに軽く触れるだけで値が1になりました。

f:id:vxd-naoshi-19961205-maro:20210808184813p:plain



グリップを握る力を取得する

Valve Index Controllerではグリップを握る強さを取得することも可能で、やり方はVive Controllerの入力と同じです。

前準備としてコントローラーのBind設定でグリップに力量が設定されているかを確認します。

f:id:vxd-naoshi-19961205-maro:20210808163928p:plain


次にプログラムでSteamVR_Action_Single.GetAxisを呼び出し、引数SteamVR_Input_Sourceで取得するコントローラーを指定します。

SteamVR_Action_SingleはInspectorからBindで設定したものを指定します。

[SerializeField] private SteamVR_Input_Sources _controller;
[SerializeField] private SteamVR_Action_Single _squeeze;
. . . . .
. . . . .
 _texts[5].text = "Squeeze:" + _squeeze.GetAxis(_controller);

f:id:vxd-naoshi-19961205-maro:20210808185711p:plain


結果として、ある程度強く握らないとsqueezeの値が 1 になりませんでした。 (体感15kgぐらい?)

f:id:vxd-naoshi-19961205-maro:20210808202310g:plain



最後に

Valve Index コントローラーを試した動画などはいくつか目にしましたが、中指だけ、薬指だけ曲げるのが難しいかと思ていましたが、使ってみてそんなことはなかったです。

ピースしたり、色んな手を容易に作ることが出来ました。

f:id:vxd-naoshi-19961205-maro:20210808163820p:plain


何となくで使い方がわかったので、これからの個人開発で使っていこうと思います。

参考

valvesoftware.github.io

valvesoftware.github.io

[Unity] Index / Knuckles Controller Input using SteamVR - YouTube