前回に引き続き、空間マッピングを利用したプログラムの作成方法について解説します。

Project Settingsの設定

第3回でも解説したように、「Virtual Reality Supported」にチェックを入れて「Windows Holographic」を表示してください。今回はその手順に加えて一番下までスクロールし、「Capabilities」という項目の「SpatialPerception」をチェックしてください。

SpatialPerceptionという項目にチェックを付ける

SpatialMappingの設定

前回は「Gesture」の設定を行いましたが、今回は不要です。続いて行うのが「SpatialMapping」ですが、Unityメニューから「GameObject→Create Empty」と選択し、Hierarchy内に空のGameObjectを作成します。Projectの「HoloToolkit→SpatialMapping→Scripts」と選択して、「SpatialMappingManager.cs」をGameObjectにドラッグ&ドロップしてください。

HierarchyのGameObjectにSpatialMappingManager.csをドラッグ&ドロップする

その後、HierarchyのGameObjectを選択して、Inspectorを表示します。続いて、「Spatial Mapping Manager(Script)」内の「Surface Material」の右端隅にある○アイコン(下図参照)をクリックします。「Select Material」の画面が表示されるので「Wireframe」を選択してください。加えて「Draw Visual Meshes」もチェックします。

Surface MaterialにWireframeを指定し、Draw Visual Meshにもチェックを入れる

スクリプトの作成

いよいよ、「Heart Purple」を上から下に落とすスクリプトの記述です。

このスクリプトは「Main Camera」に記述します。HierarchyのMain Cameraを選択して、InspectorのAdd Componentから「New Script」を選び、「Name」に「SpaceMappingScript」を、Languageに「C Sharp」を選択して「Create and Add」をクリックします。すると、Main CameraのInspectorに「Space Mapping Script(Script)」が追加されます。Scriptの「SpaceMappingScript」をダブルクリックすると、Visual Studio 2015が起動します。

Main Cameraに「Space Mapping Script(Script)」が追加された

Visual Studio 2015の起動

Visual Studio 2015が起動したら、リスト1のコードを記述します。

リスト1「カメラの1.5m手前から1秒おきにハートのオブジェクトが落ちてくる処理」

using UnityEngine;
using System.Collections;

public class SpaceMappingScript : MonoBehaviour
{
    public Transform myHeart;
    void Start()
    {
        StartCoroutine(CreateHeart());
    }

    private IEnumerator CreateHeart()
    {
        while (true)
        {
            float distance = 1.5f;
            var x = distance * Mathf.Sin(transform.rotation.eulerAngles.y * Mathf.Deg2Rad);
            var z = distance * Mathf.Cos(transform.rotation.eulerAngles.y * Mathf.Deg2Rad);

            Instantiate(myHeart,new Vector3(x, 1, z), Quaternion.Euler(0, transform.rotation.eulerAngles.y, z));
            yield return new WaitForSeconds(1);
        }
    }
}
参照URL
HoloLensの環境マッピング(Spatial Mapping)の使い方
Unity キャラの正面をとらえるカメラ

Transform型でpublicなmyHear変数を宣言します。publicで宣言しておくと、ビルドした後、Main CameraのInspectorの「Space Mapping Script(Script)」に「My Heart」という項目が追加されます。

続いて、Startメソッド内でStartCoroutineを使用し、CreateHeartコルーチンを実行します。コルーチンは、実行を停止してUnityへ制御を戻す一方、続行する際には停止したところから次のフレームで実行を継続できる関数のことです。

コルーチンの作成にはIEnumeratorを利用して、CreateHeartコルーチンを作成します。カメラと落ちてくるハートの間の距離は1.5メートルとして、ハートがカメラの正面に落ちるように下記の処理で定義しました。

var x = distance * Mathf.Sin(transform.rotation.eulerAngles.y * Mathf.Deg2Rad);
var z = distance * Mathf.Cos(transform.rotation.eulerAngles.y * Mathf.Deg2Rad);

Instantiateを使って、「Heart Purple」のプレハブをインスタンス化し、カメラの正面に落ちてくるよう設定します。

yield return new WaitForSeconds(1);

上記の定義で、1秒ごとに「Heart Purple」がインスタンス化されて落ちてきます。

以上の作業が終わりましたら、Visual Studio 2015をビルドして終了してください。Unityの画面に戻ると、「Space Mapping Script(Script)」が下記のように表示されているとおもいます。

My Heartの項目が追加されている

ここで「None(Transform)」の位置に、Assetフォルダにある「Heart Purple.prefab」をドラッグ&ドロップしてください。

Heart Purple.prefabをドラッグ&ドロップ

Build Settingsの設定

「Build Settings」の設定については第4回と同じ手順ですが、「Add Open Scenes」の指定だけは忘れないでください。書き出しが成功すると、作成したHoloLensのフォルダが選択されて表示されます。

HoloLensのフォルダ内を見ると、「SpaceMapping.sln」というファイルが作成されています。HoloLensをPCと接続して起動した後、このファイルをダブルクリックしてVisual Studio 2015を起動してください。

HoloLensへのデプロイ

ここまで来たら、Visual Studio 2015内でコードを触ることは一切なく、HoloLensへのデプロイ(配置)を行うだけです。

Visual Studio 2015の上のバーの「Debug」と表示されている箇所に「Release」、「ARM」と表示されている所に「x86」、「ローカルコンピューター」と表示されている所に、HoloLensとPCをUSBケーブルで接続している場合は「Device」を指定します。「Device」の左横にある右向きの△アイコンをクリックすると、デプロイ(配置)が開始されます。

デプロイに成功して表示された画面から「デバッグの続行」をクリックしてください。Unityのタイトルが表示された後、「Heart Purple」が降って来るようになります。最初こそ床をすり抜けますが、しばらくすると部屋のスキャンが始まり、障害物の上にハートが積み重なっていくはずです。

Heart Purpleが部屋に溜まる。網目の模様が背景に表示されているのは、室内をスキャンしている状態。室内のスキャンが終われば網目は消せる

この2回に渡って解説した処理の半分は、Air Tapの第4回と同じ処理です。繰り返しの作業にはなりますが、身体に覚え込ませることでHoloLensアプリ開発が容易になりますので、頑張ってください。

次回は、「視線移動(Gaze)によるプログラミング」について解説します。