MRが楽しい

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

hololensで画面UIを表示する

今回は新機能実装です。
前回の設計で画面表示UIオブジェクトの枠を設けたので、画面UIの表示を試しておきたいのです。
以下を参考に画面UIを実装します。
・【HoloLens】Unityでスタートメニューみたいな追従するUIを作る
 http://kzonag.hatenablog.com/entry/2016/08/14/163736

記事を元に実装を行います。HoloToolkitの利用が前提となるようです。
環境の整った追いかけっこアプリに追加します。
(更にスパゲッティ化が進みますが、プロジェクトを何個も作ると容量が増えるのです。。)

ざっくりめの記事なので折角なので本ブログでも一つ一つ確認していきます。まずはカメラ設定です。
エミュレータでのUIの見え方をhololensと合わせるため、Field of Viewの値を変更します。
f:id:bluebirdofoz:20170428020744j:plain
ここで早速分からない点があります。Field of Viewの値って幾らに設定するのが妥当何でしょうか。
以下に情報がありました。hololensアプリ開発の場合、17.82が適正と結論付けています。
・Unity Camera FOV?
 https://forums.hololens.com/discussion/6839/unity-camera-fov
・PLAYING WITH THE HOLOLENS FIELD OF VIEW
 http://www.imaginativeuniversal.com/blog/2017/03/18/playing-with-the-hololens-field-of-view/

エディタやエミュレータの環境をhololensに近づけたい場合、この辺りの角度を設定すれば良さそうです。
記事元の方も算出方法は不明ですが、17.989とこれに近い数字を設定しています。

17.82を設定してみました。
f:id:bluebirdofoz:20170428020840j:plain
こう見るとやっぱりhololensの視野角は狭い。


次にキャンバス設定です。
GameObject->UI->Canvasを選択し、オブジェクトを作成します。
f:id:bluebirdofoz:20170428020850j:plain
キャンバスの設定は記事のままに設定します。スケールを小さくしておくのは後の微調整で非常に便利ですね。


次にEventSystem設定です。
EventSystemオブジェクトに HoloLens Input Moduleを追加するとAirTap等のジェスチャーで操作できるようになるとのことです。
f:id:bluebirdofoz:20170428021023j:plain
AddComponentを押下し、Event->HoloLens Input Moduleで追加できます。
(Event側にあると気付かず、探しまくった…どちらにせよ検索で名前を入力すれば出てくるはずです)

しかし、既にタップ操作によるUIまで提供されていましたか…。早速、昨日の設計では想定していなかった事態です。
提供されているなら使いたい…要はこのEventSystemオブジェクトをゲームUIに位置付ければ良いのかな。


そしてUIオブジェクト配置です。
Canvasオブジェクト上でGameObject->UI->Panelを選択し、パネルを作成します。
更に好みに合わせてGameObject->UI->Buttonを追加し、位置を合わせると以下のようにUIが表示できています。
f:id:bluebirdofoz:20170428021055j:plain
今回、表示確認がメインなので押下時のイベントは未設定です。


最後に追従設定です。
PanelオブジェクトのAddComponentからScript->HoloToolkit.Unity->TagalongでTagalongを追加します。
更にScript->HoloToolkit.Unity->Billboardを追加し、記事を参考にステータスを設定します。
f:id:bluebirdofoz:20170428021105j:plain
実装はこれで完了です。


ビルドを行い、動作確認をしてみました。
f:id:bluebirdofoz:20170428021122j:plain
指定した位置にUIが表示されています。視線を横に動かしてみると…。
f:id:bluebirdofoz:20170428021130j:plain
UIが追従しました。成功です。
写真で見るとかなり余裕を持って追従して見えますが、実際のhololensだと視野角がもっと狭いので視界から外れたタイミングで追従しています。

直ぐに本アプリでUIをどう使うという予定はありませんが、設計としては機能追加の可能性として考慮したいところです。

Unityに設計おけるクラス設計を考える その2(MVP設計)

