在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();
我在这里尝试使用glGetDoublev
和glMultMatrixd
做的是保存先前的旋转角度,但这不起作用。有谁知道如何保存先例旋转矩阵以获得总旋转而不是增量角度的 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中保存旋转矩阵的主要内容,如果未能解决你的问题,请参考以下文章