| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> Unity中的3D数学—02向量与矩阵 -> 正文阅读 |
|
[游戏开发]Unity中的3D数学—02向量与矩阵 |
1.向量1.1 向量的运算
从几何意义上看: (1)矢量与标量的乘/除法意味着对矢量进行缩放 (2)矢量的加/减法意味着矢量间的位置偏移 (3)矢量的模意味着矢量在空间中的长度 (4)矢量的点积意味着一个矢量在另一个矢量方向上的投影再乘以后者的长度 (5)矢量的叉积意味着一个同时垂直于两矢量的新矢量,长度是两矢量的模乘以它们之间夹角的余弦值 矢量叉乘得到的新矢量方向在左手坐标系和右手坐标系中并不相同,但仅仅影响在三维空间中的表现,数学计算的结果并无差异。 1.2 Vector3类在 Unity 中,和向量有关的类有 Vector2、Vector3 和 Vector4,分别对应不同维度的向量。 下面是Vector3类中的成员变量和常用方法。 2.矩阵2.1 矩阵的运算
2.2 特殊矩阵(1)方阵:行数与列数相等的矩阵 正交基:一组互相垂直的基矢量叫做一组正交基 正交矩阵就是一组标准正交基 2.3 矩阵与线性变换(1)旋转在二维坐标系中,对x轴和y轴方向上的单位向量旋转θ度,可以得到如下结果: 得到二维空间的旋转矩阵: 绕z轴旋转 (2)缩放沿坐标轴缩放比较简单,只需要对矢量各个坐标轴方向上的分量乘以一个常数即可。 沿任意轴的缩放矩阵(与沿任意轴的旋转矩阵求法类似) (3)正交投影当对一个三维空间中的物体进行正交投影时,相当于让垂直于投影平面的分量归零,其他方向上的分量不变。 例如对矢量
v
\mathbf{v}
v分别做xy、xz、yz平面上的正交投影: (4)镜像镜像矩阵与正交投影矩阵非常相似,唯一的区别是正交投影矩阵缩放因子是0,镜像矩阵缩放因子是-1 (5)切变所谓切变就是对物体进行扭曲变换,但物体的面积(体积)不会发生改变。 在二维空间中的切变矩阵如下(s是切变因子): 在三维空间中的切变矩阵如下: 2.4 矩阵行列式有如下所示的矩阵M (3)行列式中某一行(列)中所有元素都乘以同一数k,等于k乘此行列式 (4)行列式中如果有两行(列)元素成比例, D = 0 \mathbf{D}=0 D=0 (5)若行列式中某一行(列)的元素都是两数之和,则此行列式可以拆分为两个相加的行列式 (6)把行列式的某一行(列)的各元素乘以同一数后加到另一行(列)对应元素上,行列式不变 2.5 余子式与代数余子式余子式: 在n阶行列式中,划去元 a i j a_{ij} aij?所在的第i行与第j列的元,剩下的元不改变原来的顺序所构成的n-1阶行列式称为元 a i j a_{ij} aij?的余子式。数学上记作 M i j \mathbf{M_ij} Mi?j。 代数余子式: A i j = ( ? 1 ) ( i + j ) M i j A_{ij}=(-1)^{(i+j)}M_{ij} Aij?=(?1)(i+j)Mij?,其中 A i j A_{ij} Aij?就是 a i j a_{ij} aij?的代数余子式。(具体可以看这篇文章:传送门) 行列式与代数余子式的关系: 行列式等于它任意一行(列)的各元素与其对应的代数式余子式乘积之和 2.6 伴随矩阵方阵
A
=
(
a
i
j
)
n
×
n
A=(a_{ij})_{n×n}
A=(aij?)n×n?的各元素的代数余子式
A
i
j
A_{ij}
Aij?所构成的如下矩阵
A
?
A^*
A?: 性质: 矩阵A与其伴随矩阵的乘积为 ,行列式的值乘以单位矩阵 2.7 齐次坐标齐次坐标就是在原本的三维向量中增加一个 w w w分量,即 ( x , y , z , w ) (x,y,z,w) (x,y,z,w)。当 w = 1 w=1 w=1时,表示的是标准三维空间中的坐标。当 w = 0 w=0 w=0时,表示的是标准三维空间中的方向。任何齐次坐标转换到标准三维空间的坐标都为 ( x / w , y / w , z / w ) (x/w,y/w,z/w) (x/w,y/w,z/w)。 引入齐次坐标后,我们就可以进行平移变换 平移
[
x
y
z
1
]
[
1
0
0
0
0
1
0
0
0
0
1
0
Δ
x
Δ
y
Δ
z
1
]
=
[
x
+
Δ
x
y
+
Δ
y
z
+
Δ
z
1
]
\begin{bmatrix} x & y& z& 1 \end{bmatrix}\begin{bmatrix}1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 \\0 & 0 & 1 & 0\\ \Delta x & \Delta y & \Delta z & 1\end{bmatrix}=\begin{bmatrix} x+\Delta x & y+\Delta y& z+\Delta z & 1 \end{bmatrix}
[x?y?z?1?]?????100Δx?010Δy?001Δz?0001??????=[x+Δx?y+Δy?z+Δz?1?] 透视投影[ x y z 1 ] [ 1 0 0 0 0 1 0 0 0 0 1 1 / d 0 0 0 0 ] = [ x y z z / d ] \begin{bmatrix} x & y& z& 1 \end{bmatrix}\begin{bmatrix}1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 \\0 & 0 & 1 & 1/d\\ 0 & 0 & 0 & 0\end{bmatrix}=\begin{bmatrix} x & y& z & z/d \end{bmatrix} [x?y?z?1?]?????1000?0100?0010?001/d0??????=[x?y?z?z/d?] 仿射变换通俗的讲就是线性变换+平移 可以参考这篇文章传送门 变换的分类2.8 Unity中的透视投影与正交投影首先需要注意的一点是Unity中的观察空间采用的是右手坐标系,因此在变换过程中会采用列向量右乘的方式。 透视投影Unity中的透视投影矩阵: 其中,
A
s
p
e
c
t
Aspect
Aspect表示的是视锥体的近平面或远平面宽高之比。即: 透视投影矩阵会改变空间的旋向性,即空间会从右手坐标系转换为左手坐标系。这意味着离摄像机越远,z值越大。 正交投影Unity中的正交投影矩阵: 正交投影矩阵同样会改变空间的旋向性。 关于透视投影矩阵和正交投影矩阵详细的推导过程可以参考这篇文章传送门 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 10:23:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |