MRが楽しい

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

SpatialMappingのデータにNavMeshを適用する その3

前回記事の続きです。
bluebirdofoz.hatenablog.com

前回参考にしていた記事に続きがありましたので、こちらの動作も確認してみることにしました。
tarukosu.hatenablog.com
経路探索のロジックを応用して、現在位置から目的地の道筋を表示します。

本章ではSDユニティちゃんは用いません。
Agent設定を行ったその1終了時点のプロジェクトから作業を開始します。
bluebirdofoz.hatenablog.com

プロジェクトのバックアップがない場合は以下のように、SD_unitychan_humanoid オブジェクトと MoveToClickPoint オブジェクトを無効化する形でも問題ありません。
f:id:bluebirdofoz:20170811020940j:plain

最初に、目的地を表すオブジェクトの Destination オブジェクトを以下の手順で作成します。
1.Hierarchyを右クリックして 3DObject -> Cilynder でオブジェクトを作成する。
2.オブジェクト名を Destination に設定する。
3.Transform を以下の設定値に変更する。

Position X 0    Y 0.5 Z 0
Rotation X 0    Y 0   Z 0
Scale    X 0.05 Y 0.5 Z 0.05

f:id:bluebirdofoz:20170811020949j:plain

参考記事の DestinationPlacement.cs スクリプトを作成し、Destination オブジェクトに追加します。
f:id:bluebirdofoz:20170811021000j:plain

今回も unity 上で動作確認を行うため、DestinationPlacement.cs について以下のコードを追加しました。
・MoveToClickPoint.cs

  void Update()
  {
    if (Input.GetKeyDown(KeyCode.Space))
    {
      Debug.Log("click LOG");
      var hitInfo = GazeManager.Instance.HitInfo;
      transform.position = hitInfo.point + transform.localScale.y * Vector3.up;
    }
  }

次に経路探索と経路表示を行うゲームオブジェクトを作成します。
1.空の GameObject を作成する。
2.オブジェクト名を HumanNavigation に設定する。
3.NavMeshAgent をアタッチする。
4.LineRenderer をアタッチする。
f:id:bluebirdofoz:20170811021030j:plain


参考記事の HumanNavigation.cs スクリプトを作成し、HumanNavigation オブジェクトに追加します。
追加後、Inspector タブの DestinationDestination オブジェクトを設定します。
f:id:bluebirdofoz:20170811021042j:plain

シーンを再生して、目的地に視点を合わせてスペースキーを押下すると……。
f:id:bluebirdofoz:20170811021054j:plain
目的地までのルートが表示されました。成功です。

道案内のラインの太さや色は HumanNavigation オブジェクトの LineRenderer を設定することで変更可能です。
f:id:bluebirdofoz:20170811021107j:plain

SpatialMappingのデータにNavMeshを適用する その2

前回記事の続きです。
bluebirdofoz.hatenablog.com

本記事は以下の記事を参考に作業を実施します。
tarukosu.hatenablog.com

「SDユニティちゃんを歩かせてみる」の項目からの実施になります。
まずは利用規約を確認し、以下のSDユニティちゃんデータを取得します。
・SDユニティちゃん 3Dモデルデータ
 http://unity-chan.com/download/releaseNote.php?id=SDUnityChan

前回作成したプロジェクトを改めて開きます。
ダウンロードした SD_UnityChan パッケージをプロジェクトに取り込みます。
f:id:bluebirdofoz:20170810023709j:plain

Assets/UnityChan/SD_unitychan/Prefabs 配下から SD_unitychan_humanoid.prefab をシーンに追加します。
f:id:bluebirdofoz:20170810023718j:plain

次に SD_unitychan_humanoiod オブジェクトのコンポーネントを以下の通り、設定します。
1.調整した Agent の大きさに合うようスケールを全て 0.3 に設定する。
2.SD_unitychan_humanoid にアタッチされている Script について全て無効化する。
3.NavMeshAgent のコンポーネントをアタッチする。
f:id:bluebirdofoz:20170810023727j:plain
NavMeshAgent の Speed や Obstacle は参考記事を元に値を調整しています。
Agent の希望する移動速度やモデルの大きさに合わせて設定するようです。

