浅谈OpenGL变换矩阵
OpenGL中使用的矩阵全为列向量为主的矩阵。
参考OpenGL变换网站为 http://www.songho.ca/opengl/gl_transform.html
1.什么是GL_MODELVIEW矩阵?
GL_MODELVIEW矩阵是Model矩阵和View矩阵的乘积,即M_modelview = M_view * M_model。
model矩阵用于从物体坐标系到世界坐标系的转换,一般是通过旋转、平移或缩放得到。
view矩阵用于从世界坐标系到摄像机坐标系的转换。
顶点的矩阵变换如下所示:
OpenGL中的modelview矩阵(列向量为主):
2.法向量的坐标转化
与图1中顶点变换不同,法向量从物体坐标系变换到摄像机坐标系是通过M_modelview逆矩阵的转置实现的。
法向量的矩阵变换如下所示:
到此为止,很多人会有疑问:法向量的变换公式是如何得到呢?
其实法向量变换的公式是根据平面方程的得到,具体推导过程如下:
已知法向量n(nx,ny,nz,nw),假设平面上的一点为v(x,y,z,w),则平面方程为nx * x + ny * y + nz * z + nw * w = 0;
将法向量与点的关系转化为矩阵表达形式为:
通过GL_MODELVIEW矩阵转换得到:
右边的部分是将顶点从物体坐标系转换到摄像机坐标系,而左边的部分是将法向量转换到摄像机坐标系的表达式,因此
即:
参考网站为 http://www.songho.ca/opengl/gl_normaltransform.html
3.标准设备空间,英文为Normalized Device Coordinates(Or NDC),它是在投影坐标系(剪裁空间)中经过透视除法得到的,其x,y,z的范围均为[-1,1]。
透视除法英文为perspective division。
4.glViewport(x,y,w,h) command is used to define the rectangle of the rendering area where the final image is mapped.
glViewport方法用于定于渲染区域的矩形。
5.glDepthRange(n,f) command is used to determine the z value of the window coordinates.
glDepthRange方法用于定义屏幕坐标的z值。
6.根据4,5可以得到屏幕坐标(screen coordinates):
7.当多个矩阵共同起作用时,一定要注意矩阵乘法的先后顺序,不同的顺序得到的结果也不同,例如:
顶点V先进行矩阵M1变换,再经过矩阵M2变换得到顶点V',则在OpenGL中的表达形式为:
V' = M2 * M1 * V
1 // 注意:物体实际的顺序为先进性平移再进行旋转 2 glRotatef(angle, 1, 0, 0); // 将物体绕X轴旋转anlge 3 glTranslatef(x, y, z); // 将物体平移到(x, y, z) 4 drawObject();
8.投影矩阵
OpenGL中的投影方式分为两种:透视投影和平行投影(也叫正交投影),是通过left,right,bottom,top,near,far六个参数计算得到的。
具体内容可参见下一篇博客,未完待续.....