MRが楽しい

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

Holographic Remoting実行時にHoloLens環境設定で動作させる

本日は HoloToolkit の技術調査枠です。
前回、MMD プロジェクトを Holographic Remoting で動作させると背景が表示されてしまう問題がありました。
bluebirdofoz.hatenablog.com

HoloLens上で動作させていますが、背景が描画されているので VR のような見た目になります。
f:id:bluebirdofoz:20171128004538j:plain

折角 HoloLens 上で動作させているので背景を透過させてみます。
やり方としては UnityEditor 上の動作か判定を行い、true の場合、背景と床の設定を HoloLens 向けの環境設定で動かすようにするだけです。

判定を行う HolographicSettings.IsDisplayOpaque 自体に手を加えたかったですが、アセンブリ参照のため断念しました。
調べてみると背景処理について修正すべき点は以下の2点でした。
・MixedRealityCameraManager.cs(カメラ背景の切り替え)
・BoundaryManager.cs(床描画の切り替え)

・MixedRealityCameraManager.cs:63行目

  private void Start()
  {
    //if (!Application.isEditor)
    // --- ↓以下のように修正する ---
    if (Application.isEditor)
    {
      CurrentDisplayType = DisplayType.Transparent;
      ApplySettingsForTransparentDisplay();
      if (OnDisplayDetected != null)
      {
        OnDisplayDetected(DisplayType.Transparent);
      }
      return;
    }
    // ------------------------------
(以下略)

・BundaryManger.cs:99行目

  private void RenderFloorQuad()
  {
    //if (HolographicSettings.IsDisplayOpaque)
    // --- ↓以下のように修正する ---
    if (HolographicSettings.IsDisplayOpaque && !Application.isEditor)
    // ------------------------------
    {
      // Defaulting coordinate system to RoomScale in immersive headsets.
      // This puts the origin 0,0,0 on the floor if a floor has been established during RunSetup via MixedRealityPortal
      XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale);
    }
(以下略)

・BundaryManger.cs:114行目

    if (FloorQuad != null && HolographicSettings.IsDisplayOpaque)
    // --- ↓以下のように修正する ---
    if (FloorQuad != null && HolographicSettings.IsDisplayOpaque && !Application.isEditor)
    // ------------------------------
    {
      floorQuadInstance = Instantiate(FloorQuad);
(以下略)

・BundaryManger.cs:152行目

  public bool ContainsObject(Vector3 gameObjectPosition)
  {
    // Check if the supplied game object's position is within the bounds volume.
    //if (HolographicSettings.IsDisplayOpaque)
    // --- ↓以下のように修正する ---
    if (HolographicSettings.IsDisplayOpaque && !Application.isEditor)
    // ------------------------------
    {
      return boundaryBounds.Contains(gameObjectPosition);
(以下略)

厳密にやるならば、この他、InputManager などの最適化も必要ですが、今回は見た目の処理に限定しています。

ついでに NearClip の値を小さくしておくと、よりキャラクタに近寄って見ることができます。
f:id:bluebirdofoz:20171128004633j:plain

以上の修正を実施し、再び Holographic Remoting を使って HoloLens 上で動作させてみます。
f:id:bluebirdofoz:20171128004643j:plain
背景が透過できました……が、Holographic Remoting の映像をキャプチャした場合、黒色が発色されてしまうようです。
実際に HoloLens を通して見ると黒色は透過されているので、キャラクタが現実世界で踊っているように見えています。

後、前述の通り黒色は透過色になるので、全体的に明るい色彩のキャラクタの方が HoloLens 上では見栄えが良いかもしれません。