前回の続きとなります。
・Unityに設計おけるクラス設計を考える その1(アプリの現状)
 http://bluebirdofoz.hatenablog.com/entry/2017/04/26/013327

昨日は気付いたらベッドで眠っていました。
でも折角続けている1日1記事ペースを止めたくないので今回はほぼ文字だけですが設計検討を行います。
(因みに夢は地球がUFOに侵略される夢でした…その中でも頑張って仕事に行ってました。偉い…のか?)

調査したMVP設計を考慮して、まずはオブジェクトの構成について検討してみました。
・Web出身のUnityエンジニアによる大規模ゲームの基盤設計
 https://developers.cyberagent.co.jp/blog/archives/4262/
・昨今のUnity開発におけるMVP設計思想についてと、それの適用可否の話
 http://yutakaseda3216.hatenablog.com/entry/2017/02/22/151204


以下、試そうと考えているオブジェクトの構成。

・GameLogic:ロジック統合オブジェクト
・GameInformation:ゲームデータ統合オブジェクト
 └Database:ゲーム情報
・Camera:カメラ統合オブジェクト
 └MainCamera:メインカメラ
・Light:ライト統合オブジェクト
 └Lights:通常ライト
・GameUI:ゲームUI統合オブジェクト
 ├Keyboard:キーボードUI
 ├Speech:音声認識UI
 └Gesture:ジェスチャ認識UI
・HeadUpDisplay:画面表示UI統合オブジェクト
 ├FixedUI:位置固定の表示UI(input,output)
 └FollowingUI:追従(ディスプレイ位置固定)の表示UI(output)
・MainCharactor:メインキャラクタ統合オブジェクト
 ├ControlLogic:コントロールロジック
 │├ManualLogic:マニュアル操作モードロジック
 │└CatchAndRunLogic:追いかけっこ操作モードロジック
 │ ├CatchMode:追いかけっこ(追)モードスクリプト
 │ ├RunMode:追いかけっこ(逃)モードスクリプト
 │ └ColliderItem:ロジック用アタリ判定オブジェクト
 ├EffectManager:効果マネージャ
 │└StartEffect:ゲーム開始時エフェクト
 │ └EffectItem:効果オブジェクト
 └ModelManager:モデルマネージャ
  ├unitychan_dynamic:キャラクタオブジェクト
  ├HeadLookSwitchCotroller:視線追従マネージャ
  │└ColliderItem:視線追従用アタリ判定オブジェクト
  ├FaseController:表情変更スクリプト
  ├ActionController:キャラクタアクション実行スクリプト
  └VoiceController:キャラクタ音声実行スクリプト
・Field:フィールド統合オブジェクト
 ├SpatialMapping:空間マッピング
 └TestField:テスト用フィールド
  ├TestStopCube
  ├TestJumpCube
  └TestPlane

MVP設計において各オブジェクトがそれぞれの役割を持つイメージです。
f:id:bluebirdofoz:20170427093156j:plain
Model:GameInformation(ゲームデータ統合オブジェクト)のオブジェクト
Presenter:GameLogic(ロジック統合オブジェクト)のオブジェクト
View:上記以外のオブジェクト全て

その他、実装時の各オブジェクトの関係については以下の決まりとします。

最上位層のオブジェクトが下位オブジェクトへのインタフェースを保持する。
PresenterはModelと各Viewの最上位オブジェクトのインタフェースのみ知っている。
ModelとViewはPresenterへの状態変更またはイベントの通知を投げる。
ただしModelとViewはPresenterの実体を知らない。

視点とハンドジェスチャーは別UIと考える。
ゲームUI統合オブジェクトで視点、ハンドジェスチャー音声認識を統合して一つのアクションを通知する。
(特定のオブジェクトを選択するなど)

視点操作などでUI外のオブジェクトが通知される場合、オブジェクトをそのままPresenterに通知する。
そのオブジェクトが何であるかはPresenterが解釈を行う。
(画面表示UIをGameUIに含めないのはこの為。画面表示UIは選択可能なゲームオブジェクトの一つとして考える)


