MRが楽しい

MRやVRについて学習したことを書き残す

HoloLensで現実世界に仮想オブジェクトを配置

hololensには空間マッピングの機能があり、HoloToolKitのSpatial mappingを利用することで
Unity上のデータオブジェクトとして空間マッピングのデータを利用することができます。

少し間が空きましたが、今回はチュートリアルの続きです。
・HOLOLENS 現実世界をマッピングし、ホログラムを動かす SPATIAL MAPPING
 https://azure-recipe.kc-cloud.jp/2016/12/hololens-tutorial6/

説明通りにチュートリアルを行い、アプリを実行してみました。


まず折り紙を注視しながらタップ操作を行います。
f:id:bluebirdofoz:20170415184242j:plain
すると、空間マッピングが表示され、折り紙をマッピングに沿う形で移動できます。
f:id:bluebirdofoz:20170415184248j:plain
位置を決めて、もう一度タップすると…
f:id:bluebirdofoz:20170415184254j:plain
タップした位置に固定されました。
折り紙ではなく絵画などをオブジェクトとすると、壁の好きなところに絵を張り付けたりできそうです。


今回の重要コードは以下。

TapToPlaceParent.cs

if (Physics.Raycast(headPosition, gazeDirection, out hitInfo,
                30.0f, SpatialMapping.PhysicsRaycastMask))

以前使ったGazeGestureManager.csのPhysics.Raycastと引数が異なりますね。

GazeGestureManager.cs

if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))

指定のオブジェクトを指定して衝突判定を取得できるという事でしょうか。
何らかのオブジェクトを無視してタップ操作を行いたい場合などには重宝しそうです。


次に、今回はオブジェクトの向きを決めるコードがありました。

TapToPlaceParent.cs

// Rotate this object's parent object to face the user.
Quaternion toQuat = Camera.main.transform.localRotation;
toQuat.x = 0;
toQuat.z = 0;
this.transform.parent.rotation = toQuat;

この記法を覚えておけば、オブジェクトをカメラに対して正面に向かせることができます。
なるほどなるほど。


また今回とは直接関係ないですが、個人的に気になったコードが以下。
TapToPlaceParent.cs

// If the user is in placing mode, display the spatial mapping mesh.
if (placing)
{
    SpatialMapping.Instance.DrawVisualMeshes = true;
}

SpatialMappingのインスタンスに何の参照の設定もなくアクセスできています。
今までだとCameraオブジェクトとかも何の関連付けもなく参照できていましたが…(Camera.mainとか)
え?Unityってどんなオブジェクト(MonoBehaviour)に対してもこの書き方ありだったの?
SpatialMappingが複数追加されていたらどうなるの?(今までの動きからおそらく全部対象になるんでしょうが)
個人的にメチャクチャ危険な記法に見えますが、どうなんでしょうか。
こんな記法を多用されたらプログラムの設計をコードからは追跡できない気がする。