无论您是使用Unity还是Unreal编写自己的游戏引擎,还是制作3D图形的美术师,对数学计算机用来在屏幕上获取图形的种类的基本了解都是一项巨大的财富。 本文介绍了矢量,复数,欧拉角,四元数和矩阵,以及它们如何用于移动,旋转和缩放3D模型。
图形中事物的位置通常由矢量表示。 向量中的第一个数字称为x坐标,第二个数字称为y坐标。 每个数字代表一个维度; 3维向量具有称为z的附加坐标。
- 评论:ALIEN Offworld殖民地模拟器
- “独立游戏公司Bossa为Worlds Adrift筹集了1000万美元”:标题背后的故事
- 第八天-背景故事第一部分
- 关于Swift和SpriteKit的故事
- 碰撞检测与物理
这是两个不同的向量a和b。 a的x坐标为2,y坐标为3。由于这些向量每个都有两个数字,因此它们表示二维空间中的位置。
可以将向量相加或相减。 将a的x坐标添加到b的x坐标,并将a的y坐标添加到b的y坐标。 对于减法也是如此。
我们可以将2D向量视为距x和y轴上的原点(0,0)的距离。 加减法将一个向量移动到另一个向量。
当谈论向量时,我们称规则实数为标量。 在此示例中,标量s等于5。将矢量乘以标量将每个坐标乘以标量。 但是,没有一个向量与另一个向量的直接乘法。 在本教程中,我们将不需要点积或叉积,因此这里不再赘述。
向量的长度是其距原点的距离。 如果c是向量,则c的长度用| c |表示。 假设我们空间的单位是英寸。 通过测量从原点到矢量表示的点的距离,可以用标尺找到矢量的长度。 在数学上,使用勾股定理找到长度。
单位向量是长度为1的向量。向量可以表示位置,但也表示方向。 在该示例中,向量m,n,o,p和q是单位向量,因此位于单位圆上,代表角度。
大多数3D图形由三角形组成。 一个三角形由三个顶点定义,一个顶点的位置只是一个向量。
这是Suzanne,这是Blender随附的一个简单示例模型。 通过将共享顶点的许多三角形放在一起,我们可以创建3D模型。
为了变换3D图形,我们需要变换三角形。 我们通过变换构成三角形的每个顶点来实现。 如果我们对每个顶点应用相同的变换,则可以移动,缩放或旋转三角形而不会使其变形。 为了在3D世界中移动模型,我们需要对构成模型的每个三角形应用变换。
当艺术家在Blender之类的程序中创建模型时,该模型位于模型空间中。 角色模型通常以该空间的起点在角色的脚上来制作。 这样,如果我们将原点放置在地面上,则角色将站立在地面上。 这里的原点是一个枢轴点:一切都发生在原点周围。
转换模型的第一步是在必要时对其进行缩放。 例如,角色相对于场景的建模可能过大,我们希望将其缩小。 其次是轮换:玩家朝哪个方向看? 最后一步是移动模型,称为翻译。 我们需要将模型从原点附近移到我们实际需要的地方。 游戏对场景中的每个对象的每一帧进行这些转换。
那么我们如何进行这些转换呢? 我们将从翻译开始。 由于顶点的位置是矢量,因此我们可以使用矢量加减法来移动它们。 给定一个偏移矢量,例如玩家在世界上的位置,我们可以将模型上的每个顶点移动此偏移量以移动模型。
通过将顶点的位置乘以标量来完成缩放。 乘以大于1的数字会使三角形变大,乘以0到1之间的数字会使三角形变小,而乘以1显然对三角形没有影响。 注意三角形如何围绕原点缩放。
这样我们就可以平移和缩放,但是旋转呢? 不幸的是,没有简单的矢量数学可绕原点旋转点。 本教程的其余部分将继续进行。
旋转顶点时,我们想围绕原点旋转它。 重要的是,如果顶点在旋转之前与原点相距6英寸,则之后仍相距6英寸。 如果旋转模型上的每个顶点,则将旋转模型。
在进行3D旋转之前,我们将首先讨论复数。 复数具有实部和虚部。 虚数部分乘以i。
我们可以将复数视为2D向量。 实部对应于x坐标,虚部对应于y坐标。 大多数时候,您可以将i理解为“垂直轴”。
就像我们可以通过应用简单的代数进行矢量处理一样,我们可以添加和减去复数。 这具有将一个复数彼此“移动”的相同效果。
那我要怎么办? 您唯一需要担心的是当我乘以另一个i。 我乘以我(我的平方)等于-1。 这里的所有都是它的; 除了指示垂直轴外,单个i对我们没有任何意义。
与向量不同,可以将复数相乘。 在这里,我们看到了将复数C和D相乘的公式。
复数有两个有趣的性质。 首先是它们的长度成倍增加。 如果C的长度为4,D的长度为6,则C的长度乘以D的长度为4 * 6 =24。此图显示了为简单起见,仅对实数进行复数乘法。
第二个属性是它们的角度加在一起。 如果A表示与x轴成30度的点,而B表示与x轴成45度的点,则A乘以B将与x轴成75度,并且长度乘以。
我们在这里寻找的是旋转特性。 我们实际上想摆脱长度加倍的部分。 我们可以通过使复数成为复数来实现。 如果A和B的长度为1,则A乘以B的长度也将为1。这样,我们只会得到相加它们的角度的效果。
实际上,这就是我们可以得出三角学中可能使用的角度相加公式的方式。
假设P是一个我们想绕原点旋转的顶点,而r是一个表示纯旋转的单位复数。 将P与r相乘只会旋转P而不会更改其长度。
实际上进行乘法运算大多是简单的代数。 将每个复数放在括号中并使用分配属性。 注意,我们最终得到的术语是乘以i两次。 用-1代替两个i,然后像术语一样组合。 我们以另一个复数结尾。
到目前为止,我们已经研究了使用复数在2D空间中旋转。 在3D空间中进行旋转的方法有很多种,我们首先来看Euler旋转。 在这种形式下,我们将旋转分解为围绕x,y和z轴的旋转。 考虑一下贯穿模型的轴。 模型像轮子一样绕此轴旋转。 通过将所有这三个组合在一起,我们可以以任何可能的方式旋转模型。
当3D模型绕轴旋转时,顶点在2D平面上旋转。 与它旋转的轴相对应的坐标不变,而其他两个不变。 我们可以将要更改的两个坐标插入一个复数,然后乘以一个单位复数来旋转。 例如,要绕x轴旋转,我们可以将复数的实部设置为y,将虚部设置为z。
但是,欧拉表示存在一些缺点。 一个问题是我们只能绕x,y或z轴旋转,因此很难绕任何其他轴平滑旋转。
四元数是3D旋转的另一种方式。 四元数使我们可以绕任意轴旋转,而不仅仅是x,y或z。 它基于复数,并且具有两个附加的虚数j和k。 w是实部,而xi,yj和zk称为矢量部分。 像i平方,j平方和k平方等于-1,但我不等于j或k。 由于有4个术语和一些令人困惑的规则,四元数乘法的推导变得非常复杂,因此在此不再赘述。 如果您想自己尝试一下,请查看Wikipedia文章以获取更多信息。
构建四元数非常容易。 我们需要知道要围绕其旋转的轴以及指示我们要旋转多少的角度。 该轴由单位矢量表示。 这样,只要长度为1,轴就可以是x,y和z的任意组合。我们将向量中的所有三个数字乘以一半角度的正弦值。 w只是角度的一半的余弦。
在此示例的左半部分,我们提醒了复数乘法。 点p乘以单位复数a或b以便将其围绕原点旋转一圈。 也可以将其乘以a和b来应用两者的旋转。 右半部分显示四元数的等效概念。 3D点v乘以A或B使其绕原点旋转。 我们可以想到v在球体表面上移动。 如果我们将A乘以B,我们将得到一个新的四元数,它代表了两者的旋转。
矩阵是表示旋转以及平移和缩放的另一种常用方法。 通过将向量视为具有一列的矩阵,可以将向量乘以一个矩阵。 然后我们可以应用矩阵乘法。
2×2矩阵可以表示2D旋转。 我们可以取一个复数并将其直接转换为矩阵形式。 当此矩阵乘以一个向量时,我们将执行与复数完全相同的数学运算。 四元数可以转换为3×3矩阵。
矩阵可以有多种尺寸。 3×3矩阵允许我们旋转3D向量。 4×4矩阵最适合3D图形,但如果需要更高的效率,则可以使用4×3矩阵。
单位矩阵沿对角线包含1,其他所有位置均包含0。 相乘时对向量没有影响。 由于矩阵具有三行,因此矢量必须为3D。 在此示例中,我们使用2D向量,因此将z坐标设置为1。
对单位矩阵的较小修改使我们可以创建将缩放向量的矩阵。 通过将矩阵中的1更改为任何其他数字,矢量坐标将按该数字缩放。 这些数字不必都相同。 我们可以对壁球和拉伸三角形的顶点的x和y坐标应用不同的比例。
使用3×3矩阵转换2D向量的目的是使我们可以将矩阵用于平移。 在此示例中,我们想将顶点在x轴上移动5,在y轴上移动8。 我们利用向量末尾的1乘以5和8。
现在,我们知道如何将缩放,旋转和平移表示为矩阵。 通过将它们彼此相乘,我们最终得到了一个代表所有三个矩阵的矩阵。 然后可以将此矩阵应用于向量以一次执行所有转换。
因此,我们有一个由三角形组成的模型,这些三角形由顶点组成,并且我们有一个矩阵可用于变换模型并将其放置在虚拟世界中的适当位置。 这是图形卡的工作,它将矩阵应用于模型的每个顶点。
最后一个问题是我们如何确定哪些模型实际显示在屏幕上。
假设您要拍摄珠穆朗玛峰的照片。 大多数人会做的是上飞机,飞往尼泊尔,并在珠穆朗玛峰前架好相机。 但是还有另一种选择:您可以将相机设置在浮动的三脚架上,拿起相机中宇宙中的所有东西,然后旋转宇宙,使珠穆朗玛峰在相机前面。 这是计算机图形学使用的方法。
此处显示的框内的所有内容都将呈现到屏幕上。 因此,我们的目标是在此框中获得我们想要看到的东西。 Unity Engine Editor和Blender之类的应用程序为您提供了一个可以直观使用的相机对象。 摄像机的位置和旋转可以用矩阵表示。 但是,当要实现数学运算而不是移动照相机时,照相机会留在原地,而我们会将其他所有东西移到它前面。 只需将相机矩阵的逆应用于场景中的每个模型即可完成。 如果要在原点右边100米处拍摄照片,只需将每个对象向左边100米处移动即可。
最后,我们折叠z轴以使三角形成为2D。 然后将它们填充像素(图形卡的另一主要职责),并将图像传输到屏幕上。
熟悉三角函数对于使用3D图形的任何人都非常有用。 戴夫(Dave)的短三角课程是复习的好地方。
有关向量和矩阵数学的更多信息,我推荐此详细教程。
进入四元数的数学比较棘手。 获得它们直观感觉的一种好方法是在Blender的“转换”面板中使用w,x,y和z值,或者编写一些脚本在您喜欢的引擎中对其进行调整。
我目前是博伊西州立大学的学生,学习计算机科学。 您可以在我的网站mysterysoftware.com上找到我的一些项目和其他文章。