相机与矩阵

这两天终于闲了下来有时间写点东西了,只记得想写相机已经是很久远的事情了,开发中涉及到相机相关的内容也已经是两个月之前了。

在3D的世界里相机与矩阵是密不可分的,首先在投影之前,有模型矩阵和视图矩阵,这两者并没有本质上的区别,一个是站在模型的角度,另一个就是站在观察者的角度了。模型的左移相当于相机右移,有鉴于此,OPENGL中并不区分Model Matrix 和 View Matrix,而是将两者统称为ModelView Matrix.

 以gluLookAt函数为例,该函数根据眼睛的位置,场景中心的位置,以及一个从观察者视角向上的向量定一个视图转换,实际上做的还是应用一个ModelView Matrix。原点位置和眼睛位置确定了z方向向量,向上的向量确定了y方向向量,两者正交,叉积就是z方向向量了,这样就可以确定一个视图矩阵了。

相机不仅仅与ModelView Matrix有关,而且也与投影矩阵有关系。有了相机,再结合ViewPort大小,FOVy(Y方向Field Of View)或者Aspect Ratio,近裁减面,远裁减面就可以确定透视投影矩阵了。

一个4*4的矩阵如何与模型/视图变换联系起来呢?看这个图,前三个列向量分别代表新坐标系的x,y,z轴方向,而最后一个向量则代表平移量(新坐标原点),而矩阵的(4,4)元素则是一个放大因子,他同时将所有点之间的距离放大。如果我们把一个四维向量与之相乘,就可以得到新的坐标了。

什么是万向节锁(Gimbal Lock)呢?这是采用欧拉角的方式表示相机时出现的问题。这个问题源于绕轴旋转时自由度的丢失。因为旋转到轴向时将无法确定是从哪个方向旋转过来的。这就有点像是北极与南极点的经度无法确定一个道理。而且在这个地方,可能出现角度的不连续变化。即直接从0度跳转到180度。在相机方向平行于X轴向时,绕X轴的旋转不会有任何效果,也就是说,从数学上来讲此时的ModelView Matrix始终是不变的。在计算时,由于角度变化不连续,所以计算的结果是很不稳定的。例如漫游旋转时,简单的增加角度,可能在某些临界值上出现错误的情况,典型的就是绕某一个轴的来回震荡,这也就是所谓Lock的意义了吧。

posted on 2007-08-04 17:06 雁过无痕 阅读(777) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(7)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