提炼总结之——3D数学基础:图形与游戏开发

前言

这篇文章仅为了方便于自己查找一些3d 的数学公式。
DirectX使用的是行向量 ,即矩阵的乘法是左乘
OpenGL使用的是列向量 ,即矩阵的乘法是右乘
Unity的Shader中, 使用的是列向量 ,即矩阵的乘法是右乘

请注意,下面的矩阵向量如果没有特别说明,都是使用行向量(与Unity的有所区别)

一、向量类

向量的点积

  • 公式1:
    a ⃗ ⋅ b ⃗ = ∣ a ⃗ ∣ ⋅ ∣ b ⃗ ∣ c o s θ \vec{a}·\vec{b} = |\vec{a}|·|\vec{b}|cos\theta a b =a b cosθ
  • 公式2:
    a ⃗ ⋅ b ⃗ = ( a ⃗ x , a ⃗ y , a ⃗ z ) ⋅ ( b ⃗ x , b ⃗ y , b ⃗ z ) = a ⃗ x b ⃗ x + a ⃗ y b ⃗ y + a ⃗ z b ⃗ z \vec{a}·\vec{b} = (\vec{a}_{x},\vec{a}_{y},\vec{a}_{z})·(\vec{b}_{x},\vec{b}_{y},\vec{b}_{z})\\ = \vec{a}_{x}\vec{b}_{x}+\vec{a}_{y}\vec{b}_{y}+\vec{a}_{z}\vec{b}_{z} a b =(a x,a y,a z)(b x,b y,b z)=a xb x+a yb y+a zb z
  • 几何意义:
    点积是描述两个向量的"相似程度",点积结果越大,两向量越接近;
    结果等于0,代表两向量垂直;
    结果大于0,代表两向量的夹角大于90度;
    结果小于0,代表两向量的夹角小于90度。

向量的叉积

  • 公式
    a ⃗ × b ⃗ = [ a ⃗ x a ⃗ y a ⃗ z ] × [ b ⃗ x b ⃗ y b ⃗ z ] = [ a ⃗ y × b ⃗ z − a ⃗ z × b ⃗ y a ⃗ z × b ⃗ x − a ⃗ x × b ⃗ z a ⃗ x × b ⃗ y − a ⃗ y × b ⃗ x ] \vec{a}× \vec{b} = \begin{bmatrix} \vec{a}_{x} \\ \vec{a}_{y} \\ \vec{a}_{z} \\ \end{bmatrix} × \begin{bmatrix} \vec{b}_{x} \\ \vec{b}_{y} \\ \vec{b}_{z} \\ \end{bmatrix}= \begin{bmatrix} \vec{a}_{y}×\vec{b}_{z}- \vec{a}_{z}×\vec{b}_{y}\\ \vec{a}_{z}×\vec{b}_{x}- \vec{a}_{x}×\vec{b}_{z} \\ \vec{a}_{x}×\vec{b}_{y}- \vec{a}_{y}×\vec{b}_{x}\\ \end{bmatrix} a ×b = a xa ya z × b xb yb z = a y×b za z×b ya z×b xa x×b za x×b ya y×b x
  • 几何意义:
    叉积得到的向量垂直于原来的两个向量

二、矩阵

2.1 方阵

定义:行数和列数相同的矩阵称为方阵,如2×2矩阵,3×3矩阵,4×4矩阵等;

  • 对角矩阵
    定义:如果所有非对角线元素都为0,则这种矩阵称为对角矩阵,如下:
    [ M 11 0 0 0 0 M 22 0 0 0 0 M 33 0 0 0 0 M 44 ] \begin{bmatrix} M_{11}&0&0&0\\ 0&M_{22}&0&0\\ 0&0&M_{33}&0\\ 0&0&0&M_{44}\\ \end{bmatrix} M110000M220000M330000M44

  • 单位矩阵
    定义:对角线元素为1,其他元素为0的矩阵称为单位矩阵, 单位矩阵是一种特殊的对角矩阵,如下:
    [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] \begin{bmatrix} 1&0&0&0\\ 0&1&0&0\\ 0&0&1&0\\ 0&0&0&1\\ \end{bmatrix} 1000010000100001

