一、MVP变换

MVP变换是模型变换(M)、视角变换(V)、投影变换(P)的统称。MVP变换操作的是三维空间中的点,经过MVP变换后会被映射到标准二维平面上(实际上这个标准二维平面仍保留了z轴坐标)。

1. 模型变换

模型变换在三维空间中对物体进行的操作,对三维物体本身进行缩放、旋转、平移操作

注意,模型变换是相对于三维坐标系(亦称世界坐标系)的原点进行的!

特别地,当需要绕物体中心旋转时,需要将物体中心移动到原点,然后进行相应操作,操作完成后再移动回去(用矩阵描述为:\(M = M_t^{-1} \cdot M_s \cdot M_r \cdot M_t\),然后与点进行操作,\(Point_N = M \cdot Point\))。

上述M矩阵的点乘顺序是随机的,同时也不是都需要的。同时大家可以思考一下调换项的位置会发生什么效果?

这里,只给出缩放、旋转、平移矩阵,不做解释说明(如果想知道详细过程,简单)

下面列举的公式与前面的没有必然联系

1.1 缩放矩阵

\[ M_s = \begin{pmatrix}
s_x & 0 & 0 & 0 \\
0 & s_y & 0 & 0 \\
0 & 0 & s_z & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix}
\]

1.2 旋转矩阵

参考文章:https://blog.csdn.net/csxiaoshui/article/details/65446125

\[ M_{rx} = \begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & cos\theta & -sin\theta & 0 \\
0 & sin\theta & cos\theta & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix}

M_{ry} = \begin{pmatrix}
cos\theta & 0 & sin\theta & 0 \\
0 & 1 & 0 & 0 \\
-sin\theta & 0 & cos\theta & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix}

M_{rz} = \begin{pmatrix}
cos\theta & -sin\theta & 0 & 0 \\
sin\theta & cos\theta & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix}
\]

1.3 平移矩阵

\[ M_t = \begin{pmatrix}
1 & 0 & 0 & t_x \\
0 & 1 & 0 & t_y \\
0 & 0 & 1 & t_z \\
0 & 0 & 0 & 1 \\
\end{pmatrix}
\]

使用时,只需要带入要变换的点(为方便分析,这里没有给出放缩矩阵和平移矩阵)

\[ \begin{pmatrix} x' \\ y' \\ z' \\ 1 \end{pmatrix} =
M_r \cdot \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} =
\begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & cos\theta & -sin\theta & 0 \\
0 & sin\theta & cos\theta & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix} \cdot
\begin{pmatrix}
cos\theta & 0 & sin\theta & 0 \\
0 & 1 & 0 & 0 \\
-sin\theta & 0 & cos\theta & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix} \cdot
\begin{pmatrix}
cos\theta & -sin\theta & 0 & 0 \\
sin\theta & cos\theta & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix} \cdot \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix}
\]

如果你需要绕物体中心进行相应的操作(为方便分析,这里没有给出放缩矩阵)

这里的平移矩阵需要计算物体中心的坐标,然后计算到三维空间坐标系原点的距离

同样,反平移矩阵计算过程类似

\[ \begin{pmatrix} x' \\ y' \\ z' \\ 1 \end{pmatrix} =
M_t^{-1} \cdot M_r \cdot M_t \cdot \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} =
\begin{pmatrix}
1 & 0 & 0 & -t_x \\
0 & 1 & 0 & -t_y \\
0 & 0 & 1 & -t_z \\
0 & 0 & 0 & 1 \\
\end{pmatrix} \cdot
\begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & cos\theta & -sin\theta & 0 \\
0 & sin\theta & cos\theta & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix} \cdot
\begin{pmatrix}
cos\theta & 0 & sin\theta & 0 \\
0 & 1 & 0 & 0 \\
-sin\theta & 0 & cos\theta & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix} \cdot
\begin{pmatrix}
cos\theta & -sin\theta & 0 & 0 \\
sin\theta & cos\theta & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix} \cdot
\begin{pmatrix}
1 & 0 & 0 & t_x \\
0 & 1 & 0 & t_y \\
0 & 0 & 1 & t_z \\
0 & 0 & 0 & 1 \\
\end{pmatrix} \cdot \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix}
\]

如果需要引入实际的平移矩阵,则变成

其中\(M_{tr}\)为平移矩阵,\(M_t\)是经物体中心移动到坐标原点自动添加的

\[ \begin{pmatrix} x' \\ y' \\ z' \\ 1 \end{pmatrix} =
M_{tr} \cdot M_t^{-1} \cdot M_r \cdot M_t \cdot \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix}
\]

最后,如果需要再加上放缩矩阵,这个就不给出了(只需要知道将放缩矩阵放在不同的位置会有的含义就可以了)

以下内容在单片机上基本上就不要奢求了,所以用到的很少,因此本文中不再多做介绍,甚至也不会给出公式。

如果由兴趣,欢迎一起探讨(liangzongnan0214@163.com)

2. 视角变换

将三维空间坐标系内的点映射到相机坐标系中

需要给出相机所处的三维空间的位置、相机观察点、相机向上方向(与相机位置和相机观察点构成的连线垂直)

然后根据右手法则来建立相机坐标系

在建系时,统一先归一化到单位向量,因为只需要方向信息

至于如何将三维空间坐标系映射到相机坐标系,这里给出一篇参考文章

参考文章:https://blog.csdn.net/silangquan/article/details/50987196

3. 投影变换

将相机坐标系映射到标准的二维平面上(注意,这里的z轴信息没有丢失,正因如此,才可以进行后续的着色、遮挡等工作)

