ステレオグラムの計算式

なぜ立体的に見えるのかで原理を簡単に紹介しました。 でも、感覚的に原理が理解でいたとしても実際にプログラムするとなると少し大変です。 このページと下の2ページ、RDSの計算式CFSの計算式は プログラムを組む時に必要な数学的処理を説明したものです。 見て楽しむだけ場合にはもうまったく必要ない知識ですので、読み飛ばしてください。

目的

ステレオグラムの基本は視差です。 ここでままず、遠くにある点は左右の目でどの位ずれて見えるのかを計算します。

考え方

xyz座標系を考え、fig.1に示すとおりに点や領域を設定します。

fig.1 点の領域の設定
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と置きます。 RLも添字です。 累乗という意味ではありませんのでご注意。)

さて、具体的に左右の視線、εRεLを 直線の方程式として表現してみましょう。3次元ですので直線の方程式は連立方程式の形になります。

eq.1(eq.1)
eq.2(eq.2)

点PiR点PiLの座標は 上式にz=sを代入すればすぐに求まって、

eq.3(eq.3)
eq.4(eq.4)

となります。この2点の距離が視差でした。y座標が一緒なので、 (もちろんz座標も)結局視差はx座標の差となります。 視差をδと書くことにすると、

eq.5(eq.5)

となります。

ここでfig.1より図形的に考えて、zi<s<eであることを、 注意しておきます。この範囲で、δは正で、ziに対して真に単調減少です。

(fig.1より、△LRQi△PiLPiRQiが相似であることを利用すると、 eq.1〜eq.4を使わないで、もっと簡単に視差が求まります。でも、視線の方程式も後で使いたいのであえてこの方法にしました。)

というわけで、一応目標達成ですが、こままではパラメータが多すぎます。 また、ステレオグラムを作る際にesdをどう変えれば良いか 迷ってしまいます。それよりは例えば、視差なんかを直接指定できたほうがはるかに便利です。 これについて考えてみます。

パラメーターの変換

視差δziを変数に持ちます。 このままだと扱いづらいので、特にzi=0での視差のみに着目します。 この視差を最大視差Dと呼びます。つまり、

eq.6(eq.6)

です。さて今は両目の間隔が2dですので、平行法の制限で

eq.7(eq.7)

でなくてはなりません。(視差が両目間隔を上回ってはいけないのです。) これをみたしていれば何でも良いのですが、 ここでは最大視差Dを一番見やすいといわれている両目の間隔の半分に固定してしまいましょう。 つまりD=dとします。

すると、eq.6より

eq.8(eq.8)

である必要があります。

この作業により、ステレオグラムを作るのに必要なパラメータは 最初のesdからsDに変換されました。

ziは0以上の値に設定します。 したがってδの単調減少性より、Dは確かにδの最大値です。)

さらに続けましょう。sも邪魔です。eq.5に今までの結果を代入すると、

eq.9(eq.9)

となります。これにs=1/Cを代入すると、

eq.10(eq.10)

を得ます。ここでCziにしかかっていない係数で、 奥行の強さを決定するパラメータであることが分かります。

というわけで、必要なパラメータは最大視差D奥行の強さCだけです。 これでかなり見通しが良くなりました。それでは、eq.10を使って具体的にステレオグラムを作っていくことにします。