しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Unity で Spacial Maping 上にキャラモデルを立たせてみる

※ これは 2018/01/08 Unity 2017.3.0f3、Mixed Reality Toolkit 2017.2.1.3 Hot Fix 時点の情報です

最新版では動作が異なる可能性がありますのでご注意ください

ねこモデルがカメラの方向を向くようになったので、今度は HoloLens 上で現実世界の物体にねこモデルを立たせるようなに重ね合わせてみたい

f:id:matatabi_ux:20180315213837p:plain

HoloLens の環境マッピングの機能を利用すれば、周囲の物体の衝突判定が生成できるので可能なはず

まずは Mixed Reality Toolkit をインポートし、いつものように [Mixed Reality Toolkit]-[Configure] のメニューにある各種設定を実行し HoloLens 用の初期設定を行います

github.com

これまで Hierarchy 上に配置していた Cat のねこモデルは Assets 配下にドラッグドロップで Prefab 化して退避、Hierarchy 上のものは削除します

f:id:matatabi_ux:20180315214230p:plain

ねこモデルを退避するのは、はじめから配置されていると環境マッピングの衝突判定の生成が追い付かず、重力でモデルが落下し続けてしまうからです

環境マッピングの衝突判定が生成された後ににねこモデルを配置するように変更しようというわけです

さらに Hierarchy 上を整理

f:id:matatabi_ux:20180315214835p:plain

Directional Light は View という空 GameObject を作り、直下に移動させました

Mixed Reality Toolkit で追加された下記のものは MixedRealityTools という空 GameObject を作り、直下に移動させました

  • MixedRealityCameraParent
  • DefaultCursor
  • InputManager

続いて Assets/HoloToolkit/SpacialMapping/Prefabs/SpacialMapping の Prefab をドラッグドロップで MixedRealityTools に追加します

SpacialMapping は Spacial Mapping Manager の Surface Material が Wireframe になっていることを確認し、なってなければこちらに変更します

f:id:matatabi_ux:20180315215753p:plain

このように Wireframe のマテリアルがささっていると環境マッピングで生成された衝突判定がワイヤーフレームとして可視化されるようになります

次に ViewManager.cs というファイル名で下記のコードを追加

using HoloToolkit.Unity.SpatialMapping;
using UnityEngine;

/// <summary>
/// 表示物の管理クラス
/// </summary>
public class ViewManager : MonoBehaviour
{
    /// <summary>
    /// ねこモデルの Prefab
    /// </summary>
    [SerializeField]
    private GameObject catPrefab = null;

    /// <summary>
    /// 環境マッピング
    /// </summary>
    [SerializeField]
    private SpatialMappingSource spacialMapping;

    private Camera mainCamera = null;
    private Ray ray = default(Ray);
    private CatWalker cat = null;

    /// <summary>
    /// 開始前処理
    /// </summary>
    public void Awake()
    {
        this.mainCamera = Camera.main;
        
        // カメラの 2m 先の地点から直下方向の衝突判定用 Ray
        this.ray = new Ray(this.mainCamera.transform.position + this.mainCamera.transform.forward * 2f, Vector3.down);
    }

    /// <summary>
    /// 固定毎フレームの処理
    /// </summary>
    public void FixedUpdate()
    {
        if (this.cat == null && Physics.Raycast(this.ray))
        {
            // Spacial mapping が生成されたらねこを出現させる
            this.cat = Instantiate(this.catPrefab, this.ray.origin, Quaternion.identity, this.transform).GetComponent<CatWalker>();
        }
    }
}

やっていることはカメラ(HoloLens 装着者)の 2 m 先に、環境マッピングの衝突判定出現後にねこモデルを出現させることだけです

出現予定の地点から直下方向に Raycast を発射して衝突判定をすることで、環境マッピングの生成を判定しています

実際に衝突判定を確認することで、ねこモデルが垂直落下して突き抜けないようにしているという仕組みです

このスクリプトを Hierarchy 上の View の GameObject にアタッチ後、ねこモデルの Prefab と SpatialMappingSource をドラッグドロップで設定します

f:id:matatabi_ux:20180315221237p:plain

ここまでおわったらさっそくビルドし、HoloLens にインスト―ルして起動させてみます

f:id:matatabi_ux:20180315221408g:plain

ちゃんとねこがベッドの上に鎮座しました!