LoginSignup
11
4

More than 5 years have passed since last update.

ASKA3D × LookingGlass のためのハック(HoloPlay SDK-1.0.0 対応)

Last updated at Posted at 2019-04-09

概要

世の中には空中に結像する ASKA3Dプレートと3Dの映像を表示する LookingGlass がある。
これらを組合せると3Dの映像を空中に浮かばせられる。

ただ組み合わせるだけでは像が反転するので、少し改造が必要なのは
既に記事にした通り
もしくは、インスペクターから変更してもできた

ところが、HoloPlaySDK-1.0.0.unitypackage からは一新されて、ハックするCapture.csも無ければ、反転に使う項目もQuiltのconfigから消えている。

というわけで、再びハックしてみた。
もちろん「インスペクターからいじれる」のが正道だが、
ぱっと見該当項目が無さそうなのと、ハックする方が手軽すぎて性に合うかもしれない。

ハック

ハック対象ファイル

今回は Holoplay.cs 本体を直にハックする。
Project の Assets からのパスは
Assets/Holoplay/Scripts/Holoplay.cs

namespace LookingGlassclass Holoplayvoid LateUpdate ()の中、
for (int i = 0; i < quiltSettings.numViews; i++)で45枚の写真を撮っている。
今回はこの中を書き換える。

前後反転

    float currentViewLerp = 0f; // if numviews is 1, take center view
    if (quiltSettings.numViews > 1)
        currentViewLerp = (float)i / (quiltSettings.numViews - 1) - 0.5f;
+   currentViewLerp = -currentViewLerp;

要は前回同様、iquiltSettings.numViews - 1 - iに差し替えれば良い。
$ \frac{n - 1 - i}{n - 1} - \frac12 = 1 - \frac{i}{n - 1} - \frac12 = \frac12 - \frac{i}{n - 1} = -\left( \frac{i}{n - 1} - \frac12 \right) $の関係にあるため、符号反転で済む。

上下・左右反転(2019/14/15追記)

+   viewMatrix.m00 = -viewMatrix.m00;
+   viewMatrix.m11 = -viewMatrix.m11;
+   viewMatrix.m03 = -viewMatrix.m03;
+   viewMatrix.m13 = -viewMatrix.m13;
    viewMatrix.m03 += currentViewLerp * viewConeSweep;

素直にviewMaterixのx成分とy成分を軸反転させただけ。
1軸だけ反転した場合は空間の裏表も反転してしまうが、
2軸反転させると空間に対する反転効果が打ち消して気にせずに済むようになる。

currentViewLerp * viewConeSweepはレンチキュラーレンズに応じた視点移動を表す項である。
そのため、符号はレンチキュラーレンズの構造だけで決まり、軸の反転に影響されない。
したがって、viewMatrix.m03 = -viewMatrix.m03をその前に挿入する必要がある。

インスペクタ追加(2019/14/15追記)

インスペクタに追加するには、然るべきところでフラッグ宣言して、
上記ハックをスイッチさせれば良い。

    // quilt
    public Quilt.Preset quiltPreset = Quilt.Preset.Automatic;
    ...
    [System.NonSerialized] public Material lightfieldMat;
+   public bool reverse = false;
+   public bool rotate = false;

    // gizmo
    public Color frustumColor = new Color32(0, 255, 0, 255);

インスペクタには、HoloplayEditor.cs でスクリプトを使って追加していて、
追加対象となる変数を宣言順でスキャンし、特定の名前の変数でセクションを区切っている。
例えば、quiltというセクションはquiltPresetからfrustumColorの1つ前までの項目に設定している。
また、frustumColorは次のgizmoというセクションの先頭項目になっている。

そのため、セクションquiltに追記する場合は、frustumColorの宣言の前に入れると期待通りになる。

    if (quiltSettings.numViews > 1)
        currentViewLerp = (float)i / (quiltSettings.numViews - 1) - 0.5f;
+   if (reverse)
+       currentViewLerp = -currentViewLerp;
+       
+   if (rotate) {
+       viewMatrix.m00 = -viewMatrix.m00;
+       viewMatrix.m11 = -viewMatrix.m11;
+       viewMatrix.m03 = -viewMatrix.m03;
+       viewMatrix.m13 = -viewMatrix.m13;
+   }
    viewMatrix.m03 += currentViewLerp * viewConeSweep;
    projMatrix.m02 += currentViewLerp * viewConeSweep * projModifier;

これでコードからもインスペクタからも切り替えれるようになる。

まとめ

ASKA3D × LookingGlass は良いぞ!

11
4
0

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
11
4