トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

ハンドトラッキングでペンを自然に持って書く【OculusQuest】

こういうことをやります

f:id:bibinbaleo:20200213110034p:plain

ペンの先をキャンバスに当てたらインクが出る部分はすでにできているとして、

・手のどの位置でペンを持つように設定したらいいのか

・ハンドトラッキングの揺れを抑えるにはどうしたらいいのか

などをテストしていきます。

先行事例

 

指に対するペンの位置と角度

指のpositionはこれで取れます

Vector3 indexTipPos = MYRightSkelton.Bones[(int)OVRSkeleton.BoneId.Hand_IndexTip].Transform.position;
Vector3 index1Pos = MYRightSkelton.Bones[(int)OVRSkeleton.BoneId.Hand_Index1].Transform.position;

f:id:bibinbaleo:20200213111348p:plain

OculusQuest ハンドトラッキングSDKから、指Boneの情報を取得し分析する - Qiita

より引用

これをもとにペンの位置を設定していきます。

1:単純な中間

位置:人差し指の付け根先端まんなか

角度:人差し指の付け根先端の間

PenAnchor_Hand.transform.position = (indexTipPos + index1Pos) * 0.5f;        
PenAnchor_Hand.transform.rotation = (indexTipRotate*index1Rotate) ;

f:id:bibinbaleo:20200213142744p:plain

指の角度によってはクルクル回りますが、ペンを持つような指の形にしたら、位置はいい感じになります。

 

ちなみに実際にペンを持った状態でも、ある程度指を認識しますが、精度は下がります。

2:Good!

位置:人差し指の付け根先端の間

角度:人差し指の付け根から先端のをつないだ方向

            Vector3 penDirection = indexTipPos - index1Pos;
           
            PenAnchor.transform.position = (indexTipPos + index1Pos) * 0.5f;
            PenAnchor.transform.forward = -penDirection;

いい感じ

f:id:bibinbaleo:20200213142932p:plain

人差し指をまっすぐ伸ばしても書ける。

 

f:id:bibinbaleo:20200213150345p:plain

f:id:bibinbaleo:20200213150342p:plain

3:認識回数とか゚所を減らしたver

位置:人差し指付け根のみ

角度:人差し指の付け根から先端のをつないだ方向(親指と人差し指がくっついた時点の角度で固定)

Vector3 penDirection = indexTipPos - index1Pos;
         
            IndexPinchStrength = MYRightOVRHand.GetFingerPinchStrength(OVRHand.HandFinger.Index);
            if (IndexPinchStrength > 0.8)
            {
                if (!isHoldPen)
                {
                    PenAnchor.transform.forward = -penDirection; // RemoteRayCastDrawer.DirectionTypeによる                                                     
                    PenAnchor.transform.position = index1Pos;
                    isHoldPen = true;
                }
            }
            else
            {
                if (isHoldPen)
                {
                    isHoldPen = false;
                }            }

2のとき、位置は関節二つをもとに計算してたけど、一つをもとにしたらブレが抑えられるのではないかという考えのもと、あまり動かなそうな人差し指の付け根だけを位置の親にした。

が、変わらずぶれた。

角度は2の時の角度のとり方だが、2がUpdate文の中で常に角度を更新していたのに対し、3では親指と人差し指を付けたときをトリガーとして、その時の2の角度で固定するようにした。

再びトリガーが引かれたら角度が更新される。

f:id:bibinbaleo:20200213110455j:plain

そんなに変わらないかも。

ブレ対策

ハンドトラッキングはじっとしていても小刻みに震える。

その対策を考える

位置の小数点第2以下を切り捨てる

bibinbaleo.hatenablog.com

だめだった

f:id:bibinbaleo:20200213110027p:plain

うまい方法があったら別記事で書きたい

おまけ:ブレの英語は?

小刻みに揺れることを英語ではなんていうんだろう?誰かtwitterでつぶやいてたけど見つけられない。

見つけたけど、動作のかくつきだった。ちょっと違うかな?

 

wiggleとかかな?

ejje.weblio.jp

その他

指先で書くもできる。

f:id:bibinbaleo:20200213112953p:plain

メリットとデメリット

コントローラーを使わずにハンドトラッキングで平面に文字を書くメリットとデメリット

メリット

・重くない(コントローラーを持たなくてい)

・シンプルになる(コントローラーの使い方を考えなくていい)

デメリット

・フィードバックがない(コントローラーは振動でフィードバックしている)

・ぶれる(Oculusハンドトラッキングの精度の問題。Hololens2やLeapMotionだったらどうなのか)