图形学学习笔记2:视图变换(投影)

什么是视图变换?参考拍摄一张照片的过程:

首先,摆好人和pose,场景搭好(模型变换)就是游戏场景和物体调整至对应位置

之后,找一个好的位置和角度放好相机(视图变换)即得到物体与摄像机的相对位置

最后,拍照(将三维投影到二维,即投影变换)根据摄像机变换得到了所有可视范围内的物体对于摄像机的相对位置坐标(x,y,z)之后,根据是平行投影还是透视投影,将三维空间投影至标准二维平面上

总结:模型-视图-投影变换 m-v-p

如何进行视图变换?定义相机位置,观察方向和上下方向,如图所示:

相机或眼睛位置 (eye postion) e

观察方向 (gaze postion) g

视点正上方向 (view-up vector ) t

如果相机和场景和所有物体都一起运动,即没有发生相对运动,则运动前后拍出来的结果一定是一样的

同理,一般将相机移动到固定位置上,如(0,0,0)标准位置上,往-z方向看

把摄像机摆放好,即把egt换到xyz坐标系,矩阵形式具体操作如下:

如图,先平移到观察轴原点(直接减去位置坐标即可),

之后将相机的g旋转到-z轴方向,相机向上的方向t旋转到Y轴方向,之后g和t叉乘得到X轴,

即通过旋转矩阵将二者坐标系重合

原始的旋转矩阵不好求,则考虑将(1,0,0)(0,1,0)(0,0,1)转到相机的方向(t,-g等),该操作即为原始矩阵的逆变换

由此可得实际要求的相机到原点的旋转矩阵就是世界坐标转换到teg坐标的旋转矩阵的转置矩阵

(因为是正交矩阵,他的逆就是转置)

其他物体用同样方法跟着变换就是Model Transformation

Projection Transformation(投影变换)

将三维空间投影至标准二维平面,分为:

Orthogarphic Transformation正交投影

Perspective Transformation透视投影

区别:

如图,透视投影原本平行的线不再平行,而是延长后会相交 更接近于人眼 有近大远小现象

而正交投影平行的仍然平行,更多用来工程制图 并不会有近大远小现象

图a 摄像机近似为一个点 形成一个视锥体 将一定范围内的物体投影到近处的平面上 投影近大远小

图b 假设相机距离物体无限远 近和远的物体在平面上投影出来是一样的大小

Orthogarphic Transformation正交投影

首先将相机放在原点,其余对应

简单理解:丢掉Z轴,自然就是一张平面图(问题:如何区分物体的前和后?)

图形学上的正式做法:

所有光线都是平行传播,我们只需将物体(可视部分,即上图的那个长方体,实际中是规定好的空间中的某一块)

全部转换到一个[1,1,1]大小的标准立方体canonical cube之中即可(其中x,y坐标便是投影结果,保留z是为了之后的遮挡检测)

这是为了之后的计算更加的方便,在转换到屏幕坐标的时候就会重新拉伸回来,所有物体的相对大小位置都不会变化

注:由于沿着-z方向去看,距离相机远的面的z值更小,有点反直觉(右手系的缺点,OpenGL类似的API使用的是左手系)

数学形式:

首先将长方体中心平移到原点(物体坐标是相对相机原点的偏移,正负都一样),再进行缩放将x,y,z的宽度都变为2

(因为要缩放到小正方体内部),如图,非常简单:

Perspective Transformation透视投影(使用广泛)

特点:近大远小 平行线不再平行而是相交于一点

注意:齐次坐标 k(x,y,z,1)得到的(kx,ky,kz,k)其实还是(x,y,z,1) (k!=0)

如图,与正交投影的主要区别在于透视投影是近平面n不变,远平面f的z不变,中心点不变,

其他向里面(挤压)收缩到和近平面一样,即把左边挤成右边的一个长方体(从透视到正交)

之后再做一次正交投影即可

如何挤压:通过相似三角形获得对应坐标关系,如图为y'与y的关系,x同理

由已知形式可得部分转换矩阵:

此时需要用到转换时的一个前提,即使可视空间Frustum的前后面变换之后z坐标不变,但用的是同一个变换矩阵

由此可求得最后一行,如图

经过两个平面的推导可得到完整转换矩阵,之后就再进行正交变换即可:

视口变换(viewport transformation)

就是两个范围空间的转换,将变换得到的[1,1,1]大小的标准立方体根据需要转换到适合的尺度,直接套公式即可

总结:把游戏世界的任意可视物体转换到屏幕上的变换就是依次使用以上变换

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值