2

オブジェクトに対して直接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);
}
4

3 に答える 3

2

sin()、、およびfriendsのような数学関数はcos()、度ではなくラジアンでの入力を期待します。度を想定しているように見えるので、意図したよりも約57.3倍(正確には360 /(2 * pi))速く回転しています。

于 2013-02-02T20:19:26.487 に答える
0

移動を時間ベースにする必要があります。これは、回転角に最初の最後のフレームと現在のフレームの間のデルタを掛けることを意味します。

angle += 90 * timeDelta; // Rotate by 90 degree each second
于 2013-02-02T20:34:26.917 に答える
0

あなたの問題には素晴らしい解決策があります。少し調べてみてくださいが、あなたのニーズに合うと思います。 クォータニオン

そのためのいくつかのコード

ベクトルを回転および逆方向に変換するのに適しています

于 2013-02-04T15:38:39.060 に答える