以上です。まだ検討段階で、実際に試してはいないため、色々問題はあるかも。

Unityに設計おけるクラス設計を考える その1(アプリの現状)

本日も追いかけっこアプリの修正枠です。今回はアプリのリファクタリングを行います。
修正を誤らないよう現状、自身で追加したコンポーネントを洗いなおしてみました。
f:id:bluebirdofoz:20170426012456j:plain

・MainCamera
 - メインカメラオブジェクト
  自作の追加コンポーネントはなし
・OrigamiCollection
 - 折り紙オブジェクト
  チュートリアル実施時の残り物、無効化しているため利用中のコンポーネントはなし
・Lights
 - ライトオブジェクト
  自作の追加コンポーネントはなし
・Cursor
 - リング(視点位置表示)オブジェクト
  チュートリアル実施時の残り物、無効化しているため利用中のコンポーネントはなし
・SpatialMapping
 - 空間マッピングオブジェクト
  自作の追加コンポーネントはなし
・unitychan_dynamic
 - ユニティちゃんオブジェクト
  自作の追加コンポーネントは以下の通り
  1.XboxOneController
   - 操作コンポーネント
    キーボード操作の検出からモーションの変更まで役割を多数持つ。
    他スクリプトからの操作を受け取るためのパブリック変数も多数持つ。
  2.GazeGestureMange
   - 視点操作コンポーネント
    視点からオブジェクトへのタップ操作を検出し対象のOnSelect関数を呼び出し
  3.UnityCommands
   - OnSelect関数を受け取ってゲーム開始を行うスクリプト
    ゲーム開始に関するトリガーを扱っているため、キーボード操作も検出する
  4.SpeechManger
   - 音声認識コンポーネント
    音声認識プロセスを用いて単語ごとにXboxOneControllerへの操作を行う
  5.SpeechCommands
   - チュートリアル実施時の残り物
    ポーズ変更を行っているが名前の割りに音声認識はしていない
  6.HeadLookController
   - 視線追従コンポーネント
    LookHeadSphereのスクリプトから有効化されたとき、視線追従を行う
・ColliderSetting
 - アタリ判定オブジェクト
  以下の4つのアタリ判定が存在する
  1.LookHeadSphere
   - 視点移動のアタリ判定
    判定にカメラが侵入した場合、HeadLookControllerを有効化する
  2.MoveToCameraSphere
   - 追いかけっこ完了判定
    判定にカメラが侵入した場合、XboxOneControllerに停止を命令する
  3.JumpCube
   - 障害物アタリ判定その1
    判定にカメラ以外が侵入した場合、XboxOneControllerにジャンプを命令する
  4.StopCube
   - 障害物アタリ判定その2
    判定にカメラ以外が侵入した場合、XboxOneControllerに停止を命令する
・EggSphere
 - 開始時に弾ける球体オブジェクト
  自作の追加コンポーネントはなし
  球体が弾けるモーションはUnityCommandsで操作される。
・TestStopCube
・TestJumpCube
・Plane
 - hololensを使わないデバッグ用に追加した仮想空間の床と障害物。
  ビルド時は必ず無効化している。


洗いなおして見るとよくもまぁここまでと思うほど酷い。。
まずXboxOneControllerが役割が多すぎます。操作の検出、アクション、状態の保持などユニティちゃん操作のほぼ全てをここで担っています。
GazeGestureManger,SpeechMangerもゲーム入力なのに何故、ユニティちゃんオブジェクトに追加したんだろう。


さて再設計を考えるに辺り、Unityでのゲーム設計のあるべき論を調べてみました。
MVP設計という考え方があるらしいです。今回はこの考え方を採用してみることにしました。
・Web出身のUnityエンジニアによる大規模ゲームの基盤設計
 https://developers.cyberagent.co.jp/blog/archives/4262/
・昨今のUnity開発におけるMVP設計思想についてと、それの適用可否の話
 http://yutakaseda3216.hatenablog.com/entry/2017/02/22/151204
