1

我认为我的问题很简单,但我是 Opengl 的新手,我不知道该怎么做。

我正在尝试旋转金字塔(数字无关紧要),我想相对于 X 旋转,然后相对于 Y 轴旋转。

但是当我在 X 上旋转时,Y 轴也会旋转。然后当我想相对于 Y 旋转时,Y 轴不再是原来的。

下图显示了 mi 金字塔在原点的星形:

在此处输入图像描述

然后相对于 X 旋转 win:

在此处输入图像描述

轴 Y 和 Z 也旋转,然后如果我想相对于 Y 旋转,则金字塔相对于旋转的 Y 轴旋转,而不是原始 Y 轴(强绿色)。

我使用 PushMatrix(); 和流行矩阵();:

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 inverse [1 0 0; 0 余弦;0 -Sin Cos] 由向量 Y [0 1 0] 得到,得到的向量 [0 Cos -Sin] 由 Y 旋转。

这可以按我的意愿工作,我按 X 旋转,然后按 Y 旋转,但是当我按 X 进行另一次旋转时,现在旋转是按 X 旋转而不是相对于原来的!!!,但是旋转由 Y 保持我想要的。

还有什么想法吗??太感谢了!!!

4

2 回答 2

0

操作的顺序很重要,并且根据 OpenGL 中使用的语义,实际的转换以相反的顺序应用,因为它们在代码中发生。因此,如果您想先按 X 旋转,然后按 Y 旋转,则 Y 旋转必须在您的代码中排在第一位。

更深层次的原因是 OpenGL 使用(出于各种合理的原因)列主要的右关联矩阵排序。像这样的转换链

MV = V · M · R_x · R_y

将在列(位置)向量中从右向左相乘,即

MV · ↑v

分解成

V · ( M · ( R_x · ( R_y · ↑v ) ) )

并且由于矩阵不是阿贝尔矩阵,因此有无数个矩阵 A、B

A · B =/= B · A
于 2013-04-27T11:09:34.333 回答
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 并返回一个浮点数。

于 2013-04-27T13:24:42.780 回答