2019年12月16日月曜日

[HoloLens Advent Calendar 2019] 16日目 Mixed Realty Tookit Unity v2 HandConstraint.csのOnHandActivateの呼び出しタイミングについて

お疲れ様です。ZuQ9->Nnです。
この記事は、HoloLens Advent Calendar 2019、16日目 2019/12/16 の内容です。
 Mixed Realty Tookit Unity v2(以下MRTKv2)に
ハンドトラッキングを扱うHandConstraint.csというスクリプトがあります。

Class HandConstraint

Provides a solver that constrains the target to a region safe for hand constrained interactive content. This solver is intended to work with IMixedRealityHand but also works with IMixedRealityController. public class HandConstraint : Solver protected HandBounds handBounds protected IMixedRealityController trackedController When a hand is activated for tracking, should the cursor(s) be disabled on that hand?

HandConstraint.csは、Provides a solver that constrains the target to a region safe for hand constrained interactive content.
つまり、手の領域にあるオブジェクトに対して制約をつけて、手が見えたり隠れたりするときにイベントを実行するScriptです。
HandConstraint.csにはOnFirstHandDetected、OnHandActivate、OnHandDeactivate、 OnHandDeactivateというイベントが定義されています。

OnFirstHandDetectedは、Event which is triggered when zero hands to one hand is tracked.
日本語に直すとゼロ本の手の片手がトラッキングされたときにトリガーとなるイベント

OnHandActivateは、Event which is triggered when a hand begins being tracked.
手がトラッキング開始されたときにトリガーとなるイベント

OnHandDeactivateは、Event which is triggered when a hand stops being tracked. 手がトラッキング終了されたときにトリガーとなるイベント

OnLastHandLostは、Event which is triggered when all hands are lost. すべての手がトラッキングが失われたきにトリガーとなるイベント

となっています。ふと、OnFirstHandDetectedとOnHandActivateのタイミングってどう違うのだろう?そんな純粋な気持ちで調べたら。。。
なんだか思っていた結果と違ったので、

自分のメモ用にまとめておきます。 プロジェクトの作成、
Microsoft.MixedReality.Toolkit.Unity.Foundation.2.1.0.unitypackageのインポート
UnityのMixed Relaity ToolkitメニューからAdd to Scene and Configureを選択する等はいつも通り行ってください。
わからない方は、以前の記事を参考にしてください。

HierarchyのCreate > 3D Object > 3D Textを作成

これはデバックの文字列を画面に表示させるためのテキストです。
画面で確認できるように3D TextのTransFormや設定を行ってください。
僕は今回、Transform x:0, y:0, z:20 、Textは空に
Text MeshのAnchor Middle Center、Aligiment Center、Font Size 50としました。

HierarchyのCreate > Create Emptyで空のオブジェクトを作成

特に名前は何でもいいのですが、今回は、HandConstraintTestとしました。

HierarchyのHandConstraintTestを選択、
InspectorからAdd CompnentでHandConstraintを選択してアタッチ

更に、Add CompnentのNew ScriptでScriptを追加

Script名は何でも良いのですが、 今回は HandConstraintTest.csとしました。

中身は、こんな感じ HierarchyのNew TextをHandConstraintTest(Script)のTextにアタッチ


HandConstraintの各イベントにHandConstraintTestのメソッドを対応させます。
OnHandActivate : AfterHandActivate
OnHandDeactivate : AfterHandDeactivate
OnFirstHandDetected: AfterFirstHandDetected
OnLastHandLost: AfterHandLost

これでUnityを実行すると、このような感じになりました。

動画では、少しわかりにくいので、スクリーンショットでも解説します。
Unityを実行した直後は、OnLastHandLost、OnHandDeactivateが実行されます。

次に手を表示したときには、OnFirstHandDetectedのみ実行されます。

つまり、このタイミングでは、OnHandActivateは実行されません
手を非表示にしたときは、OnLastHandLostが呼び出されます。

では、いつ、OnHandActivateが呼び出されるのでしょうか?
結論から言うと、Unityの設定を変更しなければ、OnHandActivateは呼び出されません。

HandConstraint.csをアタッチすると、
Solver Handler.csもアタッチされています。

Class SolverHandler

