我重写了OpenGL glTranslatef
,glScalef
和glRotatef
函数。我正在使用这些函数来绘制和转换圆并与内置函数进行比较。一切似乎都处于正常工作状态,我的功能与内置功能完全一样,只有一个小例外。
当我使用内置函数进行缩放时,我将对象移回原点,如下所示:
glTranslatef(50, 50, 0);
glScalef(2.0, 1.0, 0.0);
glTranslatef(-50, -50, 0);
glDrawArrays(GL_LINE_LOOP, 0, numVertices)
但是当使用我自己的函数时,我发现我必须切换翻译语句以获得与上面相同的结果:
MyTranslate(-50, -50, 0);
MyScale(2.0, 1.0, 0.0);
MyTranslate(50, 50, 0);
glDrawArrays(GL_LINE_LOOP, 0, numVertices)
也就是说,要么坐标系搞砸了(不太可能),要么以不同的顺序读取语句(更有可能)。
翻译功能并不特别:
GLfloat translate[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 };
GLfloat modelview[16] = { 0 };
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
matrixMultiply(modelview, translate);
glLoadMatrixf(result);
我确信比例和矩阵乘法函数都很好。任何人都可以对我遇到的陈述转换现象提出一些建议或解释吗?
答案 0 :(得分:1)
如果问题不明确或构建不当,我道歉。但是,我找到了一个解决方案,并希望与StackOverflow社区分享。
问题非常简单:在OpenGL中,内置函数的顺序是"反转"这样最先应用最接近绘制对象语句的转换。在编写和使用我自己的函数时,我只需操作模型视图矩阵,我就不得不反转" (也就是说,按照正确的顺序)转换,以便首先按时间顺序在代码中出现的转换。
OpenGL内置函数示例:
glTranslatef(30, 30, 0); // Translate / perform other transformations
glTranslatef(50, 50, 0); // Translate back to original position
glRotatef(20, 0, 0, 1); // Rotate object
glScalef(1.5, 2.5, 1.0); // Scale object
glTranslatef(-50, -50, 0); // Translate object to the origin
glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices); // Draw the object
这里的订单至关重要。但是当使用我的函数时,顺序必须是反向的(放入"逻辑顺序")才能正确地将更改应用于Modelview Matrix。任何对转换矩阵有基本了解的人都知道错误顺序的矩阵乘法会产生与预期完全不同的结果。
自编函数示例:
MyTranslate(-50, -50, 0); // Translate object to the origin
MyScale(1.5, 2.5, 1.0); // Scale object
MyRotate(20, 0, 0, 1); // Rotate object
MyTranslate(50, 50, 0); // Translate back to original position
MyTranslate(30, 30, 0); // Translate / perform other transformations
glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices); // Draw the object