OpenGL勉強中・・・

視点変更を考えてみた。

取りあえず、角度a,bを定義する。
角度a
左向き=-90度、右向き=90度
角度b
下向き=-90度、上向き=90度
OpenGLの座標系で考えると
座標x
左=-1、右=1
座標y
上=-1、下=1
座標z
奥=-1、手前=1
となる。その条件で考えると、
gluLookAtで与える座標から見る視点の先は現在座標に(x,y,z)=(sin角度a,0,-cos角度a)を足した座標を与えることで、水平方向に視点を360度回転させることは出来た。(ぐるっと見渡す感じ)
問題は、そこに上下方向への視点変更を追加した場合。上下方向への座標は(x,y,z)=(0,sin角度b,-cos角度b,0)。したがって(x,y,-z)=(sin角度a,1,-cos角度a)(1,sin角度b,cos角度b)で上下左右に自由に視点が変更出来ると、単純にそう思っていたのだが、あくまで天地はひっくり返らないという結果になってしまった。冷静に考えると、自分の存在する座標点から後ろに振り返ったとしても、天地がひっくり返る事は無いわけだから、当たり前なんだが、想像上は天地がひっくり返ると思っていたので、何となく思っていた画と違ってしまった。
自分の勘違いは明白なので、理解は出来るのですが・・・。飛行機(戦闘機)の宙返りとかを表現する場合は、天地方向がひっくり返る処理も必要という事ですね。gluLookAtで上方向の指定(0.0,1.0,0.0)を(0.0,-1.0,0.0)とすれば良いのでしょうけど。。

ま、取りあえずココまでは上手くいったと思う。

angle_xは視点角度(左右)、angle_yは視点角度(上下)、M_PIは定数π=3.14159...。として、以下の計算値で視点は求められる。

/* 視点の元になる座標点を計算 */
x_x = sin(M_PI / 180 * angle_x);
x_z = -cos(M_PI / 180 * angle_x);
y_y = sin(M_PI / 180 * angle_y);
y_z = cos(M_PI / 180 * angle_y);
x = x_x * 1.0;
y = y_y * 1.0;
z = x_z * y_z;
/* 視点変更 */
gluLookAt(look_x, look_y, look_z, look_x + x, look_y + y, look_z + z,
0.0, 1.0, 0.0);

その後、ライティングで難航。。
自分の視点にスポットライトを置いて、ライトの方角を上記の座標(x,y,z)を与えてやることで、自分がライトで照らしながらモノを見ている感じに出来ると思っていたのだが、結果ライトの方向はライティングには反映されない。
色々いじってみたんだけど、どうも上手くいかない。