オブジェクトに対して直接R*T変換を実行する代わりに、gluLookAtを使用して、原点を中心とする立方体を移動しようとしています。最初は、この問題をどのように行うのかわかりませんでした。次に、(ソリューションの半分を円座標で実装した後)球面座標系表現を使用してみる必要があることに気付きました。これを行うためのコードを書くことはできましたが、私(カメラの「目」)は立方体の周りを非常に速く回転します。また、一定の半径を保持するのではなく、立方体に少し近づいていることに気付きました。Rotate * Translateメソッドを使用すると、同じ距離でより適切な速度で回転します。
私の回転のアプローチは球面座標を使用することでしたが、これが正しいかどうかはわかりません。ウィキペディアのページにある図に従って、2つの角度を計算します。現在のポイントの大きさを計算します(distX、distY、distZ)。最初はXY平面にいて、負のZ平面を見ています)。また、2つの角度が与えられています。1つはx軸を中心とした回転角を指定し、もう1つはy軸を指定します。これらの5つの値は、マウスクリックの方法に基づいて計算されます。
いくつかの三角関数に基づいてシータとファイを計算し、最後に新しい位置を計算します。これらの式は、前のリンクにあります。最後のステップは、それをgluLookAtに接続することです。繰り返しになりますが、このプログラムを実行すると、立方体の周りを回転することができますが、非常に高速で、カメラも変換します。私は何が間違っているのですか?
参照したい場合に備えて、私のコードを以下に示します。「y」と「up」を参照する部分は、Z軸を中心とした回転を計算するための私の試みです。その回転を説明するのに最適な方法は、オブジェクトを見て、自分でカメラを想像し、頭を左右に傾ける場合です。それを機能させることができなかったので、gluLookAtへの呼び出しにそれを含めませんでした。
編集:正しい速度で回転するようになりましたが、完全には回転しません。つまり、回転すると、「目」はある角度で立方体に向かって移動しますが、その後、回転を元に戻します。しかし、これはループするため、目がたどる経路は曲がった無限大記号のように見えます。
void sceneTransformation(){
glLoadIdentity( );
//Using the R*T approach. Works flawlessly
//glTranslatef(-distX, distY, -distZ);
//glRotatef( anglex, 1.0, 0.0, 0.0 );
//glRotatef( angley, 0.0, 1.0, 0.0 );
GLdouble radx = anglex*PI/180.;
GLdouble rady = angley*PI/180.;
GLdouble l = sqrt(pow(distX, 2) + pow(distY, 2) + pow(distZ, 2));
GLdouble phi = atan(distY/distZ) + radx;
GLdouble theta = acos(distZ/l) + radx;
GLdouble deltaZ = l*sin(theta)*cos(phi);
GLdouble deltaY = l*sin(theta)*sin(phi);
GLdouble deltaX = l*cos(theta);
GLdouble ytheta = atan(distX/distY);
GLdouble y = sqrt(pow(distX,2) + pow(distY, 2));
GLdouble yangle = PI/2.-ytheta-rady;
GLdouble up_y = y*sin(yangle);
GLdouble up_x = y*cos(yangle);
gluLookAt((distX - deltaX), (distY - deltaY), (distZ - deltaZ), 0, 0, 0, 0,1,0);
}