计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)
计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)
目录
- 计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)
- 一、简介
- 1.模型变换(Model transformation)
- 2.视图/摄像机变换(View/Camera transformation)
- 3.投影变换(Projection transformation)
- 4.视口变换(Viewport transformation)
- 二、模型变换
- 三、视图变换(或摄像机变换 camera transformation)
- 四、投影变换
- 1.正交投影(orthographic)
- 2.透视投影(Perspective)
- 五、视口变换
- 六、总结
- 参考
一、简介
我们可以这样来描述观测变换(Viewing transformation)的任务:将虚拟世界中以(x,y,z)为坐标的物体(三维)变换到 以一个个像素位置(x,y) 来表示的屏幕坐标系之中(二维),这确实是一个较为复杂的过程,但是整个过程可以被细分为如下几个步骤:
1.模型变换(Model transformation)
将模型空间转换到世界空间,这一步的目的是将游戏场景中的物体调整至他们应该在的位置。
2.视图/摄像机变换(View/Camera transformation)
将世界空间转换到观察空间,在游戏中我们真正在乎的是摄像机(或者说眼睛)所看到的东西,也就是需要得到物体与摄像机的相对位置。
3.投影变换(Projection transformation)
将观察空间转换到裁剪空间,根据视图变换得到了所有可视范围内的物体对于摄像机的相对位置坐标(x,y,z)之后,便是根据是正交投影(Orthographic)还是透视投影(Perspective),裁剪空间的目标是能够方便地对渲染图元进行裁剪:完全位于这块空间内部的图元将会被保留,完全位于这块空间外部的图元将会被剔除,而与这块空间边界相交的图元就会被裁剪。
4.视口变换(Viewport transformation)
将裁剪空间转换到屏幕空间, 接下来,需要把裁剪空间投影 (真正的投影其实发生在这里) 到屏幕空间 (screen space) 中。经过这一步变换,我们会得到真正的像素位置,而不是虚拟的三维坐标。即[−1,1]2→[0,width]∗[0,height][-1,1]^2 \rightarrow [0,width]*[0,height][−1,1]2→[0,width]∗[0,height],其中width和height指屏幕分辨率大小。
二、模型变换
就像简介说的一样,就是利用基础的变换矩阵将世界当中的物体调整至我们想要的地方(旋转,平移,缩放)。
三、视图变换(或摄像机变换 camera transformation)
上文说,视图变换是为了得到了摄像机和物体的相对位置,那么怎么获得这个相对位置呢?
首先,我们需要先定义一个摄像机,通过下面三个信息我们可以定义一个摄像机:
摄像机的位置 e⃗\vec{e}e
摄像机观测方向 g^\hat{g}g^
摄像机的向上方向 t^\hat{t}t^
OK,现在我们在空间中定义了一个摄像机,我们知道,只要物体和相机的相对位置不发生变化,那它们在空间中如何移动,相机观测获得的结果是相同的,所以我们不妨把相机规定到原点、向上的方向就是y轴正方向、并且向z轴负方向观测(右手系),其他的物体也随着相机移动到对应的相对位置上、我们得到的结果肯定是一样的。
所以我们需要一个视图变换矩阵MviewM_{view}Mview这个矩阵将实现以下功能:
所以 Mview=RviewTviewM_{view}=R_{view}T_{view}Mview=RviewTview
Tview=(100−xe010−ye001−ze0001)T_{view}=\left(\begin{matrix}1&0&0&-x_e\\0&1&0&-y_e\\0&0&1&-z_e\\0&0&0&1\end{matrix}\right)Tview=⎝⎜⎜⎛100001000010−xe−ye−ze1⎠⎟⎟⎞
Rview−1=(xg^×t^xtx−g0yg^×t^yty−g0zg^×t^ztz−g00001)R_{view}^{-1}=\left(\begin{matrix}x_{\hat{g} \times \hat{t}}&x_t&x_{-g}&0\\y_{\hat{g} \times \hat{t}}&y_t&y_{-g}&0\\z_{\hat{g} \times \hat{t}}&z_t&z_{-g}&0\\0&0&0&1\end{matrix}\right)Rview−1=⎝⎜⎜⎛xg^×t^yg^×t^zg^×t^0xtytzt0x−gy−gz−g00001⎠⎟⎟⎞
Rview=Rview−1TR_{view} = R_{view}^{-1T}Rview=Rview−1T
Rview=(xg^×t^yg^×t^zg^×t^0xtytzt0x−gy−gz−g00001)R_{view}=\left(\begin{matrix}x_{\hat{g} \times \hat{t}}&y_{\hat{g} \times \hat{t}}&z_{\hat{g} \times \hat{t}}&0\\x_t&y_t&z_t&0\\x_{-g}&y_{-g}&z_{-g}&0\\0&0&0&1\end{matrix}\right)Rview=⎝⎜⎜⎛xg^×t^xtx−g0yg^×t^yty−g0zg^×t^ztz−g00001⎠⎟⎟⎞
视图变换总结:
变换摄像机到(0,0,0),上方向是y,向-z方向看,并把物体跟随相机一同变换。
四、投影变换
物体接下来要从观察空间转换到裁剪空间(clip space,也被称为齐次裁剪空间)中,这个用于转换的矩阵叫做投影矩阵(projection matrix),也被称为裁剪矩阵(clip matrix)。
裁剪空间的目标是能够方便地对渲染图元进行裁剪:完全位于这块空间内部的图元将会被保留,完全位于这块空间外部的图元将会被剔除,而与这块空间边界相交的图元就会被裁剪。那么,这块空间是如何决定的呢?答案是由视锥体(view frustum)来决定。
视锥体指的是空间中的一块区域,这块区域决定了摄像机可以看到的空间。视锥体由六个平面包围而成,这些平面也被称为裁剪平面(clip planes)。
视锥体有两种类型,这涉及两种投影类型:一种是正交投影(orthographic projection),一种是透视投影(perspective projection),如上图所示。
而用六个裁剪平面(视锥的六个面)直接判断相对复杂,所以需要投影操作将视锥变成裁剪空间,再通过齐次除法,将裁剪空间变成CVV(Canonical View Volume,规则观察体),OpenGL中CVV就是一个 [−1,1]3[-1,1]^3[−1,1]3的正方体(下面讨论这种),DirectX中的 z 分量稍微不同是 [0,1],此时的坐标就是 NDC(Normalized Device Coordinates,归一化设备坐标)
下面将分别介绍两种投影类型是如何变换得到CVV的
1.正交投影(orthographic)
如上图,正交投影的“视锥”是一个长方体,可以通过六个参数定义 right,left,top,bottom,near,far分别对应了x,y,z轴上的范围,从而构成了一个长方体。
而我们要是想令一个[l,r]×[b,t]×[f,n][l,r]\times[b,t]\times[f,n][l,r]×[b,t]×[f,n]的长方体变换到一个[−1,1]3[-1,1]^3[−1,1]3的标准正方体只需要进行下面步骤:
先把长方体平移到原点,再将其缩放拉伸。
所以可以得到以下变换矩阵:
2.透视投影(Perspective)
透视投影就是最类似人眼所看东西的方式,遵循近大远小,如果说正交投影都是水平线不会相交,那么透视投影则显然不是了。
透视投影的视锥如下图所示
想要将透视投影的裁剪空间变成CVV,可以先把裁剪空间压缩得像正交投影一样,再进行一次正交投影变换就可以了。所以我们需要一个矩阵将透视投影变换成正交投影即Mpersp−>orthoM_{persp->ortho}Mpersp−>ortho
推导:
对空间中任何一点(x,y,z)(x,y,z)(x,y,z) 这一点的yyy坐标经过变化应得到 y′y^{'}y′,根据相似三角形可以得出以下结论
同理可得xxx坐标经过变化应得到 x′x^{'}x′
那么利用齐次坐标的性质((x,y,z,w)(x,y,z,w)(x,y,z,w)与(kx,ky,kz,kw)k≠0(kx,ky,kz,kw)k\neq0(kx,ky,kz,kw)k=0为同一个点),希望找到一个矩阵完成如下变换:
即:
首先,这个矩阵的前两行和最后一行是能很快确定出来的,根据最后的齐次坐标,如下:
那么如何确定第三行呢,这里就要运用透视投影的两个性质:
所有的近裁剪平面上的点(z=n)不会被压缩
所有远裁剪平面上点的z值(即f)不会发生变化
代入第一个性质则得到
我们发现n其实和x,y的值并没有关系,所以我们可以确定变换矩阵第三行的应类似于(0,0,A,B)(0,0,A,B)(0,0,A,B)代入可以得出
An+B=n2An+B=n^2An+B=n2
代入第二个性质,为了方便计算,代入far平面的中心点即x=y=0,可得到:
Af+B=f2Af+B=f^2Af+B=f2
容易解出 A=n+f;B=−nfA = n + f ;B = -nfA=n+f;B=−nf。
结论
Mpersp−>ortho=(n0000n0000n+f−nf0010)M_{persp->ortho} = \left(\begin{matrix}n&0&0&0\\0&n&0&0\\0&0&n+f&-nf\\0&0&1&0\end{matrix}\right)Mpersp−>ortho=⎝⎜⎜⎛n0000n0000n+f100−nf0⎠⎟⎟⎞
Mpersp=MorthoMpersp−>orthoM_{persp}=M_{ortho}M_{persp->ortho}Mpersp=MorthoMpersp−>ortho
五、视口变换
这一步就要获取图元在屏幕上对应的像素坐标了,就很简单了,一开始也介绍过就是两个范围空间的转换 [−1,1]2→[0,width]∗[0,height][-1,1]^2 \rightarrow [0,width]*[0,height][−1,1]2→[0,width]∗[0,height],z 坐标只用来判断深度大小,关注xy就行。
六、总结
至此历经上述4个变换,我们就已经成功的把游戏世界的任意可视物体转换到屏幕上了!
M=MviewportMprojectionMviewMmodelM = M_{viewport}M_{projection}M_{view}M_{model}M=MviewportMprojectionMviewMmodel
参考
MVP变换详解
GAMES101-现代计算机图形学入门-闫令琪
另一位大大的笔记
计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)相关推荐
- OpenGL南邮计算机图形学实验报告二——两个纹理的渐变变换和移动
OpenGL南邮计算机图形学实验报告二--两个纹理的渐变变换和移动 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SOIL2 ...
- 计算机图形学二维图形基本变换实验原理,江苏大学-计算机图形学第三次实验报告-二维图形变换...
<江苏大学-计算机图形学第三次实验报告-二维图形变换>由会员分享,可在线阅读,更多相关<江苏大学-计算机图形学第三次实验报告-二维图形变换(13页珍藏版)>请在人人文库网上搜索 ...
- 计算机图形学笔记(一)渲染管线概述
计算机图形学笔记(一)渲染管线概述 写在前面:因为之前有学习过图形学,博文是对过去知识的拾遗和对学习过程中的总结记录,所以在内容组织上可能不符合逻辑,某些比较熟悉的内容不会体现或简述:在整理资料的时候 ...
- 计算机图形学笔记 (第一周)
1.计算机图形学:研究通过计算机将物体表示为图形并显示的一门学科. 表示: 将物体表示为图形:造型/建模 显示:将表示后的图形显示出来: 渲染/绘制 2.文字/文本:图形/图像: 图形本质也是一种语 ...
- 计算机图形学笔记——第7章 二维几何变换 Python
第7章 二维几何变换 应用于对象几何描述并改变它的位置.方向或大小的操作称为几何变换(geometric transformation). 几何变换有时也称为建模变换(modeling transfo ...
- 计算机图形学笔记1.变换
文章目录 向量 Vectors 矩阵 变换 向量 Vectors Dot product Cross product Orthonormal bases and coordinate frames D ...
- 计算机模拟数学实验动画,计算机图形学实验-简单动画的实现、三维图形变换.docx...
安徽大学计算机实验教学中心PAGE 安徽大学计算机实验教学中心 PAGE 1 学号 专业 姓名 实验日期2018.12.11 教师签字 成绩 实验报告 [实验名称]简单动画的实现.三维图形变换 [实验 ...
- 交互式计算机图形学总结:第三章 几何对象和变换
第三章 几何对象和变换 基本概念 –零向量:长度为零,方向没有定义 –向量空间:包含向量和标量 –仿射空间:包含向量.标量.点 –计算机科学的观点:把向量.标量.点看作抽象数据类型(ADT) –凸性: ...
- 计算机图形学(四)几何变换_4_二维复合变换_4_二维刚体变换
二维复合变换_4_二维刚体变换 如果一个变换矩阵仅包含平移和旋转参数 ,则它是一个刚体变换矩阵 (rigid-body transforma-tion matrix) .二维刚体变换矩阵的一般形式为 ...
最新文章
- linux 安装php 5.5_Linux下yum升级安装PHP 5.5
- c语言进位程序,c语言中如何做带进位位移
- 7天搞定图神经网络,实战助力新冠疫情防控!
- Unshielded Twisted Pair - CAT5, 5e 6
- 太难了!产品经理想拿高薪
- ABAP SOAMANAGER暴露的函数function module,以web service方式执行的运行时细节
- 这是小学数学的26个知识点,小孩hold不住,父母也易犯错
- Java—抽象类和接口的区别
- LG-Transformer:全局和局部建模Transformer结构新作
- 【Scala】使用Scala语言定义函数和函数使用(比较两个数的大小代码)
- prim算法适用条件_内部排序算法的比较及应用
- Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法
- Flutter之跨组件共享状态Provider原理剖析
- JavaScript学习指南教程分享
- 今晚直播丨易鲸捷HTAP融合型分布式数据库问题诊断介绍
- odoo16 Windows绿色版 下载就能尝试了
- android视图编辑器,任何未出现在android studio编辑器中的视图
- 关于NI美国国家仪器音频分析器使用技巧(4461音频分析仪)
- 自适应机器人:定义工业机械臂的未来
- CTF题记——取证小集合
热门文章
- k8s网络基础学习-Calico网络插件
- 自己制作“EleksTubeIPS创意复古RGB拟辉光管时钟”分享《二》---(持续更新2021-12-22)
- Win8实体软件包与中国无缘
- 好家伙!Java程序员开发了一套系统,卖了800万,成都买了6套房!属实是走上人生巅峰了!
- 达梦数据库DEM服务器配置
- 你所编辑的图文消息可能含有敏感内容的解决办法
- js烟雾粒子动态网页js特效
- 定档9.11|腾讯全球数字生态大会 · CSS峰会,邀您共启安全新思维
- Intel HD-Audio driver 解析
- MySQL面试题(总结最全面的面试题)