图形学笔记(三)变换——缩放、镜像、切变
图形学笔记(五)光栅化——屏幕、像素、屏幕空间、视口变换、基础图元与三角形、采样、包围盒、锯齿或走样

文章目录

  • 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轴旋转为例,观察上图,我们发现旋转过程中:

  1. x是不变的,所以可以得到变换矩阵的第一个行向量(1,0,0,0)。
  2. 然后对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​=Rview​Tview​
(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^​0​xt​yt​zt​0​x−g​y−g​z−g​0​0001​⎠⎟⎟⎞​

不理解的话可以用代表轴的列向量来验证一下,比如使用表示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^​0​xt​yt​zt​0​x−g​y−g​z−g​0​0001​⎠⎟⎟⎞​×⎝⎜⎜⎛​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^​xt​x−g​0​yg^​×t^​yt​y−g​0​zg^​×t^​zt​z−g​0​0001​⎠⎟⎟⎞​

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 上。

具体做法:

  1. 把中心移到原点
  2. 把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−l2​000​0t−b2​00​00n−f2​0​0001​⎠⎟⎟⎞​⎝⎜⎜⎛​1000​0100​0010​−2r+l​−2t+b​−2n+f​1​⎠⎟⎟⎞​
矩阵解读:(从右向左看)首先把中心点移到原点,然后缩放。

注意: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​=⎝⎜⎜⎛​n000​0n00​00n+f1​00−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​=Mortho​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​=⎝⎜⎜⎛​n000​0n00​00n+f1​00−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−l2​000​0t−b2​00​00n−f2​0​0001​⎠⎟⎟⎞​⎝⎜⎜⎛​1000​0100​0010​−2r+l​−2t+b​−2n+f​1​⎠⎟⎟⎞​

5 视锥

5.1定义视锥的方法

从相机出发,看到一个近平面,并定义这个近平面的:

  1. 长宽比(Aspect ratio)=宽度/高度(16:9)
  2. 垂直可视角度(forV)(Field of View):看到角度的范围。

所谓广角就是可视角度比较大。

5.2 根据垂直可视角度和长宽比确定l,r,b,t(左,右,上,下)

其中n是相机到近平面的距离。

图形学笔记(四)变换——三维变换(三维旋转与欧拉角)、MVP变换、视图变换、投影变换(正交投影与透视投影)相关推荐

  1. 【计算机图形学】小白谈计算机图形学(四)二维三维图形变换—1

    小白谈计算机图形学(四)二维三维图形变换-1 窗口与视图 二维图形的几何变换 平移变换 比例变换 旋转变换 二维图形变换的矩阵表示 三种变换 齐次坐标变换 原二维线性变换 齐次坐标法 复合变换 例题: ...

  2. 图形学笔记(四) 数学变换

    数学变换 点和坐标 什么是点? 注意区分图形学中的点与图论中的点:图论中的点重视点与点的拓扑结构,而不关心点的坐标,而图形学中的点没有严格限制拓扑结构,且及其关注点的坐标. 在几何学中,点是最简单的形 ...

  3. 计算机图形学 学习笔记(八):三维图形变换:三维几何变换,投影变换(平行/ 透视 投影)

    接上文 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等 通过三维图形变换,可由简单图形得到复杂图形,三维图形变化则分为三维几何变换和投影变换. 6.1 三维图形几何变换 三维 ...

  4. 计算机图形学(三维观察投影线、视图变换、投影变换)

    一.三维观察流水线 概念:将建立的三维场景显示在二维视口的过程称为三维观察流水线. 在三维观察流水线中,也就是在将三维场景显示在二维视口的过程中,需要在不同坐标系下进行不同的操作,这些坐标系包括: 建 ...

  5. 【Visual C++】游戏开发笔记四十三 浅墨DirectX教程十一 为三维世界添彩:纹理映射技术(二)...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨)    邮箱: happylifemxy@163.com 本篇文章里,我们首先对Direct3D之中固定功能流水线中的 ...

  6. 计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)

    计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 目录 计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 一.简介 1.模型变换(Model transform ...

  7. 图形学笔记(五)光栅化——屏幕、像素、屏幕空间、视口变换、基础图元与三角形、采样、包围盒、锯齿或走样

    图形学笔记(四)变换--三维变换(三维旋转与欧拉角).MVP变换.视图变换.投影变换(正交投影与透视投影) 图形学笔记(六)光栅化2 -- Artifacts.时域与频域.滤波.卷积定理.超采样.MS ...

  8. 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨)    邮箱: happylifemxy@163.com 本篇文章里,我们对Direct3D之中固定功能流水线中的3D ...

  9. 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界 光照与材质专场

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

最新文章

  1. Rose VS PowerDesigner
  2. ASP.NET MVC笔记
  3. 传输层 :TCP/UDP 协议(用于封装接口)
  4. SAP Cloud for Customer的Calculated field字段
  5. 在Graphite中存储Hystrix的几个月历史指标
  6. 怎么把c语言改成汇编语言,如何把汇编语言转换成C语言
  7. 随想录(windows上cuda环境安装)
  8. csdn肿么了,这两天写的博文都是待审核
  9. PLC通讯智能网关-不用PLC编程,实现西门子PLC与罗克韦尔(AB)PLC之间数据通讯
  10. 高斯克吕格投影中有关带号与经度的关系
  11. co作为前缀的意思_co前缀是什么意思
  12. cad多段线画圆弧方向_cad怎么把多段线变成弧线
  13. HCIA网络基础9-VRP文件系统管理
  14. 插入数据报错: Incorrect string value: ‘\xE8\xB5\xB5\xE9\x9B\xB7‘ for column ‘Sname‘ at row 1
  15. 第5 部分 EIGRP
  16. Html和Xml中注释符
  17. 由置灰引出的css滤镜filter是什么东西?
  18. IDEA快捷键、格式和代码规范插件
  19. 怎样的数据报表才能将公司全部业务数据整合在一起
  20. 中国高校“AI教师正规军”是如何养成的?

热门文章

  1. mysql lib安装包_mysql安装
  2. git切换分支冲突的解决
  3. 【openmv学习笔记:1】色块查找
  4. Rational Rose2007(v7.0)下载地址、安装及激活详解教程(图)
  5. 每次页面大小更改 实时获取屏幕宽度
  6. 【记我愤怒的一次】通过灌水进行注册北京进京证
  7. 将int数组转为List集合
  8. 微信小程序实时获取播放进度(秒)
  9. WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?
  10. 电脑组装配置单及组装电脑图文详细教程