次に SD_unitychan_humanoid の移動モーションを設定します。参考記事にある通り、下記を参照します。
tsubakit1.hateblo.jp

最初に Animator コンポーネントにある ApplyRootMotion のチェックを外します。
f:id:bluebirdofoz:20170810023750j:plain
これでキャラクタの移動は NavMeshAgent または Scriptでしか動かなくなります。

Assets で右クリック -> Create -> AnimatorController で新しいアニメーションコントローラを作成します。
f:id:bluebirdofoz:20170810023801j:plain

作成した Animator を開いたら Float 型の Speed パラメータを追加します。
f:id:bluebirdofoz:20170810023811j:plain

モーションの設定として「ブレンドツリー」の機能を使います。
Animator ビュー上で右クリック -> CreateState -> FromNewBlendTree で「ブレンドツリー」の State が作成できます。
f:id:bluebirdofoz:20170810023821j:plain

作成された BlendTree を選択し、Motion に設定されている BlendTree をダブルクリックします。
f:id:bluebirdofoz:20170810023831j:plain

すると BlendTree の Inspector タブが表示されます。
まず Motion の「+」ボタンを押下して AddMotionField を選択し、3つのモーションを追加します。
f:id:bluebirdofoz:20170810023842j:plain

次に AutomateThresholds のチェックを外します。
すると、閾値の設定が手動で行えるようになるので、Motion と Threshold を以下の通り設定します。
f:id:bluebirdofoz:20170810023853j:plain
ちなみにモーション選択の際、SDユニティちゃんをそのままインポートしていると、それぞれ同名の2種類のモーションがあります。
このとき、~_humanoid というファイル名になっている方のモーションを選択するようにします。

以上でアニメーションコントローラの作成は完了です。
SD_unitychan_humanoid オブジェクトの Animator にコントローラを設定します。
f:id:bluebirdofoz:20170810023905j:plain

移動中に Speed パラメータを操作してモーションを再生するスクリプトを用意します。
参考記事の unitychanAnimation.cs スクリプトを作成し、SD_unitychan_humanoid オブジェクトに追加します。
f:id:bluebirdofoz:20170810023915j:plain

最後にタップ位置まで移動するスクリプトを用意します。
以下の手順で MoveToClickPoint オブジェクトを作成します。
1.空オブジェクトの MoveToClickPoint オブジェクトを作成する。
2.参考記事の MoveToClickPoint.cs スクリプトを作成し、MoveToClickPoint オブジェクトに追加する。
3.MoveToClickPoint.cs スクリプトの Agent に SD_unitychan_humanoid オブジェクトを設定する。
4.MoveToClickPoint オブジェクトに LineRenderer コンポーネントを追加する。
f:id:bluebirdofoz:20170810023924j:plain

unity 上で動作確認を行うため、MoveToClickPoint.cs について以下のコードを追加しました。
・MoveToClickPoint.cs

  void Update()
  {
    if (Input.anyKeyDown)
    {
      Debug.Log("click LOG");
      if (GazeManager.Instance.IsGazingAtObject)
      {
        var hitInfo = GazeManager.Instance.HitInfo;
        if (!Agent.gameObject.activeSelf)
        {
          Agent.gameObject.SetActive(true);
          Agent.transform.position = hitInfo.point;
        }
        else
        {
          Agent.destination = hitInfo.point;

          // パスの計算
          var path = new NavMeshPath();
          NavMesh.CalculatePath(Agent.transform.position, Agent.destination, NavMesh.AllAreas, path);
          var positions = path.corners;

          // ルートの描画
          lineRenderer.widthMultiplier = 0.1f;
          lineRenderer.positionCount = positions.Length;
          for (int i = 0; i < positions.Length; i++)
          {
            Debug.Log("point " + i + "=" + positions[i]);
            lineRenderer.SetPosition(i, positions[i]);
          }
        }
      }
    }
  }

