Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
14
Help us understand the problem. What is going on with this article?
@Limg

ASKA3D × LookingGlass のためのハック

More than 1 year has passed since last update.

業務連絡

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

概要

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

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

この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 は良いぞ!

14
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
14
Help us understand the problem. What is going on with this article?