うめ研究生のVR開発記

ViveProEyeをUnityで開発したい大学院生です('ω')公式VIVEアンバサダー1期生

【Vive Pro Eye】視線を投げかけたオブジェクトの情報を取得する【Unity】

 

開発仲間の皆様、お元気でしょうか('ω')

 

今回は『ザ・開発』って感じの、

使い道が多そうな内容になります。

 

内容としては、使用者がViveProEyeを通してVR空間の、

・何を見ているか(注視点)

・物体(オブジェクト)のどこら辺を見ているか

・視線の先のオブジェクトの位置情報・座標データ

を出力してもらいます。

 

つまりは、「視線の先にどんな物体があるか」という情報を取ってみます(゚∀゚)

そして前回未実装となっていた焦点距離も取得できている…かな?

 

またまた、以前に作成したスクリプトに追記していきます。

umehashi.hatenablog.com

 

目線の先の物体の情報を取得する、Focus()

Unityにはオブジェクトから、指定した方向にベクトルを伸ばす

『ray(光線)』という機能があります。

 

みんなのバイブル(?)でも、アバターを爆発四散させるのに使われていましたね(゚∀゚)アヒャ

UnityによるVRアプリケーション開発 ―作りながら学ぶバーチャルリアリティ入門

UnityによるVRアプリケーション開発 ―作りながら学ぶバーチャルリアリティ入門

 

 

この光線を、視線として使っているわけですね(。-`ω-)

 

取得できる情報は、光線の起点方向ベクトル ※それぞれVector3

そして何よりも、光線が衝突したオブジェクトの情報です。

 

【使い方】

①SRanipal_Eye.Focus(GazeIndex.COMBINE, out ray, out focusInfo, radius, maxradius)

②SRanipal_Eye.Focus(GazeIndex.COMBINE, out ray, out focusInfo, maxradius)

③SRanipal_Eye.Focus(GazeIndex.COMBINE, out ray, out focusInfo)

※前もってRay ray、FocusInfo focusInfo、float radius, maxradiusを定義

 

③が一番簡略な形で、光線の起点と方向ベクトル、見たオブジェクトの情報が出力されます。

②の形では、その光線の長さを決めることが出来ます。

①の形では、それに加えて【視線の半径?】を決められます。②と何が違うんでしょう( ˘•ω•˘ )

 

見たオブジェクトの情報としてはstruct型で出力されまして

焦点位置、距離、コライダ情報、Rigidbody、Transform....

 

 

この距離(distance)っていうのが、float型なので輻輳距離に当たる説ないですかね…?(;´・ω・)

今度問い合わせてみようかと思います。

 

追記しました

umehashi.hatenablog.com

 

 

 目から光線を出す、GetGazeRay()

Focus()は光線を飛ばして、出力としてそのRayの情報と、衝突した物体の情報を返してくれました。

 

しかし、

物体の詳細な情報は要らない。視線だけ追えればいい。衝突位置はrayだけでも取れるし。

 

という人はこっちを使いましょう('ω')

 

【使い方】

①SRanipal_Eye.GetGazeRay(GazeIndex.Left, out origin, out direction)

②SRanipal_Eye.GetGazeRay(GazeIndex.Left, out ray)

※Vector3 origin,direction, Ray ray

 

個人的な意見ですが、頭部動揺にデモは影響されないのに、単体で使うとかなり影響される。。。

どっかで別に補正されてるのかな( ˘•ω•˘ )

解決しました。

デモのGazeSampleでは、ローカル座標からワールドの座標へ変換が行われていました(*'ω'*) 

 

2019/08/25追記

以前、数値で取り出すときは右手座標であるとドキュメントにありましたが、こちらの関数で出力される方向ベクトルVector3はUnityと同様の左手っぽい( ˘•ω•˘ )

 

umehashi.hatenablog.com

 

2020/04/03追記

・接続されてないと、原点が光線の起点、方向はz軸方向になります。

・接続されてるけど視線が取れてない時は、カメラ座標が起点,方向はカメラの正面方向になります。

・視線が取れていればカメラが起点、方向は視線の方向になります。

 

以下おまけ

眼の開き具合を数値化して出力、GetEyeOpenness()

以前floatで取れてたじゃん…

umehashi.hatenablog.com

 

 【使い方】

SRanipal_Eye.GetEyeOpenness(EyeIndex.LEFT, out openness)

※float openness

0~1で完全に見開いた時が1

 

瞳の位置を取得する、GetPupilPosition()

これも以前の関数じゃなく前回取れてたじゃん…?

umehashi.hatenablog.com

【使い方】

SRanipal_Eye.GetPupilPosition(EyeIndex.LEFT,out position)

※Vector2 position

評価方法は以前紹介済み

 

umehashi.hatenablog.com

 

 

どうぞよしなに