Viewing Transformation(观测变换)
一.View/Camera Transformation(视图变换)
视图变换主要包含模型变换和视图(摄像机)变换,统称为视图变换。
什么是视图变换?
模型-视图-投影变换,简称“MVP变换”
-
M:model transformation
- 设置好场景
- ex: 选好地方人摆好姿势
-
V:view tranforamtion
- 设置好Camera的look at方向和up方向
- ex:找到一个角度放置照相机
-
P:projection tranformation
- 将camera看向的3d内容转换为2d画面
- ex:拍照
model/view变换常常同时进行,由下方视图变换章节可知,做视图变换时根据相对静止,模型也同时应用变换。
如何做视图变换?
1.定义照相机
- postion 定义相机的位置
- look-at/gaze direction 定义相机看向的方向
- up direction 设定相机的up-direction
一个位置,两个向量,则可以确定一个相机,以上则是观测矩阵所需要的初始的定义。
2.观察
前提:当物体与相机保持相对静止时,相机与物体无论如何移动,观察的结果不变。
因此,进行以下的处理:
-
(1) 处理:变换相机到标准中心:
放在原点、up方向为向上的y轴,看向-z方向
(2) 模型随相机一起运动
好处:简化很多操作
- 设相机在e点上,look at/gaze direction的方向为g,up方向为t
- 现在需要把相机移动到原点,向量g旋转到-z上,t旋转到y正半轴上。
基本步骤:
- 平移,将e点移动到原点
- 旋转g到-z方向
- 旋转向上方向t到+y上
- 前面步骤完成后,自然而然地gxt的方向就在+x方向了。
上述步骤使用矩阵表示
-
Tview 平移矩阵
Rview 旋转矩阵
由g,t,gxt旋转到-z,y,x上矩阵难写,可以利用旋转矩阵是正交矩阵(正交矩阵的逆等于转置)的特性:
- 先求Rview的逆->Rview-1(即x,y,-z旋转到gxt,t,g),
- 再对Rview-1求转置得到Rview。
二、Projection Transformatio(投影变换)
正交投影:假设相机拿到无限远,近平面与远平面完全一样大小。
透视投影,frustum中内容成像到近平面上
1、正交投影<br />Orthographic projection
无近大远小.
基本思想
- 设置camera在原点,gaze /look at方向为-z,up方向为+y
- 舍弃物体z值,使物体的z都等于0,至此所有物体都只在x轴跟y轴上,摄像机看到的就是x、y平面上的一张图。
- 将物体都挤压到规范正方形[-1,1][-1,1],这一步是约定俗称的操作,为了方便后面的计算。
图形学中的实际操作:
- 定义空间中的立方体,[lxr]x[b,t]x[f,n]。f<n,因为右手系,camera延着-z方向看
- 中心位于((r+l)/2,(t+b)/2,(n+f)/2)的立方体延着(-(r+l)/2,-(t+b)/2,-(n+f)/2)平移到原点。
- 将其给拉成一个[-1,1]的正则(canonical)立方体
数学上的表现
2、透视投影:<br />Perspective projection
符合人眼成像,近大远小,平行线远处会相交
基本思想:
- 将frustom挤压成一个长方体
- 再做一次正交投影
如何挤?
定义:
在挤压的过程中,近平面任何一个点的x,y,z值永远不会发生变化。
在挤压过程中,远平面上的Z值不会发生变化。
挤压过程中,远平面的中心点也不会发生变化。
挤压过程:
-
从侧面观察,根据相似三角形可得y'=(n/z)*y
-
同理可得x’
-
结果的点可以写成一个齐次坐标矩阵,然后同乘z后,仍然表示同一个点
-
写出变换矩阵表达式,原来的点经过变换矩阵后,得到第3步表示的点
-
由第4步,可以反推变换矩阵的形式如下:
-
M的第3行一定与z'有关系。
-
根据前述的定义:
-
近平面上的点x、y、z值不变。取点(x,y,n),得到结果后同乘n
观察结果第3行=n*n,与x、y无关,因此M前两项必为0:M的第3行=(0,0,A,B)
远平面上的点的z值不变。取点(0,0,f),代入上述求到的(0,0,A,B)——变换矩阵第三行
综上两个等式,变换矩阵求解完毕
课后思考:
在将frustum挤压为Cuboid的过程中,已知远平面和近平面的Z'不变,那么近平面与远平面之间的z,z’相对z如何变化,更近了还是更远了?
-
解答
设任意点(x,y,z)经M变换
注意点:camera在原点看向-z方向,所以n+f<0
综上,z’相对z减小,更接近远平面了
小结:
本节课主要讲述观测变换(Viewing Transformation)——三维的场景转换为二维的画面。观测变换包括:
- 视图变换(M、V)
- 视图变换包含模型变换(Model Transformation)与视图变换Viewing Transformation,两者通常同时进行,统称为视图变换。
- 这一步的目的是将摄像机摆放到look at/gaze方向为-z方向,up为+y,位置为原点的方向,包含平移与旋转过程,物体跟随相机同步变换。
- 变换矩阵最终实际上是作用到物体上,因为应用到物体后,我们就知道这时摄像机就已经摆放到指定位置。
- 求旋转变换矩阵的过程中根据正交矩阵的性质,可以通过求逆矩阵的方式计算,计算非常方便。
- 投影
投影分为:
-
正交投影
- 求将立方体映射到[-1,1]x[-1,1]x[-1,1]的标准立方体(canonical cube)的变换矩阵。
- 无近大远小,工程制图应用多。
-
透视投影
- 先将四棱锥frustum“压缩成”立方体
- 再进行正交投影。
- 近大远小,更符合人眼
更多
CocosCreator3.4.2原生二次开发的正确姿势——手把手教你接SDK
关于作者
我是羽毛,一名游戏研发工程师,一名野生摄影同学。我的公众号主要分享自己的一些游戏项目开发过程中的功能总结及日常开发笔记。也希望能通过平台的交流,与更多有想法的同学交流认识,共同成长。
欢迎大家在日常开发过程中,如果觉得有需要讨论解决、分享或者探讨的内容,在公众号后台或者文章留言处给我反馈,提供写作的方向,从另一个角度也尽量让写作内容更贴近大家的需求以及痛点,在此谢谢各位同学.
另外羽毛也提供付费技术咨询的服务,有需求的同学可以公众号后台私信添加微信。
今日技能你学废了吗?
<div align ="center">
<h2>更多精彩欢迎关注微信公众号“羽毛不会飞”</h2>
<img src="https://upload-images.jianshu.io/upload_images/21178773-2e5d33fde1edc63e.png" width="80%"/>
<img src="https://upload-images.jianshu.io/upload_images/21178773-ebca0bcc56f0bd3e.png" />
</div>
本文由mdnice多平台发布