This class handles the solver components that are attached to this GameObject public class SolverHandler : MonoBehaviour protected Handedness currentTrackedHandedness protected Handedness preferredTrackedHandedness protected readonly List solvers Add an additional offset of the tracked object to base the solver on. Useful for tracking something like a halo position above your head or off the side of a controller.
Solver Handler.csは、GameObjectにアタッチして、オブジェクトの位置と方向を計算するコンポーネントを提供します。
HierarchyからHandConstraintTestを選択、
InspectorでSolver HandlerのTracked Target Typeを確認してください。
最初の設定は、Headになっています。
つまり、頭に追随する設定なのです。

Solver HandlerのTracked Target Typeのドロップダウンから
Hand Jointを選択し。 手に追随する設定に変更します。


もう一度、Unityを実行するとこのような感じになります。

今回は、手を表示した時点で、
OnFirstHandDetected、OnHandActivateの二つのイベントが実行されました。


InspectorでSolver HandlerのTracked HandnessをBothからRightやLeftにすると
右手が表示されたときのみ、左手が表示されたときのみといった制御を行うことができます。

Solver HandlerのTracked Hand JointをPalm以外にも変更してみましたが、
OnFirstHandDetected、OnHandActivateの二つのイベントが実行されました。
しかし、これはUnity Editorで実行しているからかもしれませんね。

もしかしたら実機で、Tracked Hand JointをThumbTipにした場合、
親指を隠した状態で手を表示し、親指を立てたときのみ
OnHandActivateが実行される可能性があるのでは?
と思ったのですが、Noneにしてもイベントが実行されました。
なので、おそらく、Tracked Hand Jointは、OnHandActivateの実行タイミングとは関係ないと考えています。
Tracked Hand Jointは、オブジェクトをトラッキングするときの位置のみに利用するのでしょう。

しかし、これだけではありません、OnHandActivateイベントは、
HandConstraintPalmUp.csをアタッチした場合では、また別のタイミングで実行されるのです。

一度、InspectorのHandConstraintの歯車アイコンをクリックし、
Remove ComponentでHandConstraintをRemoveします。

InspectorのAdd ComponentからHandConstraintPalmUpを選択しアタッチします。

HandConstraintPalmUpの各イベントにHandConstraintTestのメソッドを対応させます。
OnHandActivate : AfterHandActivate
OnHandDeactivate : AfterHandDeactivate
OnFirstHandDetected: AfterFirstHandDetected
OnLastHandLost: AfterHandLost

Unityを実行するとこのような感じになります。

こちらもスクリーンショットで開設します。まず、手を表示したときは、
OnFirstHandDetectedのみ実行されます。

そして手を回転させて、手のひらが表示されたタイミングで
OnHandActivateが実行されます。

Solver HandlerのTracked Hand JointをPalm以外にも変更してみましたが、
Unityでは同じタイミングでイベントが実行されました。

Tracked Target TypeをHead、頭に戻して確認したところ
手のひらが表示されたタイミングでは、OnHandActivateが実行され無い結果となりました。

実機でどのように動くか、確認したい。。欲求が高まりましたが、
おそらく、イベントの実行タイミングはUnity Editorの時と変わらないと考えるのが妥当です。

とりあえずUnity上で確認した動きを表にしてまとめました。

Solver Handler
Tracked Target Type
手を表示した時の
イベント
手のひらを
表示したときのイベント
HandConstraint Head OnFirstHandDetected -

Hand Joint OnFirstHandDetected
OnHandActivate
-
HandConstraintPalmUp Head OnFirstHandDetected -

Hand Joint OnFirstHandDetected OnHandActivate

ちょっと自信が無いので、間違いがあったらご指摘ください。。
よろしくお願いいたします。

2019年12月15日日曜日

[HoloLens Advent Calendar 2019] 15日目 Mixed Realty Tookit Unity v2 Hand Trackingで、柔らかい仮想オブジェクトに触ってみる

お疲れ様です。ZuQ9->Nnです。
この記事は、HoloLens Advent Calendar 2019、15日目
2019/12/15 の内容です。

今回は、ネタ記事です。技術的にもアセットを使っているので
あまりたいした内容ではありません。そして少しセンシティブな内容が含まれるので
不愉快に思われる方は、記事を閉じてください。

