opengl 矩阵问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl 矩阵问题相关的知识,希望对你有一定的参考价值。

众所周知opengl相对于世界坐标系的变换顺序是反的,可实际应用中如果一个事件触发,需要对当前的一个模型相对于世界坐标系进行变换,而这个模型之前已经被变换过,如何在重绘中不丢失之前的操作而且相对于世界坐标系应用本次操作?或者说如何保存之前的变换矩阵或顶点,能够让本次的变换矩阵右乘之前被保存的矩阵或顶点?50分献上,求教各位大神了

glm::mat4x4 mm;void display(void)


glClear (GL_COLOR_BUFFER_BIT);
glLoadIdentity ();             
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glTranslatef(-1.0f,-1.0f,0.0f);
glRotatef(10.0f,1.0f,1.0f,1.0f);

glPushMatrix();
glMultMatrixf( glm::value_ptr(mm) ); //use updated matrix mm

//draw something....

glPopMatrix();
   
glFlush ();
mm = glm::rotate( mm, 2.0f, glm::vec3(1.0f,0.0f,0.0f)); 
//rotate trans etc.追问

不行啊,我希望mm矩阵是后应用的操作,是mm右乘之前的矩阵才能表现为相对于世界系的变换

参考技术A 记得好像glPushMatrix(); 再变换;再glPopMatrix();追问

popmatrix只能装入,但他会把之前的变换删掉,有没有办法右乘

追答

你是说右乘?啥操作需要右乘呢?能不能想办法用左乘实现?

追问

相对于世界系的变换只能这么做,因为后应用的操作先变换,就是纠结在是事件触发,没法知道后应用的操作是什么,无法将代码提前。

追答

刚看了看,右乘是根据自身坐标系的变化。即使如此,形如:操作3*操作2*操作1*原始坐标,这样一系列操作;你想用右乘的操作4在1后边:操作3*操作2(*操作1*原始坐标*操作4)。
如果这样的话,可以事先在操作1的地方把矩阵保存一下,push就可以(也可能有别的办法),之后试试glMultiMatrix。
或者,把已知的右乘的矩阵等效成数个左乘操作和矩阵加法。

OpenGL中矩阵堆栈的意义何在?

【中文标题】OpenGL中矩阵堆栈的意义何在?【英文标题】:What is the point of the matrix stack in OpenGL? 【发布时间】:2010-09-20 22:32:09 【问题描述】:

我为什么要使用 OpenGL 的矩阵堆栈(而不是包装我自己的矩阵类并只使用它)?我不太确定为什么这么简单的任务会如此复杂。它有什么特殊用例吗?

如果没有必要,有什么好的替代品?

【问题讨论】:

【参考方案1】:

OpenGL 的矩阵堆栈(有多个 - 每个矩阵模式一个)旨在与分层模型一起使用。也就是说,您可以定义子对象(例如,车轮)相对于其父主体(例如,汽车)的装配,而无需考虑绘制子对象时父对象的位置/方向。也就是说,它允许您轻松直观地组合变换。

matix 堆栈(以及一般的 GL 矩阵运算)不能替代通用矩阵数学库。它们的存在只是为了允许将组合变换有效地应用于顶点数据。正如其他人所说,随着固定功能管道的消亡,此功能已从 OpenGL 中删除,因为着色器程序的需求不如旧管道的需求统一。

【讨论】:

【参考方案2】:

矩阵栈用于连接矩阵。通常用于层次模型,其中转换是相对于另一个表示的。可以在堆栈上加载一个矩阵并转换该空间中的顶点,然后通过弹出堆栈返回父空间。您可以自己在代码中管理所有这些,而且您通常更愿意这样做 - 特别是在矩阵用于除简单绘图之外的其他事情或您经常访问它们的情况下。动画系统就是一个典型的例子。

【讨论】:

【参考方案3】:

您将主要使用内置矩阵堆栈,因为 OpenGL 会自动应用它们。它们已在最新版本的 OpenGL 中被删除,因此至少有一些人显然认为它们是不必要的。就个人而言,我认为这是一个糟糕的决定,但生活就是这样。另一种方法是自己实现它们——唯一的安慰是,对于大多数 3D 图形的使用,你通常必须自己做一些矩阵乘法(等等),所以它通常不会产生很多区别。

【讨论】:

只是一个小问题:如何在没有矩阵堆栈的情况下将我的矩阵应用(?)到每一帧的场景中? @Clark:在这种情况下,您通常会将当前的转换矩阵设置为 uniform s,然后在顶点着色器中“应用”它们,例如:uniform mat4 projection; uniform mat4 model_view; in vec4 vertex; gl_Position = projection*model_view*vertex; 您可能还想要看 GLM:glm.g-truc.net.【参考方案4】:

没有必要——你可以自己做所有的矩阵工作并一直调用 glLoadMatrix——但也没有必要替换它。如果您使用 VBO 和显示列表,只会让生活变得困难。

【讨论】:

【参考方案5】:

矩阵是您提供的几何体(顶点)改变坐标系和投影的机制,最终以像素空间的形式出现在屏幕上。所以从这个意义上说,一些矩阵代表不同的坐标系(例如,腿等层次模型的父/子关系),一些矩阵代表从世界空间到视图空间到设备(像素)空间的转换。基本上它们是一种机制,您可以通过它来操纵顶点,但它们在语义上对应于诸如那些的操作。它们以堆栈形式出现,以便于使用它们进行编程。

【讨论】:

以上是关于opengl 矩阵问题的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL中矩阵堆栈的意义何在?

OpenGL 3.2 设置矩阵的麻烦

为啥在 OpenGL 中显式管理矩阵更好?

使用 OpenGL 4 的旋转矩阵

OPENGL之矩阵

openGL - 正交投影矩阵