私の問題は非常に単純だと思いますが、私は OpenGL が初めてで、何をすべきかわかりません。
ピラミッドを回転させようとしています (数字は関係ありません)。X 軸に対して回転させてから、Y 軸に対して回転させたいと考えています。
しかし、X 軸を回転させると、Y 軸も回転します。そして、Yを基準に回転させたい場合、Y軸は元ではなくなります。
次の画像は、ピラミッド星が原点にある様子を示しています。
次に、X に関して winth を回転させます。
Y軸とZ軸も回転し、Yを基準に回転させたい場合、ピラミッドは元のY軸(濃い緑色)ではなく、回転したY軸を基準に回転します。
PushMatrix(); を使用します。と PopMatrix(); :
gl.PushMatrix();
gl.Rotate(bx, 1.0f, 0.0f, 0.0f);
gl.PushMatrix();
gl.Rotate(by, 0.0f, 1.0f, 0.0f);
//Pyramid
gl.Begin(OpenGL.GL_TRIANGLES);
gl.Color(1.0f, 0.0f, 0.0f);
gl.Vertex(0.0f, 1.0f, 0.0f);
gl.Vertex(-1.0f, -1.0f, 1.0f);
gl.Vertex(1.0f, -1.0f, 1.0f);
gl.Color(0.0f, 1.0f, 0.0f);
gl.Vertex(0.0f, 1.0f, 0.0f);
gl.Vertex(1.0f, -1.0f, 1.0f);
gl.Vertex(1.0f, -1.0f, -1.0f);
gl.Color(0.0f, 0.0f, 1.0f);
gl.Vertex(0.0f, 1.0f, 0.0f);
gl.Vertex(1.0f, -1.0f, -1.0f);
gl.Vertex(-1.0f, -1.0f, -1.0f);
gl.Color(1.0f, 1.0f, 1.0f);
gl.Vertex(0.0f, 1.0f, 0.0f);
gl.Vertex(-1.0f, -1.0f, -1.0f);
gl.Vertex(-1.0f, -1.0f, 1.0f);
gl.End();
gl.PopMatrix();
gl.PopMatrix();
bxボタンをクリックしたときに角度を増減するだけです(Zは関係ありません)
X と Y に関してピラミッドを回転させたいのですが、元の軸 (ユニバーサル軸) はローカル軸とは無関係です。
注: SharpGL (c# の OpenGL) を使用していますが、同じです。
アップデート
コードを変更します:
gl.PushMatrix();
gl.Rotate(bx, 1.0f, 0.0f, 0.0f);
gl.PushMatrix();
//gl.Rotate(by, 0.0f, 1.0f, 0.0f); This changes
gl.Rotate(by, 0.0f, Math.Cos(bx*Math.PI / 180), -Math.Sin(bx*Math.PI / 180));
//Pyramid
gl.PopMatrix();
gl.PopMatrix();
行列 Rx 逆 [1 0 0; 0 コサイン; 0 -Sin Cos] をベクトル Y [0 1 0] で、結果のベクトル [0 Cos -Sin] を Y で回転させます。
これは私が望むように機能します。Y による回転の後に X による回転を行いますが、X による別の回転を行うと、元の回転ではなく X による回転になります!!! Yによって私が望むように保ちます。
別のアイデア?? どうもありがとう!!!