1

私の問題は非常に単純だと思いますが、私は 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によって私が望むように保ちます。

別のアイデア?? どうもありがとう!!!

4

2 に答える 2

0

私は最近これに遭遇し、この解決策に行き着きました:

  1. でローカル x 軸を中心に回転しglRotate(bx,1f,0f,0f);ます。
  2. ux=0ローカル座標系、uy=cos(bx)、でグローバル y 軸コンポーネントを計算しuz=sin(bx)ます。
  3. でローカル軸を中心に回転しglRotate(by,ux,uy,uz);ます。

必要な機能は

Func<float,float> cos = (x)=>(float)(Math.Cos(x*Math.PI/180));
Func<float,float> sin = (x)=>(float)(Math.Sin(x*Math.PI/180));

角度をラジアンに変換するには、sin と cos を取り、float を返します。

于 2013-04-27T13:24:42.780 に答える