・UniRxでMV(R)Pパターン をやってみた
 https://www.slideshare.net/torisoup/unirxmvrp

一つのModelとPresenterの下にViewが沢山あり、キャラクターをViewとしてまとめて見る。この考え方を使います。
f:id:bluebirdofoz:20170426013242j:plain
現状をMVP設計の考え方で捉えると、XboxOneControllerなどはMVP全ての役割を持っており、全く分担できていない状態ですね。

今度は最初にしっかり設計を行わねば。まずはゲームオブジェクトの配置について再検討です。
現状の改善だけでなく、画面UIなど更なる機能追加が行いやすい設計を考えていきたいと思います。

ユニティちゃんのポーズを変更する

本日はユニティちゃん追いかけっこアプリの修正枠です。
以前、お話しした球体から足が飛び出したまま問題を解決します。
・球体が弾け飛びユニティちゃんが現れる
 http://bluebirdofoz.hatenablog.com/entry/2017/04/18/012918

現在のユニティちゃんです。球体から足が飛び出してます。
f:id:bluebirdofoz:20170425004527j:plain

球体が消えるまでユニティちゃんを消すこともできますが、今回の修正ではアニメーションの設定を用います。
現在、ユニティちゃんのアニメーション設定には付属のUnityChanLocomotionsを流用しています。
Entry状態から、立ちモーションのIdle状態に線が伸びているのが分かります。
f:id:bluebirdofoz:20170425004642j:plain
(キャプチャしたら見えずづらくなりましたが、EntryからIdleにオレンジの線が伸びています)

最初に座りモーションの状態を作成します。右クリックでEnptyを選択し、新たに状態を作成します。
「ShitDown」という名前とし、Motionに座りポーズの「POSE17」を設定します。
f:id:bluebirdofoz:20170425004746j:plain

そしてEntryからの状態遷移先を「ShitDown」に変更…したかったんですが、できませんでした。
どうやらデフォルトの遷移先は初回作成時に固定されると後から変更できないっぽいです。
後々のことを考えると、デフォルトの遷移先に色々設定するのはよろしくないですね。作り直しが難しくなります。

仕方ないので今回はIdle状態からShitDown状態に伸びる遷移を追加します。
追加で状態遷移の「ShitDown」フラグを追加し、「ShitDown」をトリガーに遷移を行うようConditionsを設定します。
f:id:bluebirdofoz:20170425004831j:plain

試しに動かしてみます。
「ShitDown」フラグがtrueのとき、ユニティちゃんが座り込むことを確認できました。
f:id:bluebirdofoz:20170425004847j:plain


後は球体の位置をユニティちゃんがしゃがんでいるときの位置に合わせます。
そして、球体が弾けるタイミングで「ShitDown」フラグをfalseにするスクリプトを追加します。
ついでです。球体のアタリ判定が残る問題も解消しましょう。Colliderコンポーネントを無効化します。
f:id:bluebirdofoz:20170425004903j:plain
そもそもユニティちゃんがアタリ判定を持っているので球体にアタリ判定がなくとも問題ありません。


アプリを起動して確認してみます。球体出現時に足が見えなくなっています。
f:id:bluebirdofoz:20170425004922j:plain
球体が床に落ちて弾け飛ぶと、中からユニティちゃんが立ち上がって姿を現します。
f:id:bluebirdofoz:20170425004928j:plain
ようやくイメージしていた形になりました。


さて、騙し騙し技術を積み重ねてきましたが、それ故に追いかけっこアプリのソースコードがスパゲッティ化してきました。
見た目上は上手くいってますが、しゃがみ状態のユニティちゃんが一瞬だけ重力に逆らって浮くという謎の動きが発生しています。

今後は以前、お話していた通り、コードのリファクタリングに取り掛かっていきたいと思います。

hololensでOpenCVForUnityのサンプルを実行する

前回に引き続き、OpenCVForUnityに関する調査です。
・HoloLensでOpenCVの画像処理を利用する
 http://bluebirdofoz.hatenablog.com/entry/2017/04/23/015907

