うめ研究生のVR開発記

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

【Vive Pro Eye】Focus()の使い方を今更書き留めます…【SRanipal】

お久しぶりです。進捗どうですか?()

 

世間が外出自粛ムード…

シャドバの大会がVRで観戦になったり、学会もVRで行われたりと、

業界としては需要が高まり逆に熱くなってきましたね('ω')

 

視線でストーリーが変わる映画とか面白そうだし、発想が素晴らしいなと思いました。

これもViveProEyeを使った作品らしいですね

www.itmedia.co.jp

 

とは言っても、開発フォーラムは過疎化が止まらないんですが( ;∀;)

 

それでも一応、SDKフォルダにある公式のドキュメントが、昔見たときと比べて、リンクがちゃんと繋がるようになってたり、少し見やすくなってたり…って改善はありました。

 

 

Vive japanからyoutubeに、『SDKの紹介』の動画(part1)とやらも出ましたが…

www.youtube.com

 

新しい情報は特になかった…(:_;)

 

紹介と言ってもSDKのサンプルシーンに置かれているオブジェクトをざっと見て、

「見た位置のダーツボードの色が変わるよ!」

みたいな、サンプルシーンの動作の説明って感じでした(主観的なコメントです)

 

正直な印象を述べると、

『一年前にHTC VIVEが投稿した動画(下記)の廉価版みたいなもの』

www.youtube.com

 

というか、自分も解説動画作ろうと、ボイスロイド購入した次の日に出て、この内容だったから猶更…←

 

Unityも触ったことないけど大学等でProEyeの開発しなきゃ…って入門者の方にはオススメかもしれません(´・ω・)

あとはこれから買おうか迷ってる人とか

 

自分の進捗は、

『ViveFoveatedRendering』っていう視線に合わせて解像度を変えるっていうSDKを導入しようとしましたが、グラボが、NVIDIAのTuringアーキテクチャじゃないと動かないらしく、シェーダーでなんとか代用できないかと格闘してました( ˘•ω•˘ )

 

グラボを手に入れたら、このSDKについてもまとめようと思います。

 

⇓(視線の中心から解像度が変わる(極端な)イメージ)

f:id:umehashi:20200402200842p:plain

 

Focus()の使い方

本題ですが、購入当初に印刷したプログラムを眺めてたらFocus()の使い方が、なんとなく掴めたので、改めて書き留めようと思います。

 

前回Focus()に触れた記事はコレ

umehashi.hatenablog.com

 

使い方はこの記事から変更なく、この3通りです。

①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)

 

どのパターンの書き方でもokですので、必要に応じて使い分けましょう。

①GazeIndex.COMBINE

これは左右の眼の情報を統合したものです。基本はこれを参照するといいと思います。

GazeIndex.Leftで左目、GazeIndex.Rightで右目と、この先の情報源を指定できます。

 

②out ray

rayは出力されてくるデータです。

ヘッドマウントを接続せずに出力させてみるとこんな感じ。

f:id:umehashi:20200403122856p:plain

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

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

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

これはGetGazeRayでも同じです。デバッグ中に変だなと思った場合、確認すべきポイントです。

 

出力されたRayの使い方は検索すれば多々出てきますので、そちらでどうぞ。

自分がよく見るのはコレ⇓

【Unity】RayCastを使いこなせ!判定や表示に使ってみよう | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

 

③out focusInfo

focusInfoも出力されてくるデータです。

実はこいつが一番使えるやつでした(今までGetGazerayばかり使ってた)

 

focusInfoには

・point…視線ベクトルと物体の衝突位置

・normal…見ている物体の面の法線ベクトル

・distance…見ている物体までの距離

・collider…見ている物体のコライダ

・ridgidbody…見ている(以下略

・transform…見ている(以下略

 

基本的にはRaycastで得られる情報と同じですね。

分からないものは「Unity ray (分からない変数)」でググれば出てきました。

 

自分はnormalの存在を知りませんでしたが、このサイトが分かりやすかったです。

UnityのRaycastHit.normalとQuaternion.FromToRotationを使いこなす | Unityを使った3Dゲームの作り方(かめくめ)

 

実際、GetGazeRayで視線とぶつかったオブジェクトの情報を、細かく変数決めて取ってたので、focusInfo~で書けるのは便利だなぁと感じます(・ω・)

 

パッと思いつくだけでも、

見ているオブジェクトを持ち上げる、移動させる、色を変える…

なかなかに多くのことがこの関数を中心に行えそうな気がしてきます。

 

radius、maxdistanceは違いが分からないです…スクリプトにもフォーラムにもどこにも書いてない…

設定しないと勝手に値が決まるとかあるんでしょうか?

分かる方がいらっしゃれば是非ご教授ください。

 

こんなところです。ではまた次回

皆さん、お体に気を付けて。開発は外出なくできますが(*'ω'*)

 

追記

今回の記事のためにGetGazeRay()とFocus()を比較しようとしたプログラム

Practice.csをGitHubに載せておきます。

github.com

 

前回の記事同様のシーン構築で動くと思います。取り付けるオブジェクトはシーン内のどれでもいいです。動作内容としては、キーボードのSキーを押すとログが流れます。ログの()の中をいじって出力されてくるデータを確認してみてください。

質問等はコメント・Twitterに気軽にどうぞ。

うめ研究生 (@ume_study) | Twitter

 

⇓前回 

umehashi.hatenablog.com

 

以前ソースコード全て見せてほしいというコメントもありましたので、関数をまとめた回のUmeEye.csも一緒に載せております。開発の一助になれば幸いです。

 

 

umehashi.hatenablog.com

 

 

このままVIVEから就職のお誘いこないかなぁ…|д゚)チラッ