24
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ASKA3D × LookingGlass のためのハック

Last updated at Posted at 2019-02-12

#業務連絡
本記事は古いSDK(HoloPlay-SDK-0.1.4.unitypackage)に基づいており、
新しいSDK(HoloPlaySDK-1.0.0.unitypackage)からは互換性が無くなっている。
新しいSDKに対応したハックは『ASKA3D × LookingGlass のためのハック ver1

#概要
世の中には ASKA3Dプレートという空中に結像するデバイスがある。
ただ、2Dのディスプレイを映しても2Dの空間映像しか得られない。

近頃、Looking Glass という裸眼3Dディスプレイが現れた。
ガラス(アクリル?)の中ではあるが、3Dの像が得られる。

この2つを組み合わせれば、3Dの空間映像が得られる計算になる。
で、実際にやってみると、3Dの空間映像は得られた。
ただ、前後・左右・上下が全て反転した状態だった。

ASKA3Dプレート2枚で反転を打ち消すには、光路が謎な上に減衰が激しいために難航した。
対して、ソフトウェア側で解決策を探したら、意外に容易くハックできた。

#ハック

ハック対象ファイル

Unity で Looking Glass 用のアプリを開発するには HoloPlay-SDK-0.1.4.unitypackage を使う。
インポートで追加される Assets の HoloPlay にある HoloPlay Capture を使うことになるが、
今回は HoloPlay Capture のコンポネントである Capture.cs をハックする。
Project の Assets からのパスは
Assets/Holoplay/Core/Scripts/Capture.cs

前後反転

namespace HoloPlayclass Capturevoid RenderView(int view, int numViews,...)の中、AngleAtView を呼び出す前に以下の行を追加。

+   view = numViews - 1 - view;
    HandleOffset(AngleAtView(view, numViews, viewCone), verticalAngle);

Looking Glass は 3D 画面(?)を45枚の2D画面に分けて処理しているが、
RenderView では各 2D 画面のカメラパラメータを設定している。
view には 2D 画面の前後位置を表す添え字、numViewsには 45 という上限値が渡される。

そのため、viewの値を入れ替えれば、2D 画面のレイヤが前後に入れ替わる。
具体に、view が 0 から 44 まで変わるので、これを 44 から 0 に補正すれば良い。
これを実現するのがview = numViews - 1 - view;である。

ちなみに、AngleAtViewの中でviewを配列参照とかに使ってるわけではなく、
単に角度の計算に使っているために OutOfRange の類の例外を引き起こす心配はない。
また、viewが1ズレても、2D 画面が 1 レイヤズレる程度で、並の人間には分からない。
そのため、単純にview = numViews - viewとしても見た目はほぼ同じである。

上下・左右反転

namespace HoloPlayclass Capturevoid HandleOffset(...)の中、
if (Cam.orthographic)に入る前に1行追加して、分岐内でも1文字追加。

+   Cam.transform.localEulerAngles = Vector3.forward * 180;
    if (Cam.orthographic)
    {
      Cam.transform.localPosition = Vector3.zero;
-     Cam.transform.localEulerAngles  = Vector3.up * -horizontalAngle;
+     Cam.transform.localEulerAngles += Vector3.up * -horizontalAngle;
      return;
    }

上下・左右反転は、前後軸中心に180回転とも言う。
Cam.transform.localEulerAngles = Vector3.forward * 180;はそのまんまである。

orthographic モードでは上下軸中心の回転が加わるため、単純代入ではなく、加算代入に変える必要がある。
また、分岐の中で return してしまうため、分岐の後で前後軸の回転を追加する1行ハックは無理だった。

補足

上下左右の反転だけなら、Looking Glassを逆さにして使っても同様の効果が得られる。

また、ちゃんと実装するなら、prefab を直に書き換えないで、コピーして別に作るべし。

#まとめ
ASKA3D × LookingGlass は良いぞ!

24
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?