好的,我们现在来总结《Lesson 5 Moving the camera》的内容
我们先总结最重要的,坐标变换链——
我来解释一下。我们一开始拿到的就是顶点v,这个顶点v是在局部空间中的。
经过Model矩阵的变换,顶点v从局部空间转换到了世界空间。
经过View矩阵的变换,顶点v从世界空间转换到了观察空间。
经过Projection矩阵的变换,顶点v从观察空间转换到了裁剪空间。
经过Viewport矩阵的变换,顶点v从裁剪空间转换到了屏幕空间。
这节课我们主要讲的就是ModelView矩阵和Viewport矩阵。
首先看看ModelView矩阵,我们直接看ModelView实现的代码——
具体的解释大家可以看我翻译的Lesson 5, 这里不再赘述。
大家可以通过上图看到,ModelView矩阵是通过lookat()函数生成的。lookat()函数是可以把所有“世界坐标”变换到“刚刚定义的观察空间”。符合上面讨论的,Model矩阵和View矩阵的含义。
接下来,说说Viewport矩阵。
Viewport矩阵的意义在于——确定渲染窗口的尺寸大小。使用Viewport中定义的位置和宽高进行2D坐标的转换,将位置坐标(裁剪空间)转换为屏幕坐标。
来看看Viewport实现的代码——
意义——将双单元立方体[-1,1][-1,1][-1,1][-1,1]映射到屏幕[x,x+w][y,y+h][0,d]上。
注意:在将3D变换到4D的时候,对于向量和顶点的改变是不一样的!比如顶点P(x, y, z)是增加1来变成4D空间,向量(A, B, C)则是增加0来变换到4D空间。
所以我们可以知道,如果第4个分量w是1,说明是空间中的顶点。如果是0,说明是空间中的一个方向。区别在于,如果对于旋转操作,物体本身不会有任何变化,只是观察角度的不同。
但是从一个空间到另一个空间的变换操作,比如将这个点移动到那里,换一个方向,那么物体本身的呈现就不一样了。
使用矩阵的好处——
如果你使用3个相互垂直(或非线性)的轴定义了一个坐标空间,你可以用这3个轴外加一个平移向量来创建一个矩阵,并且你可以用这个矩阵乘以任何向量来将其变换到那个坐标空间。
剩下的内容翻译的就可以理解,大家直接去看翻译的部分即可。最后关于法线的转换很重要,在后面的切线空间中会用到。