在OpenGL中保存旋转矩阵

Posted

技术标签:

【中文标题】在OpenGL中保存旋转矩阵【英文标题】:Saving rotation Matrix in OpenGL 【发布时间】:2020-10-12 16:59:34 【问题描述】:

我正在编写一个关于在 3D 空间中旋转的圆锥体的 OpenGL 程序,并且我有一个 txt 文件,其中包含角度和旋转所围绕的轴的数据。 问题是 OpenGL 需要总旋转角度,而在文件中我有每个时间步的角度增量。

这里是我的代码:

GLdouble matrice1 []  1.,0,0,0,0,1.,0,0,0,0,1.,0,0,0,0,1.;
GLdouble * matrice = matrice1;


void displayCone(void)

    // clear the drawing buffer.
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  //

    // set matrix mode
    glMatrixMode(GL_MODELVIEW);
    // clear model view matrix
    glLoadIdentity();
    

    //gluLookAt(3.0, 3.0, 3.0-4.5, 0.0, 0.0,-4.5,0,0,1);
    gluLookAt(3.0, 3.0, 3.0, 0.0, 0.0,0.0,0,0,1);




    glBegin(GL_LINES);

    glColor3f (1.0, 0.0, 0.0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(2.0, 0.0, 0.0);

    glColor3f (0.0, 1.0, 0.0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(0.0, 2.0, 0.0);

    glColor3f (0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(0.0, 0.0, 2.0);
    glEnd();

 

    
    //glLoadMatrixd(matrice);

    glColor3f(0.8, 0.2, 0.1);

glMultMatrixd(matrice);  // <------ ** me trying to implement the previous rotation before //rotating of the increment angle xRotated 
    glRotated(xRotated,a1,a2,a3);    // <----- **here the rotation**
      
      glGetDoublev(GL_MODELVIEW, matrice); // <----- ** me trying to save the total rotation //matrix ** 

    glTranslatef(0.0, 0.0, height);
    glutSolidCone(base,height,slices,stacks);
glPushMatrix();
  glTranslatef(0.0, 0.0, height-0.1);
    glutSolidCylinder(0.07,height_c,slices,stacks);
    glPopMatrix();
glPushMatrix();
    glScalef(1.0,1.0,-1.0);
//glTranslatef(0.0, 0.0, 2*height);

//glPopMatrix();



//glPushMatrix();
  glutSolidCone(base,height,slices,stacks);

    // Flush buffers to screen
glPopMatrix();

    glFlush();


 

我在这里尝试使用glGetDoublevglMultMatrixd做的是保存先前的旋转角度,但这不起作用。有谁知道如何保存先例旋转矩阵以获得总旋转而不是增量角度的 RotationAngle ?

【问题讨论】:

【参考方案1】:

首先,您的代码使用的是陈旧的固定功能,即已经过时超过 15 年的遗留 API。

更重要的是,您可以使用适当的 3D 图形数学库(GLM、Eigen、linmath.h)来管理旋转矩阵,并使用 glMultMatrix 将其应用于 OpenGL 转换矩阵堆栈,而不是使用多次调用glRotate。或者自己管理整个转换矩阵,然后用glLoadMatrix 加载它。

当您进行自己的矩阵管理时,放弃固定函数管道并使用着色器只是一小步,您可以在其中将矩阵作为所谓的 uniform 值传递。

【讨论】:

我之前尝试过使用 glLoadMatrixd (然后使用 glGetDoublev 首先用身份初始化)而不是 glMultMatrix 但结果是一样的。你能写一个sn-p,告诉我把你告诉我的函数放在哪里吗?我还不是很擅长 OpenGL @datenwolf 特别是你会在我的代码中哪里写 glLoadMatrix ?使用 GLM 好多少? @Jatos:就在画东西之前。如果你真的,真的想坚持旧的、遗留的、固定的功能管道,你会有类似 'glMatrixMode(GL_PROJECTION); 的东西。 glLoadMatrix(my_projection_matrix); glMatrixMode(GL_MODELVIEW); glLoadMatrix(my_modelview_matrix); glDraw…(…);`——但你为什么要坚持使用旧的、遗留的东西呢?除非你袭击我的地下室,否则你很难在野外找到任何内部不使用着色器的机器,如果你使用的是固定功能管道,你对它所做的事情必须翻译成等效的着色器。

以上是关于在OpenGL中保存旋转矩阵的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 4 的旋转矩阵

将 OpenGL 4x4 矩阵转换为旋转角度

旋转矩阵的问题(openGL/glm)[关闭]

Opengl模型矩阵在旋转一圈后不绕原点旋转

OpenGL:组合平移/旋转/缩放矩阵或将它们分开?

围绕对象旋转的矩阵乘法opengl