カメヲラボ

主にプログラミングとお勉強全般について書いてます

Stereo Graphics Programming(8)

off-axisの計算

前回のサンプルコードに、stereo_off_axisという関数を呼んでいる部分があるのだが、これが大事な部分なので簡単なサンプルを載せておく。



001 #define RIGHT_EYE 1.0
002 #define LEFT_EYE -1.0
003
004 // 実験環境に関する宣言
005 float d = 3.0; //d*2は両眼間距離(単位:cm)
006 float l = 60.0; //ディスプレイまでの距離(単位:cm)
007 float widthf, heightf;//ウィンドウサイズ
008
009 //off-axis法の投影変換
010 void stereo_off_axis( float eye )
011 {
012 double left,right,bottom,top;
013
014 right = znear* (0.5*widthf - eye*d)/l;
015 left = -znear* (0.5*widthf + eye*d)/l;
016 bottom = -znear * (0.5*heightf)/l;
017 top = znear * (0.5*heightf)/l;
018
019 glMatrixMode(GL_PROJECTION);
020 glLoadIdentity();
021 glFrustum( left, right, bottom, top, znear, zfar);
022 glMatrixMode(GL_MODELVIEW);
023 // glLoadIdentity(); //いちいち初期化しちゃダメ
024 glTranslatef( -eye*d, 0.0, -l );
025 glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
026 //ココから下に、(必要であれば)glTranslatefやglRotatef等を呼ぶ
027 //...
028 }

dの値は個人差があるので、利用する人ごとにチューニング出来るようにしておいた方が良い。それから、最初の#defineで定義しているのはこの関数に渡す引数"eye"の取りうる値で、視点を中心からx軸方向に右:+d、左:-dだけ移動させるという意味。


このあたりを理解していれば、手軽にステレオグラフィックスプログラミングが出来るハズ。