Swampdog part19 -カーソル表示-
はじめに
VR獣医解剖図とか、獣医VR解剖図とか長いしややこしいので、本プロジェクトを「Swampdog」と呼ぶことにします。
開発期間中の暫定的な名前ですが。
さて前回、骨を表示することができました。
今回はHoloLens Academyのようにカーソルを表示します。
いずれ、カーソルが当たっている部分の名称が表示されたり、タップすることで詳細説明が表示されたりとする予定です。
カーソル追加
「Holograms 101E Chapter 2 – Gaze」を参考にカーソルを配置してみるのですが、
骨しか表示されず。
どこを見てもカーソルが出てこない。
前回は遠くにありすぎて回り込めなかったりしたので、今回も比較対象としてOrigami Collectionsを配置して確認。
どうもカーソルがうまくオブジェクトを認識していない?
なんかずれたところに出現しているし、動かしているうちに消える。
骨がある以外はチュートリアルと同じはずなんですが。
Cursor設置の時に場所をずらしたのがいけなかったんでしょうか?
一回Cursorを削除して、「Assets/Holograms」からもう一度持ってきます。
Origamiに対してはカーソルが当たるようになりました。
骨には反応していない。
WorldCursor.csの中を読んでみます。
(スクリプ全体はこちら。)
if (Physics.Raycast(headPosition, gazeDirection, out hitInfo)) { // If the raycast hit a hologram... // Display the cursor mesh. meshRenderer.enabled = true; // Move thecursor to the point where the raycast hit. this.transform.position = hitInfo.point; // Rotate the cursor to hug the surface of the hologram. this.transform.rotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal); } else { // If the raycast did not hit a hologram, hide the cursor mesh. meshRenderer.enabled = false; }
どうやら、
if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
この条件分岐で視線の先にオブジェクトがあるか判定しているみたいです。
Physics.Raycastについて詳しくは、
- Unity Documentation | Physics.Raycast
読んだところ、第一引数(headPosition)が開始座標、第二引数(gazeDirection)が視線方向。
開始座標から視線方向にオブジェクトがあれば、trueが返ってきてその情報が第三引数(hitInfo)に格納される。
そんな感じでした。
で、気になるのは返り値の部分の記述。
Returns
bool レイが任意のコライダーと交わる場合は true、それ以外は false
引用: Unity Documentation | Physics.Raycast
コライダーって何さー。
字面的に衝突判定があるものって感じですかね。
Sphere1を見てみると、Sphere Colliderなるものが設定されています。
他のオブジェクト(紙飛行機や台座)にもそれぞれコライダーが設定されていました。
これですね。骨にもメッシュに合わせたコライダーを与えてあげればよさげ。
細かい説明はこちらへ。
- Unity Documentation | コライダー
もうちょっとわかりやすくザクっとつかむなら以下の記事。
- Qiita | UnityのRigidbodyとColliderで衝突判定
で、複雑なメッシュに対してはメッシュに応じた形のコライダーを設定できるとのこと。
それがMesh Colliderです。便利。
- Unity Documentation | Mesh Collider
コライダーを設定したいメッシュを選択して、「Inspecter -> Add Component -> Physics -> Mesh Collider」です。
動画ではウィンドウが表示されていない。。。
いまいちWindows標準の録画ツールの使い勝手が悪いですね。
こんな感じで、肋軟骨l1という親オブジェクトの中にgrp1という子オブジェクトが入っていて、それにgrp1という同名のメッシュやマテリアル(色)が設定されています。
grp1オブジェクトに対してコライダーを設定しました。
わざわざ入れ子構造にしなくてもよさげですが、OsiriXから抽出した段階でこうなっていました。
この親子関係をすべての部位で解消するのも時間がかなりかかりそうなので止めておきます。
対象の名前は一つ上の親オブジェクトの名前を取得、みたいな感じで実装できるといいな。
左の第一、第二肋軟骨にだけコライダーを設定して、いざ検証。
視点のベースになるようにSphere1を近くに移動しておきました。
ちゃんとカーソルが反応してくれました。
骨は細くて丸みがあるのでカーソルがガクガク揺れてちょっと鬱陶しいですね。
最終的にカーソルの角度までコライダーに沿わせるのかは検討が必要そうです。
すべての骨にコライダーを設定。
ひたすらポチポチすること5分間。一気にやる方法があったら教えてください。
OrigamiCollectionsは要らないので削除。
ちゃんと骨にカーソルが当たるようになりました。
次回
次は、カーソルが当たった時にその部位の名称を表示するようにします。
チュートリアルはさっくり流してしまったのでちゃんとスクリプトの中身を理解していませんでした。
開発中に見直す必要がありそうです。
C#まったく触ったことないけど、今のとこ雰囲気で読めそうな感じです。
これから久しぶりにコードを書けそうなのでちょっとうれしい。
(1週間後くらいにはコード書きたくないと言ってそう)
おまけ
ぼやきですが、検証に手間がかかるのをどうにか効率化したいです。
Unityでシーンを保存、Build。しばし待機。
Visual Studioでソリューションを読み込み。しばし待機。
HoloLensにつないでデバッグ開始。しばし待機。
アプリケーションの確認。
これで2、3分かかります。
大した時間じゃないんですが細かい修正を頻繁にチェックしたいときにはまだるっこしいなあ。
いい方法募集中です。
あとWindowsのSnipping Toolでキャプチャを保存するとき、日時なりなんなり上書き保存されないように設定したい。
が、無理みたいなので他のソフトウェアを探します。
SnapCrabというのがよさげ。
- yaruzou.net | SnapCrabで指定した部分のスクリーンショットを自動保存
しばらく使い心地を試してみます。
さらに余談ですが、Win + PrintScreenでスクリーンショットをそのままファイルとして保存できるようになったらしいです。便利。
Macを使い始めたときは、日本語入力するのにすら困って「使いづらー」と思っていましたが、Windowsに戻ってくるとMacの洗練具合がわかります。
特に仮想デスクトップはMacの方がよい。
Windowsだと起動に時間がかかるソフトウェアを立ち上げ、別のデスクトップで作業。
作業中のデスクトップにソフトが立ち上がる。という挙動が地味に嫌です。
Macみたいにソフトウェアごとにデスクトップの割り当てできるのかな。
しばらくWindows生活なのでちゃんと調べて、使い勝手よく作業したいですね。