任意一个矩阵乘以单位矩阵,都将得到原来的矩阵

2.2 矩阵乘法的注意事项

  • 矩阵乘法不满足交换律,即: AB≠ BA

  • 矩阵乘法满足结合律,即: (AB)C= A(BC) (假设A, B, C的维数使其乘法有意义,要注意如果(AB)C有意义,那么A(BC)- -定也有意义)
    矩阵乘法结合律可以扩展到多个矩阵的情况下,如:
    ABCDEF=(((AB)C)D)E)F= (((BC)D)E)F)=(AB)(CD)(EF)

  • 矩阵乘法也满足与标量或向量的结合律,即:
    (kA)B=k(AB)= A(kB)  (vA)B=v(AB)

  • 矩阵积的转置相当于先转置矩阵然后以相反的顺序乘:
    ( A B ) T = B T A T ( M 1 M 2 M 3 . . . M n − 1 M n ) T = M n T M n − 1 T . . . M 3 T M 2 T M 1 T (AB)^{T} = B^{T}A^{T}\\ ({M}_{1}{M}_{2}{M}_{3}...{M}_{n-1}{M}_{n})^{T} = {M}_{n}^{T}{M}_{n-1}^{T}...{M}_{3}^{T}{M}_{2}^{T}{M}_{1}^{T} (AB)T=BTAT(M1M2M3...Mn1Mn)T=MnTMn1T...M3TM2TM1T

  • 矩阵一向量乘法满足对向量加法的分配律。对于向量v、w和矩阵M,有:
    ( v ⃗ + w ⃗ ) M = v ⃗ M + w ⃗ M (\vec{v}+\vec{w})M = \vec{v}M+\vec{w}M (v +w )M=v M+w M

2.3 矩阵的转置

定义:
一个 r ∗ c 的矩阵 M , M 的转置记作 M T , M T 是一个 c ∗ r 的矩阵 一个r * c的矩阵M,M的转置记作 M^{T},M^{T}是一个c * r的矩阵 一个rc的矩阵MM的转置记作MT,MT是一个cr的矩阵
从另一方面理解, M i j T = M j i , 即沿着矩阵的对角线翻折 从另一方面理解,M_ij^{T} = M_ji,即沿着矩阵的对角线翻折 从另一方面理解,MijT=Mji,即沿着矩阵的对角线翻折

如下例子:
[ a b c d e f g h i ] T = [ a d g b e h c f i ] \begin{bmatrix} a&b&c\\ d&e&f\\ g&h&i\\ \end{bmatrix}^{T} = \begin{bmatrix} a&d&g\\ b&e&h\\ c&f&i\\ \end{bmatrix} adgbehcfi T= abcdefghi

2.4 矩阵的几何解析

2.4.1 矩阵怎样变换向量的

以 p ⃗ 、 q ⃗ 、 r ⃗ 为行构建一个 3 × 3 矩阵 M ,可以得到下面的形式: 以\vec{p}、\vec{q}、\vec{r}为行构建一个3×3矩阵M,可以得到下面的形式: p q r 为行构建一个3×3矩阵M,可以得到下面的形式:
M = [ p ⃗ q ⃗ r ⃗ ] = [ p ⃗ x p ⃗ y p ⃗ z q ⃗ x q ⃗ y q ⃗ z r ⃗ x r ⃗ y r ⃗ z ] M = \begin{bmatrix} \vec{p}\\ \vec{q}\\ \vec{r}\\ \end{bmatrix} = \begin{bmatrix} {\vec{p}}_{x}&{\vec{p}}_{y}&{\vec{p}}_{z}\\ {\vec{q}}_{x}&{\vec{q}}_{y}&{\vec{q}}_{z}\\ {\vec{r}}_{x}&{\vec{r}}_{y}&{\vec{r}}_{z}\\ \end{bmatrix} M= p q r = p xq xr xp yq yr yp zq zr z
如果用一个向量乘以该矩阵,得到:
[ x y z ] × [ p ⃗ x p ⃗ y p ⃗ z q ⃗ x q ⃗ y q ⃗ z r ⃗ x r ⃗ y r ⃗ z ] = x ⋅ p ⃗ + y ⋅ q ⃗ + z ⋅ r ⃗ \begin{bmatrix} x&y&z\\ \end{bmatrix} × \begin{bmatrix} {\vec{p}}_{x}&{\vec{p}}_{y}&{\vec{p}}_{z}\\ {\vec{q}}_{x}&{\vec{q}}_{y}&{\vec{q}}_{z}\\ {\vec{r}}_{x}&{\vec{r}}_{y}&{\vec{r}}_{z}\\ \end{bmatrix} = x·\vec{p} + y·\vec{q} + z·\vec{r} [xyz]× p xq xr xp yq yr yp zq zr z =xp +yq +zr

