業務連絡
本記事は古い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 HoloPlay
のclass Capture
のvoid 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 HoloPlay
のclass Capture
のvoid 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 は良いぞ!