用模型视图矩阵翻译世界

时间:2014-08-19 08:55:51

标签: opengl matrix

我尝试了解OpenGL模型视图矩阵。 我以为我理解它,但在我测试之后我很困惑。 为什么,如果我用

设置OpenGL MODELVIEW矩阵
glMatrixMode(GL_MODELVIEW);

GLfloat model[] = { 1, 0, 0, -1,
                    0, 1, 0, -1,
                    0, 0, 1, 0,
                    0, 0, 0, 1 };

glLoadMatrixf(model);

glBegin(GL_TRIANGLES);

glVertex4f(0, 0, 0, 1);
glVertex4f(1, 0, 0, 1);
glVertex4f(0, 1, 0, 1);

glEnd();

,我画的所有东西都不是x上的-1和y轴上的-1,我只得到一个疯狂的结果? 我认为传递的顶点都与模型矩阵相乘。

1 个答案:

答案 0 :(得分:1)

来自网站:http://www.opengl.org/archives/resources/faq/technical/transformations.htm

“翻译组件占据16元素矩阵的第13,14和15个元素,其中索引编号从1到16,如OpenGL 2.1规范的2.11.2节所述。”

在float数组中,转换组件是第4和第8个组件。

您应该将其更改为:

GLfloat model[] = { 1, 0, 0, 0,
                    0, 1, 0, 0,
                    0, 0, 1, 0,
                   -1,-1, 0, 1 };

您创建的矩阵将导致剪辑坐标的w分量表示为:

gl_Position.w = (position.x * -1.0) + (position.y * -1.0) + 1

由于ndc = gl_Position / gl_Position.w,这将导致规范化设备坐标(ndc)为:

ndc.x = position.x / ( (position.x * -1.0) + (position.y * -1.0) + 1 )
ndc.y = position.y / ( (position.x * -1.0) + (position.y * -1.0) + 1 )
ndc.z = position.z / ( (position.x * -1.0) + (position.y * -1.0) + 1 )

我能想象的会导致一些奇怪的结果。