#概要
世の中には空中に結像する ASKA3Dプレートと3Dの映像を表示する LookingGlass がある。
これらを組合せると3Dの映像を空中に浮かばせられる。
ただ組み合わせるだけでは像が反転するので、少し改造が必要なのは
既に記事にした通り。
もしくは、インスペクターから変更してもできた。
ところが、HoloPlaySDK-1.0.0.unitypackage からは一新されて、ハックするCapture.csも無ければ、反転に使う項目もQuiltのconfigから消えている。
というわけで、再びハックしてみた。
もちろん「インスペクターからいじれる」のが正道だが、
ぱっと見該当項目が無さそうなのと、ハックする方が手軽すぎて性に合うかもしれない。
#ハック
ハック対象ファイル
今回は Holoplay.cs 本体を直にハックする。
Project の Assets からのパスは
Assets/Holoplay/Scripts/Holoplay.cs
namespace LookingGlass
のclass Holoplay
のvoid 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;
要は前回同様、i
をquiltSettings.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 は良いぞ!