シーンを再生して、移動先に視点を合わせてマウスクリックを行うと……。
f:id:bluebirdofoz:20170810023937j:plain
SDユニティちゃんが NavMesh の移動可能範囲に沿ってルートを自動生成して歩きました。成功です。
こんなに簡単に動的な経路探索のロジックが利用できるとは驚きです。

次回は経路探索のロジックを応用して、現在位置から目的地の道筋を表示する機能を試してみます。
bluebirdofoz.hatenablog.com

SpatialMappingのデータにNavMeshを適用する その1

本日は技術調査枠です。
実を言うと、おいかけっこアプリについて今月中には一旦コミットとしてしまいたいと考えています。
そして、一つだけ本アプリで試しておきたい技術があります、NavMesh です。
今回はその NavMesh の技術について学習します。
以下の記事を参考にします。
tarukosu.hatenablog.com

以下の NavMeshComponents リポジトリをサンプルとして利用します。
github.com

最終的な目標は、おいかけっこアプリへの反映を行うことです。
しかし、まずは技術の理解のため、新プロジェクトを作成して記事に沿う形で進めます。

まずは新規プロジェクトを作成します。
f:id:bluebirdofoz:20170809013021j:plain

次に、HoloToolkitをインポートします。
f:id:bluebirdofoz:20170809013032j:plain

Main Camera を削除し、以下のプレハブを追加します。
・HoloLensCamera
・InputManager
・CursorWithFeedback
・SpatialMapping
f:id:bluebirdofoz:20170809013042j:plain

NavMeshComponents に入っている以下のスクリプトをインポートします。
・LocalNavMeshBuilder.cs
・NavMeshSourceTag.cs
f:id:bluebirdofoz:20170809013103j:plain

NavigationManager オブジェクトを作成し、先ほどの LocalNavMeshBuilder.cs をアタッチします。
f:id:bluebirdofoz:20170809013115j:plain

新たに SpatialMappingNavMesh.cs というスクリプトファイルを作成します。
f:id:bluebirdofoz:20170809013128j:plain
コード内容は参考記事の SpatialMappingNavMesh.cs を参照ください。
SpatialMapping のSurfaceオブジェクトにNavMeshSourceTagをアタッチする処理を行います。

作成した SpatialMappingNavMesh.cs を NavigationManager オブジェクトにアタッチします。
f:id:bluebirdofoz:20170809013138j:plain

Inspector タブの SpatialMapping に SpatialMapping オブジェクトを設定します
f:id:bluebirdofoz:20170809013148j:plain

メニューから Windows -> Navigation で Navigation タブを開きます。
その中の Agents 設定を開き、移動物の大きさや乗り越えられる高さの設定を行います。
f:id:bluebirdofoz:20170809013159j:plain

設定を行い、シーンを再生してみると……。
f:id:bluebirdofoz:20170809013215j:plain
移動可能な範囲が水色でマッピングされました。成功です。
次回は NavMesh を用いたキャラクタの移動を試してみます。
bluebirdofoz.hatenablog.com

hololensでパネルUIにカーソルを表示する

本日はおいかけっこアプリの改修枠です。
以前追加した吹出型のパネルUIに、カーソルを表示します。

まず単純にカーソルを表示させる方法についてHoloToolKitのInputManagerを利用します。
HoloToolKit/Input/Prefabs/Cursor配下にあるCursor.prefabをHierarchy内にドラッグします。
f:id:bluebirdofoz:20170808023049j:plain

HoloToolKit/Input/Script/Gaze配下にあるGazeManager.csをアタッチします。
f:id:bluebirdofoz:20170808023108j:plain

今回はお試しのため、Cursorオブジェクトに追加していますが。
GazeManager.csはシングルトンなので別途Manager用オブジェクトを作成して、そこにアタッチした方がよいです。

