这篇文章仅为了方便于自己查找一些3d 的数学公式。
DirectX使用的是行向量
OpenGL使用的是列向量
请注意,下面的矩阵向量如果没有特别说明,都是使用行向量
定义:行数和列数相同的矩阵称为方阵,如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
任意一个矩阵乘以单位矩阵,都将得到原来的矩阵
矩阵乘法不满足交换律,即: 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...Mn−1Mn)T=MnTMn−1T...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=vM+wM
定义:
一个 r ∗ c 的矩阵 M , M 的转置记作 M T , M T 是一个 c ∗ r 的矩阵 一个r * c的矩阵M,M的转置记作 M^{T},M^{T}是一个c * r的矩阵 一个r∗c的矩阵M,M的转置记作MT,MT是一个c∗r的矩阵
从另一方面理解, 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
-------这个后面补充-------
下面所说的角度都是以逆时针为正方形
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(θ)=[p′q′]=[cosθ−sinθsinθcosθ]
绕轴旋转θ时,必须知道哪个方向为正,哪个方向为负。
-------这个后面补充-------
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,θ)= p′q′r′ = nx2(1−cosθ)+cosθnxny(1−cosθ)−nzsinθnxnz(1−cosθ)+nysinθnxny(1−cosθ)+nzsinθny2(1−cosθ)+cosθnynz(1−cosθ)−nxsinθnxnz(1−cosθ)−nysinθnynz(1−cosθ)+nxsinθnz2(1−cosθ)+cosθ
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]
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
通过基向量构造矩阵,得到以单位向量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+(k−1)nx2(k−1)nxny(k−1)nxny1+(k−1)ny2]
以单位向量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+(k−1)nx2(k−1)nxny(k−1)nxnz(k−1)nxny1+(k−1)ny2(k−1)nzny(k−1)nxnz(k−1)nynz1+(k−1)nz2
-------没完待续。。。。。。后期会继续补充-------