個人的にHoloLens 2の新しい機能で、一番気になるのがハンドトラッキングです。
ハンドトラッキングで、今回は柔らかい仮想オブジェクトに触ってみましょう。。

今回の環境は、Unity 2019.2.12f1
Microsoft Mixed Reality Toolkit v2.1.0(Microsoft.MixedReality.Toolkit.Unity.Foundation.2.1.0.unitypackage) を利用しました。

まずは、適当な名前でUnityでプロジェクトを作成(僕はTestとしました。)
Microsoft.MixedReality.Toolkit.Unity.Foundation.2.1.0.unitypackageをUnityにインポートします。

Apply Mixed Reality Toolkit Default Settings?
のダイアログが表示されますので、Applyを押します。

Unityのメニューに、Mixed Relaity Toolkitが表示されますので、
そこから。Add to Scene and Configureを選びます。



Select MixedRealityToolkitConfigurationProfileのダイアログが表示されます。
こちらは、開発環境に合わせて選択しますが、今回は、とりあえず、
DefaultMixedRealityToolkitConfigurationProfileを選択します


Hierarchyに、MixedRealityTookitとMixedRealityPlayspaceが自動追加されます


今回は、こちらのサイトに公開されているアセットを利用します。

Mesh Deformation, a Unity C# Tutorial

Making a Stress Ball Cast rays at objects and draw a debug lines. Convert forces to velocities for vertices. Maintain shape with springs and dampening. Compensate for object transformation. We start with a scene that has a single cube sphere object at its center.
サイトの一番下に、unitypackageのリンクがありますので、そちらをクリックしてダウンロード

dealing-with-transformations.unitypackageがダウンロードされますのでUnityにインポートを行います。

HierarchyからCreate > 3DObject > Sphereを選択
Sphereを見える位置に配置します。(僕は x : 0, y : 0, z:2に配置しました)

HierarchyのSphereを選択、Inspectorを表示し、
Add ComponentからMesh Defomerを選択アタッチします。
続いて、SphereのInspectorをから、 Add ComponentでPointer Handlerを選択アタッチします。


続いて、SphereのInspectorをから、 Add ComponentでNew Scriptを選択スクリプトを追加。
スクリプト名は、特に何でもいいのですが、今回はSphereBounceとしました。

SphereBounceのコードはこんな感じになります。
SphereのInspectorをからPointer Handlerの
On Pointer Draggedの + ボタンを押し

HierarchyからShpereをInspectorのPointer Handler、
On Pointer Draggedにドラッグしてアタッチします。

SphereのInspector、Pointer Handler、 On Pointer Draggedから
No Founctionのドロップダウンを開いて。
SphereBounse > Boundを選択します。

Unity Editorを実行し、Shiftボタンを押しながら指を表示
クリックしながら動かすとこんな感じで動きます。

ちょっと、パラメータを調整してみたんですが
残念ながら、あんまり思った感じのプルプル感は得られませんでした。。 orz..

この辺りは、別のアセットを検討したほうがいいかもしれませんね。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
HoloLens 2のタッチに対応させてみる。
上記は現状のHoloLensの実機のAir Tapでも動くように
Pointer Handlerを利用しました。

 HoloLens 2ではハンドトラッキングのタッチも検出できます。
一応、そちらでも動くように対応させてみたいと思います。
なので、その対応が不要な人は読み飛ばしてください。

SphereのInspectorのAdd Componentで
Near Interaction Touchable Volumeをアタッチします。
つづいて、SphereのInspectorのAdd Componentで
Touch Handlerをアタッチします。

SphereのInspector、Touch HandlerのOn Touch Updatedの + ボタンをクリック

HierarchyからShpereを Inspector、
Touch HandlerのOn Touch Updatedにドラッグしてアタッチします。

SphereBounceのコードに、タッチで反応したときの動作のメソッドBoundTouchを追記します。
SphereBounceのコードは、こんな感じになります。
SphereのInspector、
Touch HandlerのOn Touch Updatedから No Founctionのドロップダウンを開いて。 SphereBounse > BoundTouchを選択します。
設定は以上でおわりです。Unity Editorを実行
Shiftボタンを押しながら指を表示、今度は、クリックせずそのまま、Shpereに近づけます。
こんな感じで動きます。
 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
流石に、これだけだと、あまりにネタすぎるのでソースコードの解説を行います。