試しに動かしてみると、カーソルが表示されました。
f:id:bluebirdofoz:20170808023119j:plain

しかし、このままだとカーソルが常に表示された状態となり、カーソルを利用しないときには見ずらいです。
吹出型のパネルUIを見たときのみ、カーソルが表示されてほしいところです。

こちらもHoloToolKitで提供されている機能を利用して設定可能です。
まず、GazeManagerのRaycastLayerMasksを開きます。
f:id:bluebirdofoz:20170808023130j:plain

デフォルトでは複数のレイヤが衝突判定先として指定されいるので、UI のみを選択します。
f:id:bluebirdofoz:20170808023141j:plain

衝突判定を行いたいオブジェクトのレイヤを UI に変更します。
f:id:bluebirdofoz:20170808023154j:plain

これで指定のオブジェクトに対してのみ、カーソルが有効になります。
f:id:bluebirdofoz:20170808023203j:plain
レイヤを用いるので、あるオブジェクトの中に存在する、特定のオブジェクトにのみ判定を行うといったことも可能です。

HoloLensの開発環境構築手順 TortoiseSVN編

TortoiseSVN のインストール手順を記録します。

TortoiseSVNのダウンロードページは以下です。
tortoisesvn.net
2017/8/5現在、TortoiseSVNの最新バージョンは 1.9.6 です。

ダウンロードページの Download タブを選択します。
f:id:bluebirdofoz:20170807224122j:plain

32bit版と64bit版があるのでOSに合わせて選択します。
f:id:bluebirdofoz:20170807224139j:plain

ページ下部には言語パックのインストーラもあります。
TortoiseSVNを日本語化して利用したい場合はこちらもダウンロードします。
f:id:bluebirdofoz:20170807224156j:plain

なおPC毎にバージョンの異なるSVNを利用するのも怖いので今回の記事では 1.9.5 を利用しています。


ダウンロードした TortoiseSVN-1.9.XXXXX-x64-svn-1.9.X.exe を実行します。
インストーラが起動するので、Next をクリックします。
f:id:bluebirdofoz:20170807224206j:plain

利用規約が表示されます。確認したら Next をクリックします。
f:id:bluebirdofoz:20170807224215j:plain

インストールするコンポーネントを選択して、Next をクリックします。
基本的にはデフォルトのままで問題ありません。
f:id:bluebirdofoz:20170807224223j:plain

install をクリックします。
f:id:bluebirdofoz:20170807224238j:plain

これでTortoiseSVNのインストールは完了です。
f:id:bluebirdofoz:20170807224248j:plain


次に、日本語化の手順です。
ダウンロードした LanguagePack-1.9.XXXXX-x64-ja.exe を実行します。
インストーラが起動するので、次へをクリックします。
f:id:bluebirdofoz:20170807224257j:plain

日本語の言語パッケージがインストールされます。
f:id:bluebirdofoz:20170807224309j:plain

TortoiseSVNの設定画面から「日本語」の言語を選択します。これで設定完了です。
f:id:bluebirdofoz:20170807224317j:plain

HoloLensの開発環境構築手順 VisualStudio編

VisualStudio のインストール手順を記録します。
以下のUnityインストール手順で Visual Studio 2017 をインストール済みの前提となります。
bluebirdofoz.hatenablog.com
本記事では hololens アプリ開発に必要なツールの追加インストールを実施します。

VisualStudioのダウンロードページは以下です。
・Downloads and tools for Windows 10
 https://developer.microsoft.com/en-us/windows/downloads
2017/8/5現在、インストールするのは Visual Studio 2017 です。

ダウンロードページの Visual Studio Community を選択します。
f:id:bluebirdofoz:20170806025529j:plain

ダウンロードした vs_community.exe を実行します。
インストーラが起動し、ライセンス条項が表示されます。続行をクリックします。
f:id:bluebirdofoz:20170806025537j:plain

