ステレオグラムの計算式
なぜ立体的に見えるのかで原理を簡単に紹介しました。 でも、感覚的に原理が理解でいたとしても実際にプログラムするとなると少し大変です。 このページと下の2ページ、RDSの計算式とCFSの計算式は プログラムを組む時に必要な数学的処理を説明したものです。 見て楽しむだけ場合にはもうまったく必要ない知識ですので、読み飛ばしてください。
目的
ステレオグラムの基本は視差です。 ここでままず、遠くにある点は左右の目でどの位ずれて見えるのかを計算します。
考え方
xyz座標系を考え、fig.1に示すとおりに点や領域を設定します。
つまり、点R(d, 0, e)、点L(-d, 0, e)、平面S(z=s)、 領域F(原点付近に適当に、 ただしz座標が負にならないようにします。)です。 ここで点Rと点Lはそれぞれ右目と左目を、平面Sはスクリーンを、 領域Fは表示したい立体を置く場所を意味しています。 この表示したい立体のことをオブジェクトと呼びます。 まずオブジェクト(つまり、ステレオグラムにしたい立体)を 領域Fの中に置き、 それを左右の目にどう写っているか調べて平面Sに投影します。 このときの点PiRと点PiLの距離が 求めるべき視差です。 (変わった向きに座標軸をとっていますが、 こうしておくと平面Sがスクリーン座標っぽくなるので後で便利なのです。)
点をスクリーンに投影
上では「領域Fは表示したい立体を置く」と書きましたが、 今は視差を求めるだけなので領域Fには点を1つだけ置きます。 ただ、将来的には沢山の点の集合(つまり立体)で考えたいので、 それを意識して添え字のiを付けておきます。 領域Fの内部にある投影したい点を 点Qi(xi, yi, zi)とします。 投影にも色々種類がありますが、ここで使うのは透視投影です。
投影といっても、具体的には視点Rと点Qiを結んだ直線と 平面Sの交点、視点Lと点Qiを結んだ直線と平面Sの交点 の2点を求めるだけです。 これらの直線をεR、εLと書き、 右目の視線、左目の視線と呼ぶことにします。 また平面Sの視線εRとの交点を点PiR、 視線εLとの交点を点PiLと置きます。 (R、Lも添字です。 累乗という意味ではありませんのでご注意。)
さて、具体的に左右の視線、εRとεLを 直線の方程式として表現してみましょう。3次元ですので直線の方程式は連立方程式の形になります。
(eq.1)
(eq.2)点PiRと点PiLの座標は 上式にz=sを代入すればすぐに求まって、
(eq.3)
(eq.4)となります。この2点の距離が視差でした。y座標が一緒なので、 (もちろんz座標も)結局視差はx座標の差となります。 視差をδと書くことにすると、
となります。
ここでfig.1より図形的に考えて、zi<s<eであることを、 注意しておきます。この範囲で、δは正で、ziに対して真に単調減少です。
(fig.1より、△LRQiと △PiLPiRQiが相似であることを利用すると、 eq.1〜eq.4を使わないで、もっと簡単に視差が求まります。でも、視線の方程式も後で使いたいのであえてこの方法にしました。)
というわけで、一応目標達成ですが、こままではパラメータが多すぎます。 また、ステレオグラムを作る際にe、s、dをどう変えれば良いか 迷ってしまいます。それよりは例えば、視差なんかを直接指定できたほうがはるかに便利です。 これについて考えてみます。
パラメーターの変換
視差δはziを変数に持ちます。 このままだと扱いづらいので、特にzi=0での視差のみに着目します。 この視差を最大視差Dと呼びます。つまり、
です。さて今は両目の間隔が2dですので、平行法の制限で
でなくてはなりません。(視差が両目間隔を上回ってはいけないのです。) これをみたしていれば何でも良いのですが、 ここでは最大視差Dを一番見やすいといわれている両目の間隔の半分に固定してしまいましょう。 つまりD=dとします。
すると、eq.6より
(eq.8)である必要があります。
この作業により、ステレオグラムを作るのに必要なパラメータは 最初のe、s、dからsとDに変換されました。
(ziは0以上の値に設定します。 したがってδの単調減少性より、Dは確かにδの最大値です。)
さらに続けましょう。sも邪魔です。eq.5に今までの結果を代入すると、
となります。これにs=1/Cを代入すると、
(eq.10)を得ます。ここでCはziにしかかっていない係数で、 奥行の強さを決定するパラメータであることが分かります。
というわけで、必要なパラメータは最大視差Dと奥行の強さCだけです。 これでかなり見通しが良くなりました。それでは、eq.10を使って具体的にステレオグラムを作っていくことにします。
