您的位置:首页 > 运维架构

OPENGL坐标 变换

2012-12-02 19:14 169 查看
OPENGL坐标 变换,世界坐标系都不动,以屏幕中心为原点(0, 0, 0),你面对屏幕,右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。当前绘图坐标系是绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标 系是重合的,当用glTranslatef()等变换函数做移动和旋转时,都是改变的当前绘图坐标系,改变的位置都是当前绘图坐标系相对自己的x,
y,z轴所做的改变,改变以后,再用glVertex3f()等绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相对当前绘图坐标系 来讲的。
这里我们以GL为 概念。当我们输入glutSolidCube(4)的时候,它会产生这样的数 据:glVertex3f(2,2,2),glVertex3f(-2,-2,-2)等等,也就是长度为4的一个立方体。注意我们画的这个立方体的位置, 肯定是出现在“世界”的中心位置。如果我们希望它移动到其他的位置呢?只能先glTranslatef(),再glutSolidCube。这个 glTranslatef作用在MODELVIEW_MATRIX上,具体的形式请到OpenGL
Wiki上看,那里连载了RedBook。

比如我们输入glTranslatef(1.0,0,0);glutSolidCube(4),其实它产生的“真正顶点”是,(3,2,2), (-1,-2,-2),统统向x方向移动了一个位置。如果你在自己的范例程序里看不到是因为perspective中的far near planes没有设置好。这样我们就仿佛实现了平移以及旋转等等操作,注意,是仿佛。

我们把变换顶点的矩阵一般称为MV(Model View)矩阵,把和在一起一步到位的矩阵称为MVP矩阵,在GLSL中就有gl_ModelViewMatirx和 gl_ModelViewProjectionMatrix这两个Uniform Matirx。我们输入一个顶点,希望把它放到这个世界的正确位置上,就需要乘以适合它自己的MV,因为不一样的模型当然需要不一样的世界位置。矩阵乘法 就可以完成这项神奇的工作。可是向量的概念则很大不同。

一个正方体,只要它在我们的映像中从头到尾都是方方正正的立在场景中,它的向量,无论朝上朝下都应该是相同的,比如(1,0,0)左边的面,只要我们不旋 转这个正方体,它在Local坐标系还是变换后也应该是(1,0,0),这个时候我们用哪个矩阵呢?用MV显然不同,就需要用MV的Inverse Transpose。在线性代数中,求一个矩阵的Inverse然后Transpose,与先求Transpose再求Inverse,这两边是完全相等 的。在GLSL中,其实gl_Normal*gl_NormalMatrix等同于 gl_Normal*gl_ModelViewInverseTransposeMatrix。REDBOOK是这样说的:

In other words, normal vectors are transformed by the inverse transpose of the transformation that transforms points.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: