私はキーを押すと、軸でシーンを回転させる必要があります。これは私が実装した方法です。openglのオブジェクトを回転する
int rotateFlag;
void rotateScene(int x){
if(x)//rotate 45 deg on x axis
glRotatef(45,1,0,0);
else // roatate 45 deg on y axis
glRotatef(45,0,1,0);
}
//this is the function I call in glutDisplayFunc
void drawScene(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//I'm looking at the origin (center of my scene)
gluLookAt (x, y, z, 0,0,0, 0.0, 1.0, 0.0);
rotateScene(rotateFlag);
drawObjects();//draw Objects in Scene
}
私は左キーまたは上キーを押したときにrotateFlagに値を割り当てます。私の関数rotateScene は常にが私が避けるべきシーンの元の配列にglRotatefを適用して以来、これはシーンを1回だけ回転させます。誰かが回転したシーンを保存する方法を知っていますので、回転したシーンに私の機能を適用し、矢印キーを押すたびにシーンを回転させることができますか?私は自分自身を明確にしたいと思う。
私はキー
If keypress left
angleX+=45;
else if keypress up
angleY+=45;
を押すと、私は個別に回転を実行したときにすべてがうまくいっている
void rotateScene(){
glRotatef(angleX,1,0,0);
glRotatef(angleY,0,1,0);
}
に私のrotateSceneを調整するように私はXとYに角度をインクリメントすることにより、別の解決策を試してみましたしかし、最初にYで回転した後にXで回転すると、シーンの回転が正しくありません。これは、関数呼び出しの順序付けのために、openglがXで回転してからYで回転するためです。私のアプリケーションでは、シーンを回転させる順序が重要なので、この関数を適切に使用することはできません。
回転は可換ではありません。簡単に言えば、これは、Xの周りを回転してからYの周りを回転することは、Yの周りを回転してからXの周りを回転することと同じではありません。これは単純な数学的原理であり、実際には多くの混乱を招きます。 OpenGLで軸を中心に回転させるたびに、座標系が向きを変えます。一方、翻訳は問題ではありません。最初にXに沿って翻訳し、次いでYに沿って翻訳し、次にZに沿って翻訳することは、まずYに沿って翻訳し、次にXに沿って翻訳し、最後にZに沿って翻訳することと同じです。一方で適用された)。 – rbaleksandar