1) Shpereを揺らしているMeshDeformer.csについて。
Unity C# TutorialsのサイトMesh Deformation にも実装が記述されていますが、
MeshFilterを取得して、ポリゴンそのものを変形させることによって、凹んだ表現をおこなっています。

2) クリック動作を扱うPointerHandler.csについて。
こちらは、MixedRealityToolkit-Unityで提供されています。
MonoBehaviourを継承しているため、Inspectorからセットできるようになっています。
IMixedRealityPointerHandlerがイベントを扱います。
OnPointerDown(MixedRealityPointerEventData eventData);  // クリックポインターを下げたとき
OnPointerDragged(MixedRealityPointerEventData eventData);  // ドラッグされたとき
OnPointerUp(MixedRealityPointerEventData eventData); // クリックポインターを挙げたとき
OnPointerClicked(MixedRealityPointerEventData eventData); // クリックが押されたとき このイベントがUnityのInspectorからセットできるようになっています。

3) タッチ可能にする NearInteractionTouchableVolume.cs
こちらも、MixedRealityToolkit-Unityで提供されています。
実は、よく似た名前の NearInteractionTouchable.csと言うスクリプトも存在します。
NearInteractionTouchable.csでは、Shpere Colliderには反応しませんでした。(SetTouchableColliderメソッドの引数がBoxColliderになっているから??)
間違えないようにNearInteractionTouchableVolume.csをアタッチしてください。
4) タッチ動作を扱う TouchHandler.cs
こちらも、MixedRealityToolkit-Unityで提供されています。
こちらもMonoBehaviourを継承しているため、Inspectorからセットできるようになっています。
IMixedRealityTouchHandlerがイベントを扱い
OnTouchStarted(HandTrackingInputEventData eventData);  // タッチ開始
OnTouchUpdated(HandTrackingInputEventData eventData);  // タッチで移動中
OnTouchCompleted(HandTrackingInputEventData eventData);  // タッチ終了
こちらのイベントもUnityのInspectorからセットできるようになっています。
上記の NearInteractionTouchableVolume.csをアタッチしていないと、検出されませんでした。
5) 自作した SphereBounse.cs
Bound(MixedRealityPointerEventData eventData)
クリックで反応するメソッド、今回は、クリックされている間はずっと反応させたかったので
OnPointerDraggedの時に呼び出しました。
ポイントは引数のMixedRealityPointerEventData で、
IMixedRealityPointerHandlerのOnPointerDragged(MixedRealityPointerEventData eventData);の 引数をそのまま渡すことができます。
eventData.Pointer.BaseCursor.Positionでカーソルの場所がVector3で取得できます。
BoundTouch(HandTrackingInputEventData eventData)
タッチで反応するメソッド、今回は、タッチされている間はずっと反応させたかったので
OnTouchUpdatedの時に呼び出しました。
IMixedRealityTouchHandlerのOnTouchUpdated(HandTrackingInputEventData eventData);の 引数をそのまま渡すことができます。

もちろん、自作のメソッドでIMixedRealityPointerHandler、IMixedRealityTouchHandlerをそれぞれ実装することも可能なのですが
実装したいイベントの後に、どのような処理をしたいか?に集中したほうがコードは短くなりますので、今回はこの実装をおこないました。

これ系のネタは、ほかの人もやっているんじゃないかと捜したところ
QiitaではUnityで3記事みつかりました。 。。。
ってか。もろ、タグが切られていてたww。

Clothで実装しているのが2記事

UnityのClothを使っておっぱいを作る - Qiita

Unityでゲームの制作をしているのですがキャラクターモデルのおっぱいを揺らしたいという話になりました。 胸にボーンがなく諸事情により増やすことも難しかったのでどうしたもんかなと思っていたところ UnityのCloth(布のシミュレーション)を使えば擬似的におっぱいを作れそうだなと思ったのでやって見ることにしました。 最終的にはこんな感じになりました まず今回使用する 被害者モデルがこちら ...

【Unity】おっぱいを揺らして触る技術【VR】 - Qiita

どうも、趣味でVRゲームを作ってるおっぱい大好きエンジニアです。 その製作中におっぱいの動きで悩んだところがありました。 他のおっぱい大好きなゲームエンジニアのためにも、 どのようにおっぱいの実装をしたのか残そうというコンセプトです。 「おっぱい」ってタグあるのね 結果として次のような動きができるようになりました。 揺れるおっぱい上げときますね ...
Rigitody、Spring Jointで実装しているのが1記事

