MME 编写入门(二)MVP 矩阵、顶点坐标变换(可选)

本文由 简悦 SimpRead 转码, 原文地址 www.bilibili.com

作者:小林呓

关于矩阵的学习,涉及到线性代数,所以可能会难一些。

关于矩阵的学习,涉及到线性代数,所以可能会难一些。不过我觉得有看不懂的地方也没关系,等后续的学习跟进,也许之前的问题就自然而然地化解了。某种意义上来说,会调用就行了。所以这篇当作可选的。

几何图形管线的第一个阶段会将模型的顶点从其本地坐标系转换到由场景中的所有对象使用的坐标系。 重新定位顶点的过程称为**世界转换**。 这种新方向通常称为**世界空间**,世界空间中的每个顶点都使用世界坐标声明。

在下一个阶段,相对于相机确定描述你的 3D 世界的顶点的方向。 也就是说,应用程序为场景选择一个视点,世界空间坐标将重新定位并旋转在相机视图周围,将世界空间转换为相机空间。 这是视图转换。

下一阶段是**投影转换**。 在管道的这一部分,对象通常与观众的距离进行缩放,以便为场景提供深度的错觉:关闭对象显示为大于遥远的对象,依此类之。 为简单起见,将投影转换后顶点所在的空间称为投影空间。 (在一些图形书籍中,可能会将投影空间称为后透视齐性空间。) 并非所有投影转换都会按比例缩放场景中对象的大小。 此类投影有时称为仿射或**正交投影**。

在管线的最后一个部分中,将删除屏幕上所有不可见的顶点,这样一来,光栅器便无需花时间计算不可见项的颜色和着色。 此过程称为**剪裁**。 在剪裁后,剩余顶点将根据视口参数进行缩放并转换为**屏幕坐标**。 生成的顶点(光栅化场景时可在屏幕上看到)存在于**屏幕空间**中。

转换用于将对象几何图形从一个坐标空间转换到另一个坐标空间。

MVP 矩阵分别是**模型(Model),观察(View),投影(Projection)**三个矩阵。我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Coordinate)的形式结束。

模型空间是以自身中心为原点的空间坐标系。

世界空间是以世界中心为原点的空间坐标系。

在不同的建模软件或者游戏引擎中使用的坐标系是不一样的。MMD 是右手坐标系。

图片来源:https://zhuanlan.zhihu.com/p/448782117

视觉空间是以摄像机中心为原点的空间坐标系。

判断顶点是否在可见范围内,若在可见范围内即渲染出来,若不在范围内则将该顶点剔除掉。

  • 在 MME 中给出六种顶点坐标变换矩阵

顶点坐标变换使用的矩阵。坐标变换分为世界坐标系变换、 视图变换和投影 变换。使用以下 6 个语义将可以直接获得对应的变换矩阵 (类型是 float4x4) 

  • WORLD:世界坐标系变换矩阵

  • VIEW 视图变换矩阵

  • PROJECTION 投影变换矩阵

  • WORLDVIEW 世界坐标系变换矩阵乘视图变换矩阵

  • VIEWPROJECTION 视图变换矩阵乘投影变换矩阵

  • WORLDVIEWPROJECTION 世界坐标系变换矩阵乘视图变换矩阵乘投影变换矩阵

float4x4 WorldViewProjMatrix        : WORLDVIEWPROJECTION;
float4x4 WorldMatrix                : WORLD;
float4x4 ViewMatrix                 : VIEW;

你可以在各个语义的末尾加上 "INVERSE" 来得到逆矩阵,如 "WORLDINVERSE";你可以在各个语义的末尾加上 "TRANSPOSE" 来得到转置矩阵,如 "WORLDTRANSPOSE";你可以在各个语义的末尾加上 "INVERSETRANSPOSE" 来得到转置矩阵的逆矩阵。

(一寸长一寸强,WORLDVIEWPROJECTION 简称 MVP,将会是最常用的一个矩阵。)

(整理至此,我翻阅了很多博客文章。教程可能算不上,个人笔记吧。我是使用 FlowUs 写的,有些部分不是很必要,我选择性地删了删,把链接附在文下,上传到 b 站专栏。FlowUs 可以导出 PDF 版,等基本写完了打包成 PDF 包,或许会更好。)

(管线的编写本身并不难,但需要一定的理论去支撑,可能难就难在这些数学的理论上了。)

  • GAMES101 - 现代计算机图形学入门 - 闫令琪 Lecture 03-04 Transformation

https://www.bilibili.com/video/BV1X7411F744

  • 矩阵乘法是不满足乘法交换律的。

一个三维场景中的各个模型一般需要各自建模,再通过坐标变换放到一个统一的世界空间的指定位置上。 这个过程在 3D 图形学中称作 “世界变换” 。 世界变换有三种,平移、旋转和缩放 。 这三种变换按各种顺序执行,结果是不同的。 实际的应用中一般按照 **缩放 -> 旋转 -> 平移**的顺序进行。 这样做的原因是可以获得最符合常理的变换结果。

https://blog.csdn.net/zsq306650083/article/details/50561857

  • KarlvonDonitz:为啥图形学需要 4x4 的矩阵来表示三维的变换?

https://www.bilibili.com/read/cv200169

3×3 的矩阵无法解决平移的问题,4×4 的矩阵可以解决,使用后可以建立简洁、统一的运算操作来处理所有变换。

  • 详细变化参考《Real-Time Rendering 4th Edition》全文翻译 - 第 4 章 变换 4.1-4.7

https://westriverlin.blog.csdn.net/article/details/105381222

  • 转换 (Direct3D 9)

https://learn.microsoft.com/zh-cn/windows/win32/direct3d9/transforms

  • 线性代数的本质

https://www.bilibili.com/video/BV1ys411472E

评论