HoloLensWithOpenCVForUnityExampleに含まれるシーンファイルをbuildSettingsで下記のように読み込みます。
f:id:bluebirdofoz:20170424012950j:plain
すると、以下の8つのシーンがサンプルとして確認可能です。

・HoloLensWithOpenCVForUnityExample
 - サンプルの選択画面を表示するサンプルシーン
・ShowLicense
 - ライセンス情報画面を表示するサンプルシーン
・HoloLensWebCamTextureAsyncDetectFaceOverlayExample
 - 顔認識を行いテクスチャを表示するサンプルシーン
・HoloLensWebCamTextureAsyncDetectFaceExample
 - 顔認識を行いテクスチャを表示するサンプルシーン
・HoloLensPhotoCaptureExample
 - カメラ撮影を行い顔認識の画像処理を行ったファイルを出力するサンプルシーン
・HoloLensCoicFilterExample
 - 画面全体にコミックフィルタをかけて映像を表示するサンプルシーン
・HoloLnesArUcoWebCamTextureExample
 - 現在のカメラ撮像を小窓表示でリアルタイムに表示するサンプルシーン
・HoloLensAnonymousFaceExamle
 - 顔認識を行い顔を隠すように画像を表示するサンプルシーン

HoloLensWithOpenCVForUnityExampleとShowLicenseはアプリ操作画面とライセンス画面のため、実質6つのサンプルが試せます。
ビルドすると以下のようにサンプルシーンを選んで試すことができます。
f:id:bluebirdofoz:20170424013039j:plain

予期せず、まだ触れていなかったUnityのシーン遷移を試すことになりました。下記のスクリプトでシーン遷移しています。
HoloLensWithOpenCVForUnityExample.cs

// ShowLicenseシーンへの遷移
public void OnShowLicenseButton ()
{
    #if UNITY_5_3 || UNITY_5_3_OR_NEWER
    SceneManager.LoadScene ("ShowLicense");
    #else
    Application.LoadLevel ("ShowLicense");
    #endif
}


大別すると顔認識、全体フィルタ、小窓表示の3パターンです。
あくまでOpenCVForUnityの使い方を紹介するサンプルのようで、OpenCVの機能自体を色々試すようなサンプルはありません。
OpenCV未経験の自分はOpenCVでどういう事ができるかをそもそも知らないので、少しがっくり。
有識者にhololensではOpenCVのどんな機能を利用すると面白そうかを聞いてみる方が良いかも。

因みにHoloLensWebCamTextureAsyncDetectFaceOverlayExampleとHoloLensWebCamTextureAsyncDetectFaceExampleの違いはまだ判りません。
動作的には同じに見えるので、違いを知るには処理コードを確認する必要がありそうです。


肝心のOpenCVの利用箇所を見てみました。例えば、顔認識してるのはこのスクリプトの辺りかな?
HoloLensAnonymousFaceExample.cs

/// <summary>
/// The gray mat.
/// </summary>
Mat grayMat;

/// <summary>
/// The cascade.
/// </summary>
CascadeClassifier cascade;

private Mat grayMat4Thread;
private CascadeClassifier regionCascade;
(…中略…)
/// <summary>
/// Raises the web cam texture to mat helper inited event.
/// </summary>
public void OnWebCamTextureToMatHelperInited ()
{
    Mat webCamTextureMat = webCamTextureToMatHelper.GetDownScaleMat(webCamTextureToMatHelper.GetMat ());
    
    processingAreaRect = new OpenCVForUnity.Rect ((int)(webCamTextureMat.cols ()*(outsideClippingRatio.x - clippingOffset.x)), (int)(webCamTextureMat.rows ()*(outsideClippingRatio.y + clippingOffset.y)),
(int)(webCamTextureMat.cols ()*(1f-outsideClippingRatio.x*2)), (int)(webCamTextureMat.rows ()*(1f-outsideClippingRatio.y*2)));
    processingAreaRect = processingAreaRect.intersect (new OpenCVForUnity.Rect(0,0,webCamTextureMat.cols (),webCamTextureMat.rows ()));
(…中略…)
    grayMat = new Mat (webCamTextureMat.rows (), webCamTextureMat.cols (), CvType.CV_8UC1);
    regionCascade = new CascadeClassifier ();
    regionCascade.load (Utils.getFilePath ("lbpcascade_frontalface.xml"));

    initThread ();
}