Unityでおっぱいを揺らす - Qiita

これはマイネットエンターテイメント Advent Calendar 7日目の記事です。 ふと揺れるおっぱいが見たい気持ちになったのですが、MayaやLive2Dを買うお金がないので気合いで作りました。 Unity (4.x or 5.x 無料版でおk) おっぱい素材 Rigitbodyコンポーネントだけのオブジェクト。 停止してほしいので、RigitodyのUse Gravityはオフ、Constraintsは全部チェックつける。 Spring Jointコンポーネントを追加し、Connected Bodyに「1つめ」のオブジェクトを指定。それ以外の値は適当です。 RigitbodyのMassを小さめにしています。 基本的に2つめのSpring Jointと同じです。 Connected Bodyに「2つめ」のオブジェクトを指定。 RigitbodyのMassを調整していい感じにばいんばいんするようにする(*´Д`) コツとしては、 Springを大きめにすると激しくなって楽しい Damperを0にしないと停止してしまう Max Distanceは小さすぎず、大きすぎず・・・ Mathでばいんばいん具合を調整 こんな感じになれば、ほら、楽しそうな予感が( ˆωˆ) Mesh Rendererは確認用なので、あってもなくてもおkです。 犠牲者 インポート設定は特に不要です。 空気を読んでそれっぽいものを作成 インポート設定でTexture Type「Normal map」 Create from Grayscaleにチェックをつけるといい感じにノーマルマップを作成できます。 マスクはアルファチャンネルを使用するので、Photoshopで↓こんな感じになっていないとダメです。(RGBチャンネルは使用しないので無しでおk) インポート設定は特に不要です。 マスクのアルファチャンネルを使ってテクスチャーを動かします。 ノーマルマップは設定しなくても大丈夫ですが設定したほうが影ができて興奮できます。 Shader "pai" { Properties { _Color ( "Main Color" , Color ) = ( 1 , 1 , 1 , 1 ) _Parallax ( "Height" , Range ( 0 .


あんたも好きねぇ。。


本当はHoloLens 2の実機が届いてたら実機で動かしたかったんですが。
残念ながら実機確認はできていません。ビルドして、 HoloLens 2のエミュレータでは動くのを確認しました。

多分 HoloLens 2実機でも動くと思うよ。。

2019年12月8日日曜日

[HoloLens Advent Calendar 2019] 8日目 Mixed Realty Tookit Unity v2 Spatial AwarenessのMeshをUnity Editor上で出す方法

お疲れ様です。ZuQ9->Nnです。
この記事は、HoloLens Advent Calendar 2019、8日目
2019/12/08 の内容です。

Mixed Realty Tookit Unity v2(以下MRTKv2)が正式にリリースされて結構時間が経ってしまいました。
MRTKv2は、以前のHoloToolkitと比べて、かなり変更がされていて、非常に内容も多く、
今まで、出来ていたことも、ん?どこいった?という迷いが多くなりました。

Spatial Awarenessもその一つです。以前のToolkitではSpatial Mappingとよばれていました。
特にUnity Editor上でメッシュが表示できていたのですが、MRTKv2ではどうやるんだ?と、ずっと疑問に思っていました。
しかし、なんと実は、Microsoftの公式のドキュメントに、キッチンと書いてありました。。orz..
その記事がこちら。。

Configuring Mesh Observers for Editor

A convenient way to provide environment mesh data in the Unity editor is to use the SpatialObjectMeshObserver class. The Spatial Object Mesh Observer is an editor-only data provider for the Spatial Awareness system that enables importing 3D model data to represent a spatial mesh.

単純に、記事が日本語になっておらず、読み飛ばしてしまっていただけですね。。
現在、日本語化も進められているようですが、同じように、読み飛ばしている人もいそう

なので、改めて、僕のほうで、手順をまとめてみました。
今回の僕のためした環境は、Unity 2019.2.12f1
Microsoft Mixed Reality Toolkit v2.1.0(Microsoft.MixedReality.Toolkit.Unity.Foundation.2.1.0.unitypackage) を利用しました。
まずは、適当な名前でUnityでプロジェクトを作成(僕はTestとしました。)
Microsoft.MixedReality.Toolkit.Unity.Foundation.2.1.0.unitypackageをUnityにインポートします。
Apply Mixed Reality Toolkit Default Settings?
のダイアログが表示されますので、Applyを押します。

Unityのメニューに、Mixed Relaity Toolkitが表示されますので、
そこから。Add to Scene and Configureを選びます。
Select MixedRealityToolkitConfigurationProfileのダイアログが表示されます。
こちらは、開発環境に合わせて選択しますが、今回は、
DefaultMixedRealityToolkitConfigurationProfileを選択します
* ちなみに、DefaultHololens1ConfigurationProfile、
DefaultHololens2ConfigurationProfileでも行いましたが、
残念ながら、同じ作業を行ってもUnity Editor上では表示されませんでした。

Hierarchyに、MixedRealityTookitとMixedRealityPlayspaceが自動追加されますので、
MixedRealityTookitを選択、InspectorのCopy & Customizeボタンを押します。
Cone Profileのダイアログが表示されます。Profile Nameを指定して
Cloneボタンを押します。Profile Nameは内容に合わせて決めてください。
今回は、TestMixedRealityToolkitConfigurationProfileとしました。

Active ProfileがTestMixedRealityToolkitConfigurationProfileに切り替わっているのを確認し
Spatial Awarenessを選択、DefaltMixedSpatialAwarenessSytemProfilの横のCloneボタンを押します。

Spatial Awareness用のCone Profilダイアログが表示されます。Cloneボタンを押します。
Profile Nameは内容に合わせて決めてください。
今回は、TestSpatialAwarenessSystemProfileとしました。
TestMixedRealitySpatialAwarenessSystemProfileに切り替わっているのを確認し
Mixed Reality Spatial Mesh Observerの三角マークをクリックして展開します。


展開した、Windows Mixed Reality Spatial Mesh Observerの
TypeのドロップダウンからWindows.MixedReality.Toolkit.SpatialObjectMeshObserver > SpatialMeshObserverを選択してセットします。
設定は以上で、Unityの実行ボタンを押すとUnity Editorでメッシュが表示確認を行うことができます。
確認した範囲内では特にUnityのSwitch PratformでUnivaersal Windows Platformに
切り替える必要もありませんでした。

MRTKv2では、Prefabを置くのではなく、各設定のProfileを
Cloneしてカスタマイズしていくオペレーションに大きく変わりました。
かなり慣れが必要になるかと思いますが、何度か繰り返して覚えなおすしかないと思います。

-----------------------------------------------------------------------------------------------------------------------
ここからの内容は表示されているメッシュをさらにカスタマイズしたい場合で
表示して確認したいだけの人は読み飛ばしてください。

メッシュの表示をカスタマイズする場合は、
DefultObjectMeshObserverProfileの横のCloneボタンをクリック

Clone Profileのダイアログが表示されるので、 DefultObjectMeshObserverProfileの横のCloneボタンをクリック、Profile Nameを指定してCloneボタンを押します。
Profile Nameは内容に合わせて決めてください。
今回は、TestSpatialObjectMeshObserverProfileとしました。

TestSpatialObjectMeshObserverProfileに切り替わっているのを確認し
Visual Materialの横のボタンをクリックします。

Select Materialのダイアログが表示されますので
ワイヤーフレーム用のMaterialを選択します。
今回は、用意されていたMRTK_WireframeBlueを選択しました。

設定は以上で、Unityを実行するとワイヤーフレームの色が変更されているのが確認できます。

SpatialObjectMeshObserverProfileのDisplay SettingsのDisplay Optionのドロップダウンを
Noneにするとワイヤーフレームを非表示にできたり、
Spatial Mesh Objectに指定されているPrefabを変更することで
表示される部屋自体を変更する事もできます。

ProfileをCopyしてカスタマイズ。やはりそれが基本ですね
このオペレーションを何度も繰り返してMRTKv2に慣れ
Profileのどの項目を、どう変更すれば何が起こるのか?

こちらを把握していくことから初めて行くのが攻略の近道かなと感じました。
と。。ここまで書いたんですが。この記事を書き終えた後。

もう一度、よくよくググッてみたら。日本語の情報も普通に出てました。。 Orz..
チュートリアルは、一度目を通していた方が良さそうですね。

入門チュートリアル-3. ユーザーインターフェイスを作成し、Mixed Reality Toolkit を構成する - Mixed Reality

前のレッスンでは、HoloLens 2 の最初のアプリケーションを開始することで、Mixed Reality Toolkit (MRTK) が提供する必要のある機能について説明しました。 In the previous lesson, you learned about some of the capabilities the Mixed Reality Toolkit (MRTK) has to offer by starting your first application for the HoloLens 2.

2019年6月22日土曜日

[Oculus Quest 開発] Oculus Integration に含まれるLaserPointerについて。

お疲れ様です。ZuQ9->Nnです。

2019年6月のはじめくらいに
Oculus Quest を購入しました。
折角、購入したので、開発しないと勿体ないとおもったため
ゆるゆると開発を始めていました。

どうしても、さぼるだろうなと感じていたために
2019年6月1日(土)に開催された
【しなもく会特別版】Quest開発もくもく会 等にも参加してしていました。

【しなもく会特別版】Quest開発もくもく会 (2019/06/01 14:00〜)

VR開発に詳しいSynamonのUnityエンジニアと、一緒にQuest開発をもくもくできる会 「開発とか作業をしたいけど、自分の部屋だとやる気がでなくて...」 「Questが届いたのでさっそくみんなでワイワイやりながら開発したい!」 「AndroidベースのVR開発に関する新しい知見が欲しい...」 「VR転職に興味ある!けど知り合い全然いない...知り合い欲しい...」 ...
実は、以前に少しだけ、業務でOculus Goのアプリを開発したときに
UIを操作するときにLaserPointerを表示しているサンプルがあったなぁと
かすかな記憶に残っていました。

ググってみると。いくつかLaserPointerを表示する技術記事が見つかりました。
これらの技術記事の中では、LaserPointerのSriptを自作しています。
しかし、2019年6月のOculus Integrationの中 Assets > Oculus > SampleFramework > Core > Scriptsに LaserPointer.csというScriptが含まれていました。なので、わざわざ自作必要は無いのでは? というモヤモヤが自分の中に生まれてきました。

すでに、こちらのQiita記事 に記述されているんですが。

Oculus QuestでuGUIを操作する - Qiita

はじめに 基本的にはOculusGoなどと同じですが、少し情報が古くなっているので、2019.06時点での情報を記して置きます。 Oculus Go 開発メモ - uGUI編 - Qiita https://qiita.com...
Oculus Integration に含まれるLaserPointerは、
Assets > Oculus > SampleFramework > Core > Prefabsの中の
UIHelpersのPrafabにまとめられています。


UIHelpersのPrafabは
  • LaserPointer
  • Shpere
  • EventSyste
の3つのGameObjectで構成されています。
それぞれ、細かく内容を見てみましょう
LaserPointerのGameObjectは、LaserPointer.csのScriptと
Line Renderがアタッチされています。

ShpereのGameObjectは3DオブジェクトのShpereが
Scale x 0.01 y 0.01 z 0.01となっています

 EventSystemのGameObjectはUnityのEventSystemと
OVRInputModule.csのスクリプトがアタッチされており、
CursorのプロパティにLaserPointerがアタッチされています。

また、UIHelpersそのものには、HandedInputSelector.csのScriptがアタッチされています。

HandedInputSelector.csの中身は、OVRInput.GetActiveController()で
アクティブなコントローラーを取得し、OVRInputModuleのrayTransformを右か左のHandAnchorにセットしています。

実際にLaserPointerを利用しているサンプルは、
Assets > Oculus > SampleFramework > Usage > DebugUI.unityのSceneが参考になります。

DebugUIのHierarchy、CanvasWithDebugにDebuUIBuilder.csの
UI Helper To InstantiateのプロパティにUIHelpersのPrefabがアタッチされています。
また、Laser Beam BehaviorをONに変更することで
常にLaserPointerを表示し続けることが可能です。


本当は、VRChatのアプリのように両方のコントローラーから
LaserPointerを表示してUI操作をおこないたったのですが、
色々、自分で独自Scriptを記述したり試してはみたのですがうまくいきませんでした。orz..

まぁ、今後も、こんな感じでゆるりと Oculus Quest 開発は続けていきたい。