图形学笔记(四)变换——三维变换(三维旋转与欧拉角)、MVP变换、视图变换、投影变换(正交投影与透视投影)
图形学笔记(三)变换——缩放、镜像、切变
图形学笔记(五)光栅化——屏幕、像素、屏幕空间、视口变换、基础图元与三角形、采样、包围盒、锯齿或走样
文章目录
- 1 三维空间中的变换
- 1.1 三维空间中的齐次坐标
- 1.2 三维空间中的变换
- 1.2 三维旋转
- 1.2.1 绕固定轴旋转
- 1.2.2 表示任意的3D旋转与欧拉角
- 2 MVP变换
- 2.1 定义
- 2.2 理解
- 3 View / Camera Transformation 视图变换
- 3.1 确定相机摆放的三个因素
- 3.2 进行视图变换的方法
- 3.2.1 方便的表示相机
- 3.2.2 移动相机的过程:
- 4 Projection transformation 投影变换
- 4.1 正交投影和透视投影
- 4.2 正交投影 Orthographic Projection
- 4.2.1 正交投影的简单的理解方式
- 4.2.2 普遍的理解方式
- 4.2.3 正交投影的变换矩阵
- 4.3 透视投影
- 4.3.1 如何做透视投影
- 4.3.2 M p e r s p − > o r t h o M_{persp->ortho} Mpersp−>ortho的推导
- 4.3.3 透视投影的变换矩阵 M p e r s p M_{persp} Mpersp
- 5 视锥
- 5.1定义视锥的方法
- 5.2 根据垂直可视角度和长宽比确定l,r,b,t(左,右,上,下)
1 三维空间中的变换
1.1 三维空间中的齐次坐标
与二维空间相似,有以下结论:
(x,y,z,w)在三维空间中表示的点:
1.2 三维空间中的变换
三维空间中齐次坐标的仿射变换矩阵(4*4):
注意以上矩阵表示先线性变换,再平移。
三维空间中的缩放和平移:
1.2 三维旋转
1.2.1 绕固定轴旋转
在三维空间中,描述任意的旋转是不容易的。
所以我们以绕x轴旋转为例,观察上图,我们发现旋转过程中:
- x是不变的,所以可以得到变换矩阵的第一个行向量(1,0,0,0)。
- 然后对y和z进行 α \alpha α的旋转得到第二个行向量 ( 0 , cos α , − sin α , 0 ) (0,\cos\alpha,-\sin\alpha,0) (0,cosα,−sinα,0)和第三个行向量 ( 0 , sin α , cos α , 0 ) (0,\sin\alpha,\cos\alpha,0) (0,sinα,cosα,0)。
最后的旋转矩阵 R x ( α ) R_x(\alpha) Rx(α)如下所示(同时也给出了 R y ( α ) R_y(\alpha) Ry(α)、 R z ( α ) R_z(\alpha) Rz(α)):
上图中也可以看到,绕z轴旋转的推导过程和结果与x大致相同。
但是对于绕y轴旋转,由于 x × z = − y x\times z=-y x×z=−y,所以要将 − α -\alpha −α代入旋转矩阵的对应位置才会得到结果。所以绕y轴旋转的 R y ( α ) R_y(\alpha) Ry(α)的四个三角函数是反的。
1.2.2 表示任意的3D旋转与欧拉角
任意一个3D的旋转都可以表示成绕x轴、y轴、z轴旋转的组合,如下所示。
其中, α β γ \alpha \beta \gamma αβγ分别代表物体绕x、y、z旋转的角度,它们也被称为欧拉角。
把任意的旋转表示成矩阵:
Rodtigues旋转公式
2 MVP变换
2.1 定义
MVP变换是模型变换(M)、视图变换(V)、投影变换(P)的统称。MVP变换操作的是三维空间中的点,经过MVP变换后会被映射到标准二维平面上(实际上这个标准二维平面仍保留了z轴坐标)。
2.2 理解
想象一下拍照片的过程,拍照就是一个把三维转化为二维的操作:
(1) 找到一个风景优美的地方把人安排好。(这一步在图形学中叫做model transformmation 模型变换,相当于把模型和场景搭建好。
(2)确定相机的摆放,选好角度和位置来放相机(相当于view transformmation,视图变换)。
(3)拍照。(projection transformation 投影变换,把三维空间投影到二维图片。)
总结:
视图变换,是指变换照相机的位置,角度。
模型变换,是指变换被照物体的位置,角度。
投影变换,是指把三维空间投影到二维图片。
3 View / Camera Transformation 视图变换
视图变换,是指变换照相机的位置,角度。
3.1 确定相机摆放的三个因素
确定相机的摆放要确定以下三个因素:
- Position e ⃗ \vec e e —— 放在哪?
- Look-at / gace direction g ^ \hat g g^ —— 看谁?往哪看?
- Up direction t ^ \hat t t^ 相机的向上方向 —— 从哪个角度拍摄?
3.2 进行视图变换的方法
3.2.1 方便的表示相机
首先思考下面的问题:
首先如果一个相机和它拍摄的物品一起同样运动,那得到的投影会是相同的,如下所示。
所以有没有一个方便的方法来表示相机呢?
一个约定俗成的规矩就是我们把所有相机的:
(1)位置都固定在原点
(2)向上的方向都固定为Y轴正向
(3)看向的方向都是 -Z方向
(4)然后再让其他物体都与相机一起挪过来就好了。
3.2.2 移动相机的过程:
(1)把 e ⃗ \vec e e 移向原点
(2)把 g ^ \hat g g^的方向旋转到-Z
(3)把 t ^ \hat t t^的方向旋转到Y
(4)把 ( g ^ × t ^ ) (\hat g \times \hat t) (g^×t^)旋转到X
我们把以上的过程写成矩阵形式:
M v i e w = R v i e w T v i e w M_{view} = R_{view}T_{view} Mview=RviewTview
(1)首先求把
e ⃗ \vec e e 移向原点的
变换矩阵,如下所示,只是一个简单的平移变换矩阵:
(2)然后求把
g ^ \hat g g^的方向旋转到-Z,把
t ^ \hat t t^的方向旋转到Y, 把
( g ^ × t ^ ) (\hat g \times \hat t) (g^×t^)旋转到X
的变换矩阵。
首先这个矩阵是个旋转矩阵,但是把以上三个方向旋转到坐标轴的旋转矩阵是非常难求的。
那么不妨动用一下逆向思维,求这个旋转矩阵的逆矩阵,即把X旋转到 g × t g \times t g×t,Y旋转到t,Z旋转到-g,这个矩阵相对简单,如下所示。
R v i e w − 1 = ( x g ^ × t ^ x t x − g 0 y g ^ × t ^ y t y − g 0 z g ^ × t ^ z t z − g 0 0 0 0 1 ) R_{view}^{-1}=\begin{pmatrix} 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{pmatrix} Rview−1=⎝⎜⎜⎛xg^×t^yg^×t^zg^×t^0xtytzt0x−gy−gz−g00001⎠⎟⎟⎞
不理解的话可以用代表轴的列向量来验证一下,比如使用表示X轴列向量 ( 1 , 0 , 0 , 0 ) T (1,0,0,0)^T (1,0,0,0)T来进行以下运算:
( x g ^ × t ^ x t x − g 0 y g ^ × t ^ y t y − g 0 z g ^ × t ^ z t z − g 0 0 0 0 1 ) × ( 1 0 0 0 ) = ( x g ^ × t ^ y g ^ × t ^ z g ^ × t ^ 0 ) \begin{pmatrix} 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{pmatrix} \times \begin{pmatrix} 1\\ 0\\ 0\\ 0\\ \end{pmatrix}=\begin{pmatrix} x_{\hat g \times \hat t}\\ y_{\hat g \times \hat t}\\ z_{\hat g \times \hat t}\\ 0\\ \end{pmatrix} ⎝⎜⎜⎛xg^×t^yg^×t^zg^×t^0xtytzt0x−gy−gz−g00001⎠⎟⎟⎞×⎝⎜⎜⎛1000⎠⎟⎟⎞=⎝⎜⎜⎛xg^×t^yg^×t^zg^×t^0⎠⎟⎟⎞
Y轴和Z轴同理,都可以通过以上矩阵完成旋转。
然后,由于旋转矩阵是正交矩阵,矩阵的逆等于矩阵的转置,所以我们把它转置回来,就可以得到我们要的旋转矩阵:
R v i e w = ( x g ^ × t ^ y g ^ × t ^ z g ^ × t ^ 0 x t y t z t 0 x − g y − g z − g 0 0 0 0 1 ) R_{view}=\begin{pmatrix} 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{pmatrix} Rview=⎝⎜⎜⎛xg^×t^xtx−g0yg^×t^yty−g0zg^×t^ztz−g00001⎠⎟⎟⎞
4 Projection transformation 投影变换
投影是将3D转化为2D的变换。
4.1 正交投影和透视投影
投影变换包含两种:
- Orthographic projection 正交投影(没有近大远小)
- Perspective projection 透视投影(近大远小)
4.2 正交投影 Orthographic Projection
4.2.1 正交投影的简单的理解方式
- 相机处在原点,看向-Z,向上朝向Y
- 去掉空间中物体的Z坐标,得到一个矩形
- 把矩形的尺寸缩放到 [ − 1 , 1 ] 2 [-1,1]^2 [−1,1]2
4.2.2 普遍的理解方式
一、定义空间中的立方体,把立方体([l,r] × [ b , t ] × [ f , n ] \times[b,t]\times[f,n] ×[b,t]×[f,n])映射到正则(canonical)立方体 [ − 1 , 1 ] 3 [-1,1]^3 [−1,1]3 上。
具体做法:
- 把中心移到原点
- 把x、y、z的值拉伸成[-1,1]
4.2.3 正交投影的变换矩阵
M o r t h o = ( 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ) ( 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ) M_{ortho}=\begin{pmatrix} \frac2{r-l}&0&0&0\\ 0&\frac2{t-b}&0&0\\ 0&0&\frac2{n-f}&0\\ 0&0&0&1\\ \end{pmatrix} \begin{pmatrix} 1&0&0&-\frac{r+l}2\\ 0&1&0&-\frac{t+b}2\\ 0&0&1&-\frac{n+f}2\\ 0&0&0&1\\ \end{pmatrix} Mortho=⎝⎜⎜⎛r−l20000t−b20000n−f200001⎠⎟⎟⎞⎝⎜⎜⎛100001000010−2r+l−2t+b−2n+f1⎠⎟⎟⎞
矩阵解读:(从右向左看)首先把中心点移到原点,然后缩放。
注意:n>f,近大于远。
4.3 透视投影
- 在图形学,艺术,虚拟系统中很常用。
- 近大远小。
- 投影后会使得平行的线不再平行。
在齐次坐标中,(1,0,0,1)和(2,0,0,2)表示的是同一个点。
4.3.1 如何做透视投影
- 首先把截头体(frustum)挤成立方体(cuboid)。(假设变换矩阵为: M p e r s p − > o r t h o M_{persp->ortho} Mpersp−>ortho)
- 做正交投影(变换矩阵为: M o r t h o M_{ortho} Mortho)。
4.3.2 M p e r s p − > o r t h o M_{persp->ortho} Mpersp−>ortho的推导
首先要寻找 ( x ′ , y ′ , z ′ ) (x^{'},y^{'},z^{'}) (x′,y′,z′)和 ( x , y , z ) (x,y,z) (x,y,z)的关系,先从侧面看,根据相似三角形得到以下关系。
同理,可得到x,y和x如下所示。
在齐次坐标系下,我们可以发现向量 ( x , y , z ) T (x,y,z)^T (x,y,z)T发生了以下变化(z仍然未知),然后稍微转化一下形式,让列向量乘以n。
上面的式子说明,
所以,我们能够算出 M p e r s p − > o r t h o M_{persp->ortho} Mpersp−>ortho的一部分参数,如下所示。
然后,现在第三行还没有得出,我们观察一下与第三行相关的z,得到两个特点。
- 任何在近(n)面上的点没有变化。
所以我们得到以下式子,(把z=n带进去,然后列向量乘以n)
可以看到结果列向量的第三行是 n 2 n^2 n2,所以第三行必须是(0,0,A,B)的形式。然后可以得到:
- 任何远(f)平面上点的z没有变化。
这次我们选取原平面上的中心点(0,0,f,1)做为特殊点,得到:
最后解方程得到:
所以得到 M p e r s p − > o r t h o M_{persp->ortho} Mpersp−>ortho:
M p e r s p − > o r t h o = ( n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ) M_{persp->ortho}=\begin{pmatrix} n&0&0&0\\ 0&n&0&0\\ 0&0&n+f&-nf\\ 0&0&1&0\\ \end{pmatrix} Mpersp−>ortho=⎝⎜⎜⎛n0000n0000n+f100−nf0⎠⎟⎟⎞
4.3.3 透视投影的变换矩阵 M p e r s p M_{persp} Mpersp
M p e r s p = M o r t h o M p e r s p − > o r t h o M_{persp}=M_{ortho}M_{persp->ortho} \\ Mpersp=MorthoMpersp−>ortho
M p e r s p − > o r t h o = ( n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ) M_{persp->ortho}=\begin{pmatrix} n&0&0&0\\ 0&n&0&0\\ 0&0&n+f&-nf\\ 0&0&1&0\\ \end{pmatrix} Mpersp−>ortho=⎝⎜⎜⎛n0000n0000n+f100−nf0⎠⎟⎟⎞
M o r t h o = ( 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ) ( 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ) M_{ortho}=\begin{pmatrix} \frac2{r-l}&0&0&0\\ 0&\frac2{t-b}&0&0\\ 0&0&\frac2{n-f}&0\\ 0&0&0&1\\ \end{pmatrix} \begin{pmatrix} 1&0&0&-\frac{r+l}2\\ 0&1&0&-\frac{t+b}2\\ 0&0&1&-\frac{n+f}2\\ 0&0&0&1\\ \end{pmatrix} Mortho=⎝⎜⎜⎛r−l20000t−b20000n−f200001⎠⎟⎟⎞⎝⎜⎜⎛100001000010−2r+l−2t+b−2n+f1⎠⎟⎟⎞
5 视锥
5.1定义视锥的方法
从相机出发,看到一个近平面,并定义这个近平面的:
- 长宽比(Aspect ratio)=宽度/高度(16:9)
- 垂直可视角度(forV)(Field of View):看到角度的范围。
所谓广角就是可视角度比较大。
5.2 根据垂直可视角度和长宽比确定l,r,b,t(左,右,上,下)
其中n是相机到近平面的距离。
图形学笔记(四)变换——三维变换(三维旋转与欧拉角)、MVP变换、视图变换、投影变换(正交投影与透视投影)相关推荐
- 【计算机图形学】小白谈计算机图形学(四)二维三维图形变换—1
小白谈计算机图形学(四)二维三维图形变换-1 窗口与视图 二维图形的几何变换 平移变换 比例变换 旋转变换 二维图形变换的矩阵表示 三种变换 齐次坐标变换 原二维线性变换 齐次坐标法 复合变换 例题: ...
- 图形学笔记(四) 数学变换
数学变换 点和坐标 什么是点? 注意区分图形学中的点与图论中的点:图论中的点重视点与点的拓扑结构,而不关心点的坐标,而图形学中的点没有严格限制拓扑结构,且及其关注点的坐标. 在几何学中,点是最简单的形 ...
- 计算机图形学 学习笔记(八):三维图形变换:三维几何变换,投影变换(平行/ 透视 投影)
接上文 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等 通过三维图形变换,可由简单图形得到复杂图形,三维图形变化则分为三维几何变换和投影变换. 6.1 三维图形几何变换 三维 ...
- 计算机图形学(三维观察投影线、视图变换、投影变换)
一.三维观察流水线 概念:将建立的三维场景显示在二维视口的过程称为三维观察流水线. 在三维观察流水线中,也就是在将三维场景显示在二维视口的过程中,需要在不同坐标系下进行不同的操作,这些坐标系包括: 建 ...
- 【Visual C++】游戏开发笔记四十三 浅墨DirectX教程十一 为三维世界添彩:纹理映射技术(二)...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨) 邮箱: happylifemxy@163.com 本篇文章里,我们首先对Direct3D之中固定功能流水线中的 ...
- 计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)
计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 目录 计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 一.简介 1.模型变换(Model transform ...
- 图形学笔记(五)光栅化——屏幕、像素、屏幕空间、视口变换、基础图元与三角形、采样、包围盒、锯齿或走样
图形学笔记(四)变换--三维变换(三维旋转与欧拉角).MVP变换.视图变换.投影变换(正交投影与透视投影) 图形学笔记(六)光栅化2 -- Artifacts.时域与频域.滤波.卷积定理.超采样.MS ...
- 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨) 邮箱: happylifemxy@163.com 本篇文章里,我们对Direct3D之中固定功能流水线中的3D ...
- 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界 光照与材质专场
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
最新文章
- Rose VS PowerDesigner
- ASP.NET MVC笔记
- 传输层 :TCP/UDP 协议(用于封装接口)
- SAP Cloud for Customer的Calculated field字段
- 在Graphite中存储Hystrix的几个月历史指标
- 怎么把c语言改成汇编语言,如何把汇编语言转换成C语言
- 随想录(windows上cuda环境安装)
- csdn肿么了,这两天写的博文都是待审核
- PLC通讯智能网关-不用PLC编程,实现西门子PLC与罗克韦尔(AB)PLC之间数据通讯
- 高斯克吕格投影中有关带号与经度的关系
- co作为前缀的意思_co前缀是什么意思
- cad多段线画圆弧方向_cad怎么把多段线变成弧线
- HCIA网络基础9-VRP文件系统管理
- 插入数据报错: Incorrect string value: ‘\xE8\xB5\xB5\xE9\x9B\xB7‘ for column ‘Sname‘ at row 1
- 第5 部分 EIGRP
- Html和Xml中注释符
- 由置灰引出的css滤镜filter是什么东西?
- IDEA快捷键、格式和代码规范插件
- 怎样的数据报表才能将公司全部业务数据整合在一起
- 中国高校“AI教师正规军”是如何养成的?