どーもこんにちは、Keita_Nakamori@(´・ω・`)です。
捨てようかどうか迷っているMirage Soloについて、最後にMRをやってみようと思います。
環境
- Windows10 home
- Unity 2018.4.4f1
- GoogleVRForUnity_1.200.0
ヒエラルキー
- GvrBetaHeadset:新しいです
- GvrControllerMain
- GvrEventSystem
- GvrEditorEmulator
- GvrBetaControllerPointer:これも新しいです
- PlayerというEmptyを作って、その中にMain CameraとGvrBetaControllerPointerwを入れておきます。
GvrBetaHeadsetの設定
起動と同時にMRが発動するように、インスペクターでGvrBetaHeadsetスクリプトのグルーバル変数であるInitial Camera Mode を Tone Mapに、Initial Scene TypeをAugmentedに変更します。
カメラの設定とオブジェクト配置
カメラの背景はHolo Lenseと同じく完全透明のSolid color (0,0,0,0)への変更が必要です。
カメラの座標はカメラの親であるPlayerでy=1.5にします。カメラ自体は(0,0,0)です
オブジェクトは1m角の枠とユニティちゃんを配しました。
ではビルドしましょう。やりかたはVRのときと全く同じです。
MRとVR(オブジェクトだけ)を切り替えたいとき
下記サイトを参考に、スクリプトをPlayerに貼り付けます。これで、Appボタンを押せば切り替えられるようになりました。
【Unity(C#)】MirageSoloのシースルーモード導入方法
スクリーンショットを貼っておきます(Volume Down ボタン+ DayDreamボタン(一番下))
スクリプト
念の為、置いておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
using GoogleVR.Beta; using UnityEngine; public class ViewModeChange : MonoBehaviour { GvrControllerInputDevice gvrControllerInputDevice; [SerializeField] GameObject[] hideDuringSeeThrough; void Start() { gvrControllerInputDevice = GvrControllerInput.GetDevice(GvrControllerHand.Dominant); bool supported = GvrBetaSettings.IsFeatureSupported(GvrBetaFeature.SeeThrough); bool enabled = GvrBetaSettings.IsFeatureEnabled(GvrBetaFeature.SeeThrough); if (supported && !enabled) { GvrBetaFeature[] features = new GvrBetaFeature[] { GvrBetaFeature.SeeThrough }; GvrBetaSettings.RequestFeatures(features, null); } } void Update() { if (gvrControllerInputDevice.GetButtonUp(GvrControllerButton.App)) { SeeThroughModes(); } } void SeeThroughModes() { if (!GvrBetaSettings.IsFeatureEnabled(GvrBetaFeature.SeeThrough)) { return; } GvrBetaSeeThroughCameraMode camMode = GvrBetaHeadset.CameraMode; GvrBetaSeeThroughSceneType sceneType = GvrBetaSeeThroughSceneType.Augmented; switch (camMode) { case GvrBetaSeeThroughCameraMode.Disabled: camMode = GvrBetaSeeThroughCameraMode.ToneMap; break; case GvrBetaSeeThroughCameraMode.ToneMap: sceneType = GvrBetaSeeThroughSceneType.Virtual; camMode = GvrBetaSeeThroughCameraMode.Disabled; break; } GvrBetaHeadset.SetSeeThroughConfig(camMode, sceneType); bool seethruEnabled = camMode != GvrBetaSeeThroughCameraMode.Disabled; foreach (var go in hideDuringSeeThrough) { go.SetActive(!seethruEnabled); } } } |
弱点
オブジェクトの前になにも障害物がない状態では問題ないのですが、例えば、手をユニティちゃんの手前にかざすと、隠れるはずのユニティちゃんが隠れてくれません。
ここがホロレンズと違うところで、手はオブジェクトとして認識されているわけではありません。
よって、手はパススルーの背景と同じ扱いをされてしまいますので、手で遮っても、その上にユニティちゃん(オブジェクト)が乗ってくることになります。
このときに盛大な違和感を憶えます。
でも、手をオブジェクトの後ろに回すぶんにはなんの違和感もありませんし、むしろ自然な感じが良いです。
今後
- パススルー画像をリアルタイムで解析して、
- 手の動きをオブジェクト化し、
- ユニティちゃんの手前にかざし、ユニティちゃんが見えなくなるような方法を探る。
そんなことができるでしょうか。