如果把矩阵的行解释为坐标系的基向量,那么乘以该矩阵就相当于执行了一次坐标转换。若有aM-如果把矩阵的行解释为坐标系的基向量,那么乘以该矩阵就相当于执行了一次坐标转换。若有aM = b,我们就可以说,M将a转换到b。

2.4.2 矩阵的形式

矩阵每一行都能解析为转换后的基向量。(大家可以用转换前的基向量乘该矩阵就可以得出结论,具体过程不再推导)

2.5 旋转矩阵

下面所说的角度都是以逆时针为正方形

2.5.1 2D的旋转矩阵

R ( θ ) = [ p ′ q ′ ] = [ c o s θ s i n θ − s i n θ c o s θ ] R(\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ \end{bmatrix} = \begin{bmatrix} cos\theta&sin\theta\\ -sin\theta&cos\theta\\ \end{bmatrix} R(θ)=[pq]=[cosθsinθsinθcosθ]

2.5.2 3D中绕坐标轴旋转

绕轴旋转θ时,必须知道哪个方向为正,哪个方向为负。
-------这个后面补充-------

  • 绕X轴旋转
    R ( θ ) = [ p ′ q ′ r ′ ] = [ 1 0 0 0 c o s θ s i n θ 0 − s i n θ c o s θ ] R(\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ r{′}\\ \end{bmatrix} = \begin{bmatrix} 1&0&0\\ 0&cos\theta&sin\theta\\ 0&-sin\theta&cos\theta\\ \end{bmatrix} R(θ)= pqr = 1000cosθsinθ0sinθcosθ
  • 绕Y轴旋转
    R ( θ ) = [ p ′ q ′ r ′ ] = [ c o s θ 0 − s i n θ 0 1 0 s i n θ 0 c o s θ ] R(\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ r{′}\\ \end{bmatrix} = \begin{bmatrix} cos\theta&0&-sin\theta\\ 0&1&0\\ sin\theta&0&cos\theta\\ \end{bmatrix} R(θ)= pqr = cosθ0sinθ010sinθ0cosθ
  • 绕Z轴旋转
    R ( θ ) = [ p ′ q ′ r ′ ] = [ c o s θ s i n θ 0 − s i n θ c o s θ 0 0 0 1 ] R(\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ r{′}\\ \end{bmatrix} = \begin{bmatrix} cos\theta&sin\theta&0\\ -sin\theta&cos\theta&0\\ 0&0&1\\ \end{bmatrix} R(θ)= pqr = cosθsinθ0sinθcosθ0001

2.5.3 3D中绕任意轴旋转

R ( n , θ ) = [ p ′ q ′ r ′ ] = [ n x 2 ( 1 − c o s θ ) + c o s θ n x n y ( 1 − c o s θ ) + n z s i n θ n x n z ( 1 − c o s θ ) − n y s i n θ n x n y ( 1 − c o s θ ) − n z s i n θ n y 2 ( 1 − c o s θ ) + c o s θ n y n z ( 1 − c o s θ ) + n x s i n θ n x n z ( 1 − c o s θ ) + n y s i n θ n y n z ( 1 − c o s θ ) − n x s i n θ n z 2 ( 1 − c o s θ ) + c o s θ ] R(n,\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ r{′}\\ \end{bmatrix} = \begin{bmatrix} n_x^{2}(1-cos\theta)+cos\theta&n_xn_y(1-cos\theta)+n_zsin\theta&n_xn_z(1-cos\theta)-n_ysin\theta\\ n_xn_y(1-cos\theta)-n_zsin\theta&n_y^{2}(1-cos\theta)+cos\theta&n_yn_z(1-cos\theta)+n_xsin\theta\\ n_xn_z(1-cos\theta)+n_ysin\theta&n_yn_z(1-cos\theta)-n_xsin\theta&n_z^{2}(1-cos\theta)+cos\theta\\ \end{bmatrix} R(n,θ)= pqr = nx2(1cosθ)+cosθnxny(1cosθ)nzsinθnxnz(1cosθ)+nysinθnxny(1cosθ)+nzsinθny2(1cosθ)+cosθnynz(1cosθ)nxsinθnxnz(1cosθ)nysinθnynz(1cosθ)+nxsinθnz2(1cosθ)+cosθ

2.6 缩放矩阵

2.6.1 2D的缩放矩阵

S ( k x , k y ) = [ k x 0 0 k y ] S(k_x,k_y) = \begin{bmatrix} k_x&0\\ 0&k_y\\ \end{bmatrix} S(kx,ky)=[kx00ky]

2.6.2 3D的缩放矩阵

S ( k x , k y , , k z ) = [ k x 0 0 0 k y 0 0 0 k z ] S(k_x,k_y,,k_z) = \begin{bmatrix} k_x&0&0\\ 0&k_y&0\\ 0&0&k_z\\ \end{bmatrix} S(kx,ky,,kz)= kx000ky000kz

2.6.3 2D沿任意方向的缩放矩阵

通过基向量构造矩阵,得到以单位向量n为缩放方向,k为因子的缩放矩阵,如下面公式所示
S ( n ⃗ , k ) = [ 1 + ( k − 1 ) n ⃗ x 2 ( k − 1 ) n ⃗ x n ⃗ y ( k − 1 ) n ⃗ x n ⃗ y 1 + ( k − 1 ) n ⃗ y 2 ] S(\vec{n},k) = \begin{bmatrix} 1+(k-1)\vec{n}_x^{2}&(k-1)\vec{n}_x\vec{n}_y\\ (k-1)\vec{n}_x\vec{n}_y&1+(k-1)\vec{n}_y^{2}\\ \end{bmatrix} S(n ,k)=[1+(k1)n x2(k1)n xn y(k1)n xn y1+(k1)n y2]

2.6.4 3D沿任意方向的缩放矩阵

以单位向量n为缩放方向,k为因子的3D缩放矩阵如下面公式所示
S ( n ⃗ , k ) = [ 1 + ( k − 1 ) n ⃗ x 2 ( k − 1 ) n ⃗ x n ⃗ y ( k − 1 ) n ⃗ x n ⃗ z ( k − 1 ) n ⃗ x n ⃗ y 1 + ( k − 1 ) n ⃗ y 2 ( k − 1 ) n ⃗ y n ⃗ z ( k − 1 ) n ⃗ x n ⃗ z ( k − 1 ) n ⃗ z n ⃗ y 1 + ( k − 1 ) n ⃗ z 2 ] S(\vec{n},k) = \begin{bmatrix} 1+(k-1)\vec{n}_x^{2}&(k-1)\vec{n}_x\vec{n}_y&(k-1)\vec{n}_x\vec{n}_z\\ (k-1)\vec{n}_x\vec{n}_y&1+(k-1)\vec{n}_y^{2}&(k-1)\vec{n}_y\vec{n}_z\\ (k-1)\vec{n}_x\vec{n}_z&(k-1)\vec{n}_z\vec{n}_y&1+(k-1)\vec{n}_z^{2}\\ \end{bmatrix} S(n ,k)= 1+(k1)n x2(k1)n xn y(k1)n xn z(k1)n xn y1+(k1)n y2(k1)n zn y(k1)n xn z(k1)n yn z1+(k1)n z2

-------没完待续。。。。。。后期会继续补充-------

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值