[计算机图形学]视图变换:MVP变换、视口变换
一、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 缩放矩阵
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
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 平移矩阵
1 & 0 & 0 & t_x \\
0 & 1 & 0 & t_y \\
0 & 0 & 1 & t_z \\
0 & 0 & 0 & 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}
\]
如果你需要绕物体中心进行相应的操作(为方便分析,这里没有给出放缩矩阵)
这里的平移矩阵需要计算物体中心的坐标,然后计算到三维空间坐标系原点的距离
同样,反平移矩阵计算过程类似
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\)是经物体中心移动到坐标原点自动添加的
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变换、视口变换的更多相关文章
- OpenGl学习笔记3之模型变换、视图变换、投影变换、视口变换介绍
模型变换.视图变换.投影变换.视口变换介绍 opengl中存在四种变换,分别是模型变换,视图变换,投影变换,视口变换.这四种变换是图形渲染的基本操作,实质上这四种变换都是由矩阵乘法表示(这些操作都是由 ...
- 计算机图形学 - 图形变换(opengl版)
作业题目: 图形变换:实现一个图形绕任意直线旋转的程序. 要求:把一个三维图形绕任意一条直线旋转,需要有初始图形,和旋转后的图形,最好也可以实时控制旋转. 最少要做出绕z轴旋转. 原理:http:// ...
- OpenGL的视图变换、模型变换、投影变换、视口变换
产生目标场景的过程类似于用照相机进行拍照: (1) 把照相机固定在三角架上,并让他对准场景从不同位置观察场景(视图变换) gluLookAt (2) 对场景进行安排,使各个物体在照片中的位置是我们所希 ...
- OpenGL模型视图变换、投影变换、视口变换的理解
OpenGL中不设置模型,投影,视口,所绘制的几何图形的坐标只能是-1到1(X轴向右,Y轴向上,Z轴垂直屏幕向外). 产生目标场景的过程类似于用照相机进行拍照: (1)把照相机固定在三角架上,并让他对 ...
- SharpGL学习笔记(五) 视口变换
视口变换主是将视景体内投影的物体显示到二维的视口平面上. 在计算机图形学中,它的定义是将经过几何变换, 投影变换和裁剪变换后的物体显示于屏幕指定区域内. 前面我们讨论过的透视投影, 正射投影, 它们都 ...
- matplotlib BlendedGenericTransform(混合变换)和CompositeGenericTransform(复合变换)
2020-04-10 23:31:13 -- Edit by yangrayBlendedGenericTransform是Transform的子类,支持在x / y方向上使用不同的变换.(博主翻译为 ...
- 幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同
幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同
- 计算机图形学 opengl版本 第三版------胡事民 第三章更多的绘图工具
opengl 计算机图形学 第三版 第二部分 第三章更多的绘图工具 3.1 概述 第2章中 我们绘图使用的是屏幕窗口的基础坐标系 以像素为单位 屏幕坐标从左下角x从0延伸到scr ...
- [计算机图形学]绘制填充模型:重心坐标、z-buffer
目录 一.点乘和叉乘 0. 向量表示 1. 点乘 2.叉乘 2.1 坐标运算方式 2.2 向量运算方式 2.3 叉乘的用途 二.Bounding Box 三.重心坐标 四.z-buffer 五.总结 ...
随机推荐
- ElasticSearch 入门简介
公号:码农充电站pro 主页:https://codeshellme.github.io ElasticSearch 是一款强大的.开源的.分布式的搜索与分析引擎,简称 ES,它提供了实时搜索与聚合分 ...
- 自己动手实现java断点/单步调试(二)
自从上一篇<自己动手实现java断点/单步调试(一)> 是时候应该总结一下JDI的事件了 事件类型 描述 ClassPrepareEvent 装载某个指定的类所引发的事件 ClassUnl ...
- 关于Java注解(annotation)的简单理解
一.什么是注解? 从 JDK5 开始,Java增加对元数据的支持,也就是注解.简单理解就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部 ...
- 【noi 2.6_9270】&【poj 2440】DNA(DP)
题意:问长度为L的所有01串中,有多少个不包含"101"和"111"的串. 解法:f[i][j]表示长度为i的01串中,结尾2位的十进制数是j的合法串的个数.那 ...
- hdu2126 Buy the souvenirs
Problem Description When the winter holiday comes, a lot of people will have a trip. Generally, ther ...
- Kubernetes部署Prometheus+Grafana(非存储持久化方式部署)
1.在master节点处新建一个文件夹,用于保存下载prometheus+granfana的yaml文件 mkdir /root/prometheus cd /root/prometheus git ...
- python工业互联网应用实战6—任务分解
根据需求定义"任务"是一个完整的业务搬运流程,整个流程涉及到多个机构(设备)分别动作执行多个步骤,所以依据前面的模型设计,需要把任务分解到多个连续的子任务(作业),未来通过顺序串联 ...
- np.random.randint()的返回值
返回的是数组而非int 比如返回x,y 为[1][2] 而非1,2 容易在只有一维一列时没有意识到 其他函数的返回值也要注意
- PAT l2-010 排座位 【并查集】
L2-010. 排座位 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位. ...
- 017.NET5_内置容器基本使用
IOC容器IServiceCollection .net 5已经内置了IOC容器. 什么是IOC? 把对象的创建交给第三方容器去创建 如何使用内置的 IOC IServiceCollection ? ...