视图变换(Viewing Transformation)
(20条消息) 计算机图形学二:视图变换(坐标系转化,正交投影,透视投影,视口变换)_剑 来!的博客-CSDN博客_计算机图形学正交投影
(21条消息) 第一章 DirectX 计算机图形学(上)_咆哮的程序猿的博客-CSDN博客_计算机图形学directx
我们先设定四个坐标系:
1,世界坐标系:三维模型都要在游戏世界拥有自己的位置坐标,这个坐标就是基于世界坐标系原点做参照。将三维模型放置到游戏世界某一个位置的过程,就是将三维模型中顶点的本地坐标转换成世界坐标的过程。这种坐标系转换是通过变换矩阵实现的。
2,物体坐标系(又称本地坐标系,局部坐标系):我们使用三角面表示三维模型,存储的三维模型的顶点中包含了坐标信息。它的坐标原点在三维模型的某一个位置(可以认为物体的中心)。所有的顶点坐标信息都是基于这个原点做参照。
3,摄像机坐标系:我们的最终任务是要获取3D场景的2D表示,也就是我们提到的透视投影。投影中心(视点)就是摄像机,投影平面也称之为投影窗口(正方形平面)。透视投影是按照三维模型近大远小的原则进行投影,距离摄像机近的就大一些,距离摄像机远的就小一些。透视投影中有一个视域体的概念,也称之为平截台体,它就是一个由视点连接投影窗口(正方形平面)形成的一个正四棱锥。在正四棱锥内的三维模型物体将会投影到投影窗口中。这个过程需要一个投影变换矩阵来完成。投影变换矩阵就是将三维模型的观察者坐标转换为二维平面坐标。在这个过程中丢失z方向的坐标信息会以另一种方式保存。
4,屏幕坐标系(视窗的坐标系):就是屏幕上的游戏窗口,它的原点在游戏窗口右上角。视口变换就是将投影窗口(二维平面)的物体坐标转换到屏幕上的一块矩形坐标区域中,本质是一个放缩+平移的过程(2D变换2D过程),这个过程需要视口变换矩阵来完成。
视图变换的任务是将虚拟世界的物体投影变换至屏幕,期间要经历4个变换
1,模型变换(modeling tranformation):物体自身的变换(当下几乎所有的模型都定义在对象空间(简单来说对象空间就是以其自身的中心点或者某个端点为原点所构件的一个局部坐标系)),即物体在世界中的位置以及其变换属性(旋转,剪切,缩放,平移等)
2,摄像机变换(camera tranformation)::目的是获取摄像机与物体之间的相对位置,为了方便计算。先将摄像机位置移动至原点,通过旋转矩阵将二者坐标系重合,这样子物体的世界坐标就是与摄像机的相对坐标了。实际上摄像机和物体该在哪里在哪里,这里变换只是为了方便计算相对坐标以及后续的内容,是计算的时候才会变换。
假如一开始设摄像机位置在(10,10,10),物体在(2,2,2),设摄像机变换到原点需要用到A矩阵,我们把这个A矩阵也作用在物体上,这样就可以得到物体在摄像机坐标下的相对位置了。如果不在原点,就要先移动摄像机和物体,如果在原点之后,还想移动摄像机,移动之后,还是要把它弄回到原点,所以把在原点以后移动的逆矩阵(考虑一下相对运动),作用在物体上,就实现了移动、旋转等变换。(可以理解为相机不动,世界动)
3 投影变换(projection tranformation)
将三维物体投影在二维平面(投影平面,也就是视域体的近平面)上,而投影平面的大小就是玩游戏的窗口大小,可以有多种设置,这个设置非常关键,涉及到后面变成标准立方体后还原比例:
具体流程是:设定好近平面(投影平面)的长宽比例,然后缩放成标准立方体的时候,平面会缩放为-1到1的平面
此时比例破坏,然后待会儿还有一个叫视口变换的变换会按照比例还原
视域体:只有在这个方体里面的东西才会被渲染在屏幕上
投影变换会将视域体变换到规范立方体 (Canonical View Volume) 范围内
1,正交投影变换(Orthographic Projection Transformation)
正交投影的视域体可以被规定为一个长方体(就是存放物体的空间,位置如图所示),把视域体变换到原点,(归一化处理)缩放为一个标准的
立方体(立方体里面物体的顶点也一起变换,也就是里面的物体也会被拉伸,之后会在视口变换中会按照投影平面大小的比例重新拉伸,而视窗的坐标系是从不是平面正中心,所以视口变换会有移动变换)
视口变换
2,透视投影变换(Perspective Projection Transformation)
透视投影变换分为:透视变换+正交投影变换 先把远平面以及中间的位置往里挤成进平面(最后挤成一个长方体),挤的过程中要有一些规定,第一,近平面怎么挤都不变,第二,远平面挤的时候z轴大小不变,只是往里面收缩
左图是透视投影,右图是正交投影
n是近平面,越远的东西收缩越厉害,形成透视关系
投影变换推导
我们定义一个原点,摄像机从z的负轴出发(延伸出一个四菱锥),距离为n时设定视域体的近平面(设定一个视域体),然后随机取视域体上的一个点,由于是随机取点所以z的大小我们是不知道的,从侧面来利用相似三角形进行推导。这里的图片是将(x,y,z)变为投影平面上的(x',y',z'),利用齐次坐标的性质,利用矩阵完成透视变换
这里nx/z和ny/z利用齐次坐标的性质消去了x,y轴上对于z大小的影响
透视变换其过程就是将整个视域体利用矩阵按照透视规则压缩一遍
然后推导出矩阵
第三行全部都是未知数,我们要利用刚开始订制的两个规则进行操作。
近平面所有的点经过变换之后都不会变,(x,y,n)经过变换后还是(x,y,n)。(为什么z轴是n因为我们知道近平面距离为n),然后因为要同乘z(为了消除未知对x,y轴的影响),所以近平面上的点有如图公式运算。
我们把目光放到矩阵第三行对点的影响,可以知道根据矩阵运算,点经过矩阵第三行变换后等于n的平方,想要有这个结果,所以矩阵第三行的前两个数字必须是0,第三个数和第四个数我们设未知数A、B,所以到现在我们推导出了第三行为(0,0,A,B),其中A B为未知数。
结合远近平面z轴不变的设定来推导,代入公式
至此,整个透视矩阵已经推导出来
然后进行再进行正交变换,便有透视投影变换矩阵
完成!
此时得到了一个具有透视规则的标准正方体,然后进行视口变换就可以把游戏世界转换到屏幕上了