如何在旋转轴全球的图形,而不是本地轴?(How to rotate a graphic over g

2019-10-18 01:57发布

我觉得我的问题很简单,但在OpenGL I'm新的,我不知道该怎么办。

我试图旋转金字塔(图中并不重要),我想相对于X旋转,然后用尊重为Y AX旋转。

但是,当我做X旋转时,Y AX旋转了。 然后,当我想以旋转为Y丝毫尊重,Y轴是不再是原来的。

接下来的图像显示在起源如何MI金字塔明星:

然后旋转到X winth方面:

轴Y和Z旋转一样,那么如果我想对于为Y,旋转,金字塔就在Y AX旋转,而不是,原始的Y AX(强生)旋转。

我用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(OpenGL的C#),但它是相同的。

更新

我改变我的代码:

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的Cos仙; 0 -Sin的Cos]由矢量Y [0 1 0],将得到的矢量[0的Cos -Sin],我把旋转运动通过Y.

这个工程,我想,我做的X旋转,由Y旋转后,但是当我用X做另一转动,现在的旋转是由X旋转,而不是相对于原来的!!!,但是旋转由Y保持,因为我想要的。

任何另一个想法? 非常感谢!!!

Answer 1:

操作顺序关系,并通过在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


Answer 2:

我最近遇到了这一点,并结束了与此解决方案:

  1. 绕本地x轴与glRotate(bx,1f,0f,0f);
  2. 局部坐标系中计算全局y轴组件ux=0uy=cos(bx) 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));

到角度转换为弧度,拿正弦和余弦并返回一个浮点数。



文章来源: How to rotate a graphic over global axes, and not to local axes?