[从Minecraft学游戏开发]前置知识 - 数学


声明:本教程的图像,资源,代码仅供学习参考使用,禁止以任何形式发布。如有违反代码提供者(本人)不付任何责任。
项目开源地址 https://github.com/OrbitGW/MYCRAFT


文章目录

  • 前置知识 - 数学
    • 向量(vector)
    • 向量运算
      • 向量长度
      • 单位向量
      • 向量与标量运算
      • 向量取反
      • 向量加减
      • 向量相乘
        • 点乘
    • 叉乘
    • 矩阵
    • 矩阵的运算
      • 矩阵的加减
      • 矩阵的数乘
      • 矩阵相乘
      • 矩阵与向量相乘
      • 单位矩阵


前置知识 - 数学

此部分是针对高中以下学历的


向量(vector)

向量最基本的定义就是一个方向。或者更正式的说,向量有一个方向(Direction)和大小(Magnitude,也叫做强度或长度)
一个长度为 5 \sqrt{5} 5 ,指向(2,1)的向量v表示为:
v ⃗ = ( 2 , 1 ) \vec{v}=(2,1) v =(2,1)
图像为:
[从Minecraft学游戏开发]前置知识 - 数学_第1张图片


向量运算

向量长度

三维向量 v ⃗ = ( x , y , z ) \vec{v}=(x,y,z) v =(x,y,z)的长度为:
∣ v ⃗ ∣ = x 2 + y 2 + z 2 |\vec{v}|=\sqrt{x^2+y^2+z^2} v =x2+y2+z2

单位向量

有一个特殊类型的向量叫做单位向量(Unit Vector) n ⃗ \vec{n} n 。单位向量有一个特别的性质:它的长度是1:
n ⃗ = v ⃗ ∣ v ⃗ ∣ \vec{n}= \frac{\vec{v}}{|\vec{v}|} n =v v

向量与标量运算

v ⃗ + a = ( x + a , y + a , z + a ) \vec{v}+a=(x+a,y+a,z+a) v +a=(x+a,y+a,z+a)
v ⃗ ⋅ a = ( x ∗ a , y ∗ a , z ∗ a ) \vec{v} \cdot a=(x*a,y*a,z*a) v a=(xa,ya,za)

向量取反

v ⃗ = ( x , y , z ) \vec{v}=(x,y,z) v =(x,y,z)则:
− v ⃗ = ( − x , − y , − z ) -\vec{v}=(-x,-y,-z) v =(x,y,z)

向量加减

v ⃗ = ( x 1 , y 1 ) , u ⃗ = ( x 2 , y 2 ) , \vec{v}=(x_1,y_1),\vec{u}=(x_2,y_2), v =(x1,y1),u =(x2,y2),则:
v ⃗ + u ⃗ = ( x 1 + x 2 , y 1 + y 2 ) \vec{v}+\vec{u}=(x_1+x_2,y_1+y_2) v +u =(x1+x2,y1+y2)

v ⃗ − u ⃗ = ( x 1 − x 2 , y 1 − y 2 ) \vec{v}-\vec{u}=(x_1-x_2,y_1-y_2) v u =(x1x2,y1y2)
比如 v ⃗ = ( 2 , 1 ) , u ⃗ = ( 1 , 3 ) , w ⃗ = v ⃗ + u ⃗ = ( 3 , 4 ) \vec{v}=(2,1),\vec{u}=(1,3),\vec{w}=\vec{v}+\vec{u}=(3,4) v =(2,1),u =(1,3),w =v +u =(3,4),其图像为

[从Minecraft学游戏开发]前置知识 - 数学_第2张图片
v ⃗ = ( 2 , 1 ) , u ⃗ = ( 1 , 3 ) , w ⃗ = v ⃗ − u ⃗ = ( 1 , − 2 ) \vec{v}=(2,1),\vec{u}=(1,3),\vec{w}=\vec{v}-\vec{u}=(1,-2) v =(2,1),u =(1,3),w =v u =(1,2),其图像为
[从Minecraft学游戏开发]前置知识 - 数学_第3张图片
Attention:指向是末到出

向量相乘

两个向量相乘是一种很奇怪的情况。普通的乘法在向量上是没有定义的,因为它在视觉上是没有意义的。但是在相乘的时候我们有两种特定情况可以选择:一个是点乘(Dot Product),记作 v ⃗ ⋅ u ⃗ \vec{v} \cdot \vec{u} v u ,另一个是叉乘(Cross Product),记作 v ⃗ × u ⃗ \vec{v} \times \vec{u} v ×u

点乘

v ⃗ ⋅ u ⃗ = ∣ v ⃗ ∣ ⋅ ∣ u ⃗ ∣ ⋅ c o s θ \vec{v} \cdot \vec{u} = |\vec{v}| \cdot |\vec{u}| \cdot cos \theta v u =v u cosθ
c o s θ = v ⃗ ⋅ u ⃗ ∣ v ⃗ ∣ ⋅ ∣ u ⃗ ∣ cos \theta= \frac{\vec{v} \cdot \vec{u} }{|\vec{v}| \cdot |\vec{u}|} cosθ=v u v u