只需要知道,投影变换包括正交投影和透视投影,透视投影的前期就是正交投影

参考文章:https://blog.csdn.net/a1353206432/article/details/106303036

二、Viewport变换

Viewport变换只做了一件事:将投影变换得到的标准二维平面调整到显示屏幕上

因此,Viewport变换本质是一个放缩+平移的过程

[计算机图形学]视图变换:MVP变换、视口变换的更多相关文章

  1. OpenGl学习笔记3之模型变换、视图变换、投影变换、视口变换介绍

    模型变换.视图变换.投影变换.视口变换介绍 opengl中存在四种变换,分别是模型变换,视图变换,投影变换,视口变换.这四种变换是图形渲染的基本操作,实质上这四种变换都是由矩阵乘法表示(这些操作都是由 ...

  2. 计算机图形学 - 图形变换(opengl版)

    作业题目: 图形变换:实现一个图形绕任意直线旋转的程序. 要求:把一个三维图形绕任意一条直线旋转,需要有初始图形,和旋转后的图形,最好也可以实时控制旋转. 最少要做出绕z轴旋转. 原理:http:// ...

  3. OpenGL的视图变换、模型变换、投影变换、视口变换

    产生目标场景的过程类似于用照相机进行拍照: (1) 把照相机固定在三角架上,并让他对准场景从不同位置观察场景(视图变换) gluLookAt (2) 对场景进行安排,使各个物体在照片中的位置是我们所希 ...

  4. OpenGL模型视图变换、投影变换、视口变换的理解

    OpenGL中不设置模型,投影,视口,所绘制的几何图形的坐标只能是-1到1(X轴向右,Y轴向上,Z轴垂直屏幕向外). 产生目标场景的过程类似于用照相机进行拍照: (1)把照相机固定在三角架上,并让他对 ...

  5. SharpGL学习笔记(五) 视口变换

    视口变换主是将视景体内投影的物体显示到二维的视口平面上. 在计算机图形学中,它的定义是将经过几何变换, 投影变换和裁剪变换后的物体显示于屏幕指定区域内. 前面我们讨论过的透视投影, 正射投影, 它们都 ...

  6. matplotlib BlendedGenericTransform(混合变换)和CompositeGenericTransform(复合变换)

    2020-04-10 23:31:13 -- Edit by yangrayBlendedGenericTransform是Transform的子类,支持在x / y方向上使用不同的变换.(博主翻译为 ...

  7. 幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同

    幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同

  8. 计算机图形学 opengl版本 第三版------胡事民 第三章更多的绘图工具

    opengl  计算机图形学 第三版   第二部分   第三章更多的绘图工具 3.1   概述 第2章中  我们绘图使用的是屏幕窗口的基础坐标系    以像素为单位 屏幕坐标从左下角x从0延伸到scr ...

  9. [计算机图形学]绘制填充模型:重心坐标、z-buffer

    目录 一.点乘和叉乘 0. 向量表示 1. 点乘 2.叉乘 2.1 坐标运算方式 2.2 向量运算方式 2.3 叉乘的用途 二.Bounding Box 三.重心坐标 四.z-buffer 五.总结 ...

随机推荐

  1. GCD之队列的实现和使用

    一.什么是GCD? 以下是摘自苹果的官方说明. Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想 ...

  2. Python单元测试框架pytest常用测试报告类型

    先前博客有介绍pytest测试框架的安装及使用,现在来聊聊pytest可以生成哪些测试报告 1.allure测试报告 关于allure报告参见先前的一篇博文:https://www.cnblogs.c ...

  3. Codeforces Round #646 (Div. 2) E. Tree Shuffling(树上dp)

    题目链接:https://codeforces.com/contest/1363/problem/E 题意 有一棵 $n$ 个结点,根为结点 $1$ 的树,每个结点有一个选取代价 $a_i$,当前 $ ...

  4. P1020 导弹拦截(LIS)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  5. JavaScript——四

    引用案例:事件只能执行一次 array里面都是事件对象 点击box3区域时,则会有事件冒泡现象,即:box3响应后,box2(比他大一节)的区域,box1(比box2大一级)相应出现响应事件现象 捕获 ...

  6. HTTP的传输编码(Transfer-Encoding:chunked) / net::ERR_INVALID_CHUNKED_ENCODING

    https://blog.csdn.net/m0_37668842/article/details/89138733 https://www.cnblogs.com/jamesvoid/p/11297 ...

  7. ElasticSearch 集群 & 数据备份 & 优化

    ElasticSearch 集群相关概念 ES 集群颜色状态 ①. - 红色:数据都不完整 ②. - 黄色:数据完整,但是副本有问题 ③. - 绿色:数据和副本全都没有问题 ES 集群节点类型 ①. ...

  8. Redis 多实例 & 主从复制

    Redis 多实例 多实例目录 [root@db01 ~]# mkdir /service/redis/{6380,6381} 多实例配置文件 # 第一台多实例配置 [root@db01 ~]# vi ...

  9. 鸟哥的linux私房菜——第十三章学习(Linux 帐号管理与 ACLL 权限设置)

    第十三章.Linux 帐号管理与 ACLL 权限设置 1.0).使用者识别码: UID 与 GID UID :User ID GID :group ID [root@study ~]# ll -d / ...

  10. tensorflow报错:Attempting to fetch value instead of handling error Internal: failed to get device attribute 13 for device 0: CUDA_ERROR_UNKNOWN:

    就是在spyder跑上一篇文章的代码然后就报错: Attempting to fetch value instead of handling error Internal: failed to get ...