OpenCVForUnityだからと特別な記法は必要なさそうなので、OpenCVを触った事がある人なら一目で何をしているかは分かりそう。
しかし、如何せん私はOpenCVをこれまで全く触ったことがないため、大苦戦中です。

本コードを利用しているHoloLensAnonymousFaceExamleを実行すると、顔の位置に画像が表示されました。
f:id:bluebirdofoz:20170424013340j:plain
サンプル中のキャプチャが撮れない問題ですが、やはりカメラのコントロールを奪われていることが原因のようです。
以下のwebCamTextureToMatHelperを停止すればキャプチャできることを確認しました。
HoloLensAnonymousFaceExample.cs

/// <summary>
/// Raises the stop button event.
/// </summary>
public void OnStopButton ()
{
    webCamTextureToMatHelper.Stop ();
}

姑息な手ですが、以下のようにキーボード操作で呼べるようにしておくと楽です。
ただカメラのコントロールを止めているので、顔認識のアップデートは止まりますし、小窓表示は映像が表示されません。

public GameObject quad = null; // Quadオブジェクトを設定
private HoloLensAnonymousFaceExample anonymousFace = null;
// 初期化
void Start()
{
    anonymousFace = quad.GetComponent<HoloLensAnonymousFaceExample>();
}
void Update()
{
    // Xキーを入力したらStop
    if (Input.GetKey(KeyCode.X))
    {
        anonymousFace.OnStopButton();
    }
}

HoloLensでOpenCVの画像処理を利用する

本日はhololensで使える技術調査です。面白そうなhololensの記事を見つけました。
・HoloLensでOpenCVForUnityを使ってみる
 http://noshipu.hateblo.jp/entry/2017/02/16/203515

OpenCVで処理した映像をそのまま視界に反映できるのはhololensならではと言えます。
手順に従い、プロジェクトを作成してみました。

因みに全てインポートするとファイルサイズが500Mを超えるアセットとなっています。
インストール時に不要なプラットフォームは削除するのが吉です。
・「OpenCV for Unity」Assetのインポートサイズを削減する方法
 http://qiita.com/utibenkei/items/eee141cd2f1656b19cc2

インポート時の以下がhololens利用時に必要なプラグインかな。
f:id:bluebirdofoz:20170423015638j:plain
2.1.3以前まではhololensへの対応はOpenCVForUnityUWP_Beta3というbeta版だったようです。
hololens用のサンプルまで別途用意されている辺り、かなり需要があって色々更新中なのでしょうか。
特に難しい点もなく、顔認識のサンプルを動作させることに成功しました。

しかし、動作させてみたものの問題が一つ。
アプリ起動中はhololensのボタン操作またはDevicePortalによるキャプチャが行えませんでした。
これはカメラのコントロールをアプリが奪っているためと推測できます。
「Apply HoloLens Capability Settings」から「webcam」のチェックを外せばキャプチャできますが、当然、顔認識の画像処理も行われません。
後述の理由からサンプルを色々お見せしていきたいので少し調べてみます。
(ただ紹介記事には特に何も書いていないので設定の変更で失敗している可能性もあり…)


以下、余談です。
OpenCVForUnityを調べた経緯についてです。
実は元々、hololensとOpenCVの技術を組み合わせには興味があり、以前から情報としては調べてはいました。
ただOpenCVを使って何がしたいというものがなく、試していませんでした。
ところが先日、会社の方からHoloLensでOpenCVって使えるの?という質問があったのです。

やはりhololensとOpenCVを合わせて使えば色々できるのではないかと考える人は多いようですね。
ならば知る価値あり、とどんなことが可能か紹介してみることにしました。
実際、OpenCVForUnityの更新具合を見るに、かなり注目されているのかもしれません。