叉乘

叉乘只在3D空间中有定义,它需要两个不平行向量作为输入,生成一个正交于两个输入向量的第三个向量。所以他是三位的。如果输入的两个向量也是正交的,那么叉乘之后将会产生3个互相正交的向量。
[从Minecraft学游戏开发]前置知识 - 数学_第4张图片


矩阵

矩阵就是一个矩形的数字、符号或表达式数组。矩阵中每一项叫做矩阵的元素(Element)。矩阵可以通过(i, j)进行索引,i是行,j是列(j列i行,也叫做矩阵的维度(Dimension))。

矩阵的运算

矩阵的加减

[ 1 2 3 4 ] + 3 =   [ 1 + 3 2 + 3 3 + 3 4 + 3 ] = [ 4 5 6 7 ] \begin{bmatrix} 1 &2\\ 3&4 \end{bmatrix}+3=\ \begin{bmatrix} 1+3 &2+3\\ 3+3&4+3 \end{bmatrix}= \begin{bmatrix} 4 &5\\ 6&7 \end{bmatrix} [1324]+3= [1+33+32+34+3]=[4657]
[ 1 2 3 4 ] − 3 = [ 1 − 3 2 − 3 3 − 3 4 − 3 ] = [ − 2 − 1 0 1 ] \begin{bmatrix} 1 &2\\ 3&4 \end{bmatrix}-3= \begin{bmatrix} 1-3 &2-3\\ 3-3&4-3 \end{bmatrix}= \begin{bmatrix} -2 &-1\\ 0&1 \end{bmatrix} [1324]3=[13332343]=[2011]

矩阵与矩阵之间的加减只对同维度的矩阵才是有定义的。一个3×2矩阵和一个2×3矩阵(或一个3×3矩阵与4×4矩阵)是不能进行加减的。
我们看看两个2×2矩阵是怎样相加的:
[ 1 2 3 4 ] + [ 5 6 7 8 ] = [ 1 + 5 2 + 6 3 + 7 4 + 8 ] = [ 6 8 10 12 ] \begin{bmatrix} 1 &2\\ 3&4 \end{bmatrix}+ \begin{bmatrix} 5 &6\\ 7&8 \end{bmatrix}= \begin{bmatrix} 1+5 &2+6\\ 3+7&4+8 \end{bmatrix}= \begin{bmatrix} 6 &8\\ 10&12 \end{bmatrix} [1324]+[5768]=[1+53+72+64+8]=[610812]
同样的法则也适用于减法。

矩阵的数乘

2 ⋅ [ 1 2 3 4 ] =   [ 2 ⋅ 1 2 ⋅ 2 2 ⋅ 3 2 ⋅ 4 ] = [ 2 4 6 8 ] 2 \cdot \begin{bmatrix} 1 &2\\ 3&4 \end{bmatrix}=\ \begin{bmatrix} 2 \cdot1 &2 \cdot2\\ 2 \cdot3&2 \cdot4 \end{bmatrix}= \begin{bmatrix} 2 &4\\ 6&8 \end{bmatrix} 2[1324]= [21232224]=[2648]

矩阵相乘

只有当左侧矩阵的列数与右侧矩阵的行数相等,两个矩阵才能相乘。
矩阵相乘不遵守交换律(Commutative),也就是说 p ⋅ q ≠ q ⋅ p p \cdot q \neq q \cdot p pq=qp
在这里插入图片描述

矩阵与向量相乘

向量,它其实就是一个N×1矩阵,N表示向量分量的个数(也叫N维(N-dimensional)向量)。向量和矩阵一样都是一个数字序列,但它只有1列。那么,这个新的定义对我们有什么帮助呢?如果我们有一个M×N矩阵,我们可以用这个矩阵乘以我们的N×1向量,因为这个矩阵的列数等于向量的行数,所以它们就能相乘。

单位矩阵

[ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] ⋅ [ 1 2 3 4 ] = [ 1 ⋅ 1 1 ⋅ 2 1 ⋅ 3 1 ⋅ 4 ] = [ 1 2 3 4 ] \begin{bmatrix} 1 &0&0&0\\ 0 &1&0&0\\ 0 &0&1&0\\ 0 &0&0&1 \end{bmatrix} \cdot \begin{bmatrix} 1\\ 2\\ 3\\ 4 \end{bmatrix}= \begin{bmatrix} 1 \cdot1\\ 1 \cdot2\\ 1 \cdot3\\ 1 \cdot4 \end{bmatrix}= \begin{bmatrix} 1\\ 2\\ 3\\ 4 \end{bmatrix} 1000010000100001 1234 = 11121314 = 1234

你可能感兴趣的:(从Minecraft学游戏开发,c++,游戏,矩阵,算法,3d)