Unityのインストールで Visual Studio 2017 をインストール済みの場合、以下のウィンドウが表示されます。
hololens 開発に必要なツールを追加するため、Community の変更をクリックします。
f:id:bluebirdofoz:20170806025546j:plain

追加するツールの一覧が表示されます。
「ユニバーサル Windows プラットフォーム開発」にチェックをし、変更をクリックします。
f:id:bluebirdofoz:20170806025600j:plain

インストールが開始します。後は完了まで待つだけです。
f:id:bluebirdofoz:20170806025609j:plain

以上で VisualStudio のインストールは完了です。
UnityのプロジェクトからUWPアプリを開発する環境が整いました。


以下、インストール後の開発でのtipsです。

・UWPアプリインストール時の設定
新しい端末で hololens にUWPアプリをインストールするには「開発者モード」に設定する必要があります。
f:id:bluebirdofoz:20170806030006j:plain
VisualStudioの初回起動時に案内が表示されますが、何らかの原因で設定の切り替えが行えていないケースがあるようです。
その際は以下を参考に手動で設定を行います。
forums.hololens.com
blog.xin9le.net

また、リモートでインストールを行う際には、PINの入力が必要です。
f:id:bluebirdofoz:20170806025955j:plain
hololens を起動して、Settings -> Update&Security -> ForDevelopers から Pair ボタンをクリックしてください。
表示された番号を入力すれば、アプリをリモートでインストールできます。

HoloLensの開発環境構築手順 Unity編

2017/10/21現在。以下の 2017.2 版のインストール記事を新たに作成しました。
bluebirdofoz.hatenablog.com
以下は2017/8/5時点の 2017.1 版のインストール手順となります。

Unityのインストール手順を記録します。

Unityのダウンロードページは以下です。
store.unity.com
2017/8/5現在、Unityの最新バージョンは version 2017.1 です。

利用規約に同意して、Unityのインストーラをダウンロードします。
f:id:bluebirdofoz:20170805230226j:plain

ダウンロードした UnityDownloadAssistant-2017.1.0f3.exe を実行します。
インストーラが起動するので、Nextをクリックします。
f:id:bluebirdofoz:20170805230240j:plain

利用規約が表示されます。チェックボックスをチェックし、Nextをクリックします。
f:id:bluebirdofoz:20170805230254j:plain

コンポーネントの選択しが表示されます。以下を選択し、Nextをクリックします。
・Unity 2017.1.0f3(デフォルトで選択済み)
・Documentation (デフォルトで選択済み)
・Standard Assets (デフォルトで選択済み)
Microsoft Visual Studio Community 2017 (デフォルトで選択済み)
Windows Store .NET Scripting Backend (追加で選択)
Windows Store IL2CPP Scripting Backend (追加で選択)
f:id:bluebirdofoz:20170805230303j:plain
f:id:bluebirdofoz:20170805230311j:plain

インストールディレクトリの選択です。
Unityのインストール先を指定し、Nextをクリックします。
f:id:bluebirdofoz:20170805230319j:plain

合わせてインストールする Microsoft Visual Studio利用規約に関する確認表示です。
チェックボックスをチェックし、Nextをクリックします。
f:id:bluebirdofoz:20170805230331j:plain

インストールが開始します。後は完了まで待つだけです。
f:id:bluebirdofoz:20170805230342j:plain

以上でUnityのインストールは完了です。
f:id:bluebirdofoz:20170805230350j:plain

追記。
2017/8/5現在、Unity5.6で作成したプロジェクトをUnity2017.1で読み込むとエラーが発生することがあります。
・Error Loading Launcher
 https://forum.unity3d.com/threads/error-loading-launcher.486127/

現状、明確な解決方法がありませんので、過去のプロジェクトを利用する場合は 2017.1 のインストールは控えた方が良さげです。
(自分もこの後、Unity5.6を改めてインストールし直しました)
よくよく読んでみると、空のプロジェクトでもエラーが発生したとあります。
2017.1 の不具合だとすれば解消されるのを待つのが吉ですね。