更に余談です。
UnityでOpenCVを利用する方法はOpenCVForUnityだけではありません。連携部分をnative実装すれば無償でも利用可能です。
OpenCVとUnityの連携方法をまとめたページがあったので備忘録として残しておきます。
OpenCVとUnityの連携について
 http://www.dizgid.com/blog/?p=581

Google Earth VRを試してみる

今回はhololens(MR)ではなく、Oculus rift(VR)の話題となります。
4/18に「Google Earth VR」がOculus riftに対応しました。
・「Google Earth VR」がアップデート、“Oculus Rift”をサポートに追加
 http://forest.watch.impress.co.jp/docs/news/1055653.html

これまで「Google Earth VR」はHTC viveでのみ体験できるアプリでした。
自分が持っているのはOculus riftのため、今まで体験できずにいたのです。
(実際にはFake Viveというツールを使えば体験可能でしたが、そちらは非公式なやり方です)
f:id:bluebirdofoz:20170422000546j:plain
Oculus Storeから購入可能となっており、お値段も無料とのこと。これは試すほかありません。

しかし、問題発生…画面がキャプチャできません。

以下の方法を試してみたんですが、実行中画面のキャプチャが行えません。
Oculus Riftでのプレイをスクリーンショットや動画でキャプチャする方法【Windows10】
 http://blog.cluster.mu/2016/06/how_to_take_a_screenshot_or_video_by_rift/

調べてみたところ、今回試したのは下記ページで言うところの「横取り」であり、
Oculus標準のホーム画面やライブラリと同じ動作に当たるようですね。
Oculus Riftスクリーンショットが欲しい!
 http://app-review.jp/news/314354

よって今回は私の感想を元に紹介します。
さて、実を言うと私「google earth」自体、初めての体験です。これまで全く使ったことがありませんでした。
故に、まず立体化されている場所について、東京はほとんどが立体化されていることに驚きました。
渋谷や東京タワーといった有名どころはしっかりと3D化されていて、どの方向から見てもちゃんとテクスチャが貼られています。

これに関してはGoogle Earth VRに限ったことではないので、以下のブラウザ版で確認できます。
Google Earth
 https://www.google.co.jp/intl/ja/earth/

更に驚いたのが、建物の凹み部分もしっかりと再現されていることでした。
ストリートビューと組み合わせて3D化されているとのことで、窪みのある建物はきちんと窪み部分が再現されています。

分かりやすいのは以下のようなフジテレビの建物です。
・FCGビル
 https://ja.wikipedia.org/wiki/FCG%E3%83%93%E3%83%AB
これがこの格子状の形できちんと3D再現されています。横から覗き込むと向こう側の景色が見えます。
かなりの凝り具合で、まるで巨大なパノラマを見ている気分でした。眺めているだけで楽しいです。
f:id:bluebirdofoz:20170422000750p:plain
Google Earth」でのキャプチャです。後ろの空が格子の間から見えます。

さて「Google Earth VR」としての感想ですが…VRアプリとしては現状最高のアプリかもしれません。
まず実在の場所を見ているという事で、スケール感をリアルに感じることができます。
東京スカイツリーはVRの中でも全容を見るには顔を見上げる必要があり、その巨大さを実感できます。
これはブラウザ版だと中々体験として感じにくいところと思います。
VRで体験する意味のある感動が味わえます。高い建物巡りをしてみたくなります。
f:id:bluebirdofoz:20170422000835p:plain

その他、マップ上でズームアウトを続けていくと成層圏を抜け、宇宙空間にたどり着きます。
ここの演出の凝り具合が素晴らしいです。
これは体験しないと伝わらない気がします。
頭上に宇宙が広がり、足元に地球が現れ、黒と青の狭間で輝く水平線を見渡したときの感動は素晴らしい体験でした。
f:id:bluebirdofoz:20170422000929p:plain

誰かにVRが持つ「価値」を伝えたければ、このアプリを体験してもらうのが一番です。