在OpenGL中其自身的轴线旋转对象(Rotate an object on its own axe

2019-10-21 02:42发布

所以,我有,我希望周围的任何其三个轴(立方体,不是窗口的轴)旋转的立方体。 正如许多其他类似的问题已经指出,我的轮换工作,只要我只在一个方向旋转,但是当我开始将它们混合,我得到了奇怪的结果。 特别是,关于y轴的旋转总是围绕窗口的y轴,不管如何立方体已经旋转。

我的绘制代码如下:

glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity();
gluLookAt(0.0, 5.0, 15.0,  
          0.0, 0.0, 0.0,  
          0.0, 1.0, 0.0);
glPushMatrix();
glRotatef(theta_y,0,1,0); 
glRotatef(theta_x,1,0,0);
glRotatef(theta_z,0,0,1);
draw_cube();
glPopMatrix();

这个问题似乎来形容非常正是我试图做的,和接受的答案似乎正是我想做的事,但他提供的链接已经死了。

从我可以在链接的问题收集,我的Z-旋转首先执行,这意味着我的X-旋转(这将是下一个)我需要,而不是绕着(1,0,0),我会旋转约(-sin(theta_z),COS(theta_z),0)。 但随后的第三旋转,他只给出了链接,称它变得“很复杂”。 现在链接已经死了,我不知道如何去了解这个第三旋转。

编辑:基于答复,我已经增加了三个载体: cube_xcube_ycube_z持本人cube.They当前轴初始化如下:

float cube_x[] = {1.0f,0.0f,0.0f,0.0f};
float cube_y[] = {0.0f,1.0f,0.0f,0.0f};
float cube_z[] = {0.0f,0.0f,1.0f,0.0f};

早在我的绘图功能,我已经改变了它,这样的旋转围绕这些轴,而不是因为我以前有全球的坐标轴来完成。 执行三个旋转后,我打电话glGetFloatv获取当前的矩阵,并使用新的功能, update_vector填补我的立方体向量与他们的新价值观。 这一切都包含如下:

void update_vector(float vector[],float matrix[]) {
    vector[0] = matrix[0]*vector[0] + matrix[1]*vector[1] + matrix[2]*vector[2] + matrix[3]*vector[3];
    vector[1] = matrix[4]*vector[0] + matrix[5]*vector[1] + matrix[6]*vector[2] + matrix[7]*vector[3];
    vector[2] = matrix[8]*vector[0] + matrix[9]*vector[1] + matrix[10]*vector[2] + matrix[11]*vector[3];
    vector[3] = matrix[12]*vector[0] + matrix[13]*vector[1] + matrix[14]*vector[2] + matrix[15]*vector[3];

}

void my_display(void) {
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) ;

    glMatrixMode(GL_MODELVIEW) ;
    glLoadIdentity();
    gluLookAt(0.0, 5.0, 15.0,  
          0.0, 0.0, 0.0,  
          0.0, 1.0, 0.0); 
    glPushMatrix();
    glRotatef(theta_y,cube_y[0],cube_y[1],cube_y[2]); 
    glRotatef(theta_x,cube_x[0],cube_x[1],cube_x[2]);
    glRotatef(theta_z,cube_z[0],cube_z[1],cube_z[2]);

    //get the current matrix
    float my_matrix[16];
    glGetFloatv(GL_MODELVIEW_MATRIX, my_matrix);

    //Multiply the matrix by each of my vectors
    update_vector(cube_x,my_matrix);
    update_vector(cube_y,my_matrix);
    update_vector(cube_z, my_matrix);

    make_cube();
    glPopMatrix();

    /* buffer is ready */
    glutSwapBuffers();

    return ;
}

现在,当我尝试绕Y轴,立方体似乎终于安定入一个绕X轴旋转沿着前几轴摆动周围一点点。 旋转绕Z做同样的事情。 只有绕X轴似乎工作。

编辑: 解:

在下面他的评论,加文提到,Y轴旋转总是发生第一次。 这是整个问题。 通过增加一个标志ROT ,并在此基础上轴线我试图绕设置它,我能够使轴心旋转约是去年完成订购的旋转。

Answer 1:

你的注视后,必须由立方体的消极立场翻译,做旋转,再转换回立方体的位置。



Answer 2:

我不知道是什么的应该是复杂的。 OpenGL的确实的矩阵数学你。 记住矩阵乘法是缔合,所以如果的Rx等都是大约的坐标轴的旋转,然后Rx.Ry装置绕y,则X。 它总是对坐标轴无论在哪里你的形状已经结束了在其间。 顺便说一句,OpenGL ES的是右撇子,不像传统的OpenGL。



文章来源: Rotate an object on its own axes in OpenGL