3D开发必备的数学知识整理

文章目录

  • 左手坐标系和右手坐标系
  • 左手右手坐标系
    向量的加法:两向量首尾相接,结果为不相接的首指向尾
    向量的减法:被减的向量反向后再相加
    向量的点积:
    u ⋅ v = u x v x + u y v y + u z v z = ∥ u ∥ ⋅ ∥ v ∥ c o s θ u\cdot v=u_{x}v_{x}+u_{y}v_{y}+u_{z}v_{z}=\Vert u\Vert\cdot\Vert v\Vert cos\theta uv=uxvx+uyvy+uzvz=uvcosθ
    u u u v v v都是单位向量时,它们的点积为 c o s θ cos\theta cosθ
    点积的一些有用的特性:
  • u ⋅ v = 0 u·v=0 uv=0,且 u u u或者 v v v不为0向量, 则 u ⊥ v u\perp v uv,两个向量正交。
  • u ⋅ v > 0 u·v>0 uv>0,则两向量之间的夹角小于90°。
  • u ⋅ v &lt; 0 u·v&lt;0 uv<0,则两向量之间的夹角小于90°。
    向量的叉积:
    叉积的结果 p p p u u u v v v彼此正交。 u × v = − v × u u×v=-v×u u×v=v×u,需判断两个向量是否为0或者是否相等
    p = u × v = [ ( u y v z − u z v y ) , ( u z v x − u x v z ) , ( u x v y − u y v x ) ] p=u\times v=[(u_{y}v_{z}-u_{z}v_y),(u_{z}v_{x}-u_{x}v_{z}),(u_{x}v_{y}-u_{y}v_{x})] p=u×v=[(uyvzuzvy),(uzvxuxvz),(uxvyuyvx)]
    如果使用的左手坐标系,可用左手法则判断叉乘的方向(右手坐标系需用右手法)。左手手指沿着第一个向量向第二个向量的方向弯曲,拇指指向的方向就是这两个向量叉积的方向。
    矩阵
    一个 m × n m×n m×n的矩阵是一个 m m m n n n列的矩形数组。
    仅包含单行的矩阵为行向量,仅包含单列的矩阵为列向量。
    [ a 1 a 2 ⋯ a n ] \begin{bmatrix} a_{1} &amp; a_{2} \cdots &amp; a_{n}\end{bmatrix} [a1a2an] [ a 1 a 2 ⋮ a m ] \begin{bmatrix} a_{1}\\ a_{2}\\ \vdots \\ a_{m}\end{bmatrix} a1a2am

如果两个向量位数相同且对应的元素也相同,则二者相等A=B、A≠B
标量乘矩阵,结果为用标量与该矩阵的每个元素做乘法后的矩阵。
x × [ a 11 ⋯ a 1 n ⋮ ⋱ ⋮ a m 1 ⋯ a m n ] = [ ( x × a 11 ) ⋯ ( x × a 1 n ) ⋮ ⋱ ⋮ ( x × a m 1 ) ⋯ ( x × a m n ) ] x\times\begin{bmatrix} a_{11}&amp;\cdots&amp;a_{1n}\\ \vdots&amp;\ddots&amp;\vdots\\ a_{m1}&amp;\cdots&amp;a_{mn} \end{bmatrix}=\begin{bmatrix} (x\times a_{11})&amp;\cdots&amp;(x\times a_{1n})\\ \vdots&amp;\ddots&amp;\vdots\\ (x\times a_{m1})&amp;\cdots&amp;(x\times a_{mn}) \end{bmatrix} x×a11am1a1namn=(x×a11)(x×am1)(x×a1n)(x×amn)
两个矩阵只有维数相同时可做加法,结果为对应元素相加得到的矩阵
[ a 11 ⋯ a 1 n ⋮ ⋱ ⋮ a m 1 ⋯ a m n ] + [ b 11 ⋯ b 1 n ⋮ ⋱ ⋮ b m 1 ⋯ b m n ] = [ a 11 + b 11 ) ⋯ a 1 n + b 1 n ) ⋮ ⋱ ⋮ ( a m 1 + b m 1 ) ⋯ ( a m n + b m n ) ] \begin {bmatrix}a_{11}&amp;\cdots&amp;a_{1n}\\ \vdots &amp;\ddots&amp;\vdots\\ a_{m1}&amp;\cdots&amp;a_{mn} \end{bmatrix}+\begin{bmatrix} b_{11}&amp;\cdots&amp;b_{1n}\\ \vdots&amp;\ddots&amp;\vdots\\ b_{m1}&amp;\cdots&amp;b_{mn} \end{bmatrix}=\begin{bmatrix} a_{11}+b_{11})&amp;\cdots&amp;a_{1n}+b_{1n})\\ \vdots &amp;\ddots &amp;\vdots\\ (a_{m1}+b_{m1})&amp;\cdots&amp;(a_{mn}+b_{mn}) \end{bmatrix} a11am1a1namn+b11bm1b1nbmn=a11+b11)(am1+bm1)a1n+b1n)(amn+bmn)
只有矩阵A的列数等于矩阵B的行数时候,两个矩阵才可做乘法
[ a 11 a 12 ⋯ a 1 x a 21 a 22 ⋯ a 2 x ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m x ] × [ b 11 b 12 ⋯ b 1 n b 21 b 22 ⋯ b 2 n ⋮ ⋮ ⋱ ⋮ b x 1 b x 2 ⋯ b x n ] = [ ( a 11 b 11 + a 12 b 21 ⋯ a 1 x b x 1 ) ( a 11 b 12 + a 12 b 22 ⋯ a 1 x b x 2 ) ⋯ ( a 11 b 1 n + a 12 b 2 n ⋯ a 1 x b x n ) ( a 21 b 11 + a 22 b 21 ⋯ a 2 x b x 1 ) ( a 21 b 12 + a 22 b 22 ⋯ a 2 x b x 2 ) ⋯ ( a 21 b 1 n + a 22 b 2 n ⋯ a 2 x b x n ) ⋮ ⋮ ⋱ ⋮ ( a m 1 b 11 + a m 2 b 21 ⋯ a m x b x 1 ) ( a m 1 b 12 + a m 2 b 22 ⋯ a m x b x 2 ) ⋯ ( a m 1 b 1 n + a m 2 b 2 n ⋯ a m x b x n ) ] \begin{bmatrix} a_{11}&amp;a_{12}&amp;\cdots&amp;a_{1x}\\ a_{21}&amp;a_{22}&amp;\cdots&amp;a_{2x}\\ \vdots&amp;\vdots&amp;\ddots&amp;\vdots\\ a_{m1}&amp;a_{m2}&amp;\cdots&amp;a_{mx} \end{bmatrix}\times\begin{bmatrix} b_{11}&amp;b_{12}&amp;\cdots&amp;b_{1n}\\ b_{21}&amp;b_{22}&amp;\cdots&amp;b_{2n}\\ \vdots&amp;\vdots &amp;\ddots &amp;\vdots\\ b_{x1}&amp;b_{x2}&amp;\cdots&amp;b_{xn} \end{bmatrix}=\begin{bmatrix} (a_{11}b_{11}+a_{12}b_{21}\cdots a_{1x}b_{x1})&amp;(a_{11}b_{12}+a_{12}b_{22}\cdots a_{1x}b_{x2})&amp;\cdots&amp;(a_{11}b_{1n}+a_{12}b_{2n}\cdots a_{1x}b_{xn})\\ (a_{21}b_{11}+a_{22}b_{21}\cdots a_{2x}b_{x1})&amp;(a_{21}b_{12}+a_{22}b_{22}\cdots a_{2x}b_{x2})&amp;\cdots&amp;(a_{21}b_{1n}+a_{22}b_{2n}\cdots a_{2x}b_{xn})\\ \vdots&amp;\vdots&amp;\ddots &amp;\vdots\\ (a_{m1}b_{11}+a_{m2}b_{21}\cdots a_{mx}b_{x1})&amp;(a_{m1}b_{12}+a_{m2}b_{22}\cdots a_{mx}b_{x2})&amp;\cdots&amp;(a_{m1}b_{1n}+a_{m2}b_{2n}\cdots a_{mx}b_{xn}) \end{bmatrix} a11a21am1a12a22am2a1xa2xamx×b11b21bx1b12b22bx2b1nb2nbxn=(a11b11+a12b21a1xbx1)(a21b11+a22b21a2xbx1)(am1b11+am2b21amxbx1)(a11b12+a12b22a1xbx2)(a21b12+a22b22a2xbx2)(am1b12+am2b22amxbx2)(a11b1n+a12b2na1xbxn)(a21b1n+a22b2na2xbxn)(am1b1n+am2b2namxbxn)
单位矩阵:除了主对角线上元素为1外,其余元素均为0,并且是方阵。
单位矩阵与其他矩阵做乘法时,结果依旧为其他矩阵。
逆矩阵
参考:https://www.sohu.com/a/226465524_224832?qq-pf-to=pcqq.c2c
一个 n × n n×n n×n的矩阵M的逆矩阵也是一个 n × n n×n n×n的矩阵,用符号 M − 1 M^{-1} M1表示。

  1. 可逆矩阵一定是方阵。
  2. 如果矩阵A是可逆的,其逆矩阵是唯一的。
  3. A的逆矩阵的逆矩阵还是A
  4. 可逆矩阵A的转置矩阵 A T A^{T} AT也可逆,并且 ( A T ) − 1 = ( A − 1 ) T (A^{T})^{-1}=(A^{-1})^{T} (AT)1=(A1)T(转置的逆等于逆的转置)
  5. 一个矩阵与其逆矩阵的乘积为单位矩阵: M M − 1 = M − 1 M = I MM^{-1}=M^{-1}M=I MM1=M1M=I
  6. 两个可逆矩阵的乘积依然可逆。
  7. 矩阵可逆当且仅当它是满秩矩阵。
  8. 若矩阵A可逆,则矩阵A满足消去定律。若AB=AC,则B=C,有点迷,搬运工还是原封搬运过来
    矩阵的转置:
    矩阵的转置可通过交换矩阵的行和列来实现。所以一个 m × n m×n m×n的矩阵转置是一个 n × m n×m n×m矩阵。用符号 M T M^{T} MT表示矩阵 M M M的转置。

矩阵的变换

平移变换
想要将向量 ( x , y , z ) (x,y,z) (x,y,z)平移 ( p x , p y , p z ) (p_{x},p_{y},p_{z}) (px,py,pz)个单位时候,我们只需将该向量拓展为 ( x , y , z , 1 ) (x,y,z,1) (x,y,z,1)后与 T ( p ) T(p) T(p)矩阵相乘即可。
V T ( p ) = [ x y z 1 ] [ 1 0 0 0 0 1 0 0 0 0 1 0 p x p y p z 1 ] = [ x + p x y + p y z + p z 1 ] VT(p)=\begin{bmatrix}x&amp;y&amp;z&amp;1\end{bmatrix} \begin{bmatrix}1&amp;0&amp;0&amp;0\\0&amp;1&amp;0&amp;0\\0&amp;0&amp;1&amp;0\\p_{x}&amp;p_{y}&amp;p_{z}&amp;1\end{bmatrix}= \begin{bmatrix}x+p_{x}&amp;y+p_{y}&amp;z+p_{z}&amp;1\end{bmatrix} VT(p)=[xyz1]100px010py001pz0001=[x+pxy+pyz+pz1]
平移矩阵的逆矩阵可简单的通过对平移向量p取负得到
T − 1 = T ( − p ) = [ 1 0 0 0 0 1 0 0 0 0 1 0 − p x − p y − p z 1 ] T^{-1}=T(-p)=\begin{bmatrix}1&amp;0&amp;0&amp;0\\0&amp;1&amp;0&amp;0\\0&amp;0&amp;1&amp;0\\-p_{x}&amp;-p_{y}&amp;-p_{z}&amp;1\end{bmatrix} T1=T(p)=100px010py001pz0001
旋转矩阵
用如下矩阵将一个向量绕着x轴旋转 θ \theta θ弧度。
推导需要用到和差角公式
c o s ( α + β ) = c o s α c o s β − s i n α s i n β cos(\alpha+\beta)=cos\alpha cos\beta-sin\alpha sin\beta cos(α+β)=cosαcosβsinαsinβ
c o s ( α − β ) = c o s α c o s β + s i n α s i n β cos(\alpha-\beta)=cos\alpha cos\beta+sin\alpha sin\beta cos(αβ)=cosαcosβ+sinαsinβ
s i n ( α ± β ) = s i n α c o s β ± c o s α s i n β sin(\alpha\pm\beta)=sin\alpha cos\beta\pm cos\alpha sin\beta sin(α±β)=sinαcosβ±cosαsinβ
**注意:**当沿着旋转轴指向原点的方向观察时,角度是按顺时针方向度量的。
V X ( θ ) = [ x y z 1 ] [ 1 0 0 0 0 c o s θ s i n θ 0 0 − s i n θ c o s θ 0 0 0 0 1 ] = [ x ( y ∗ c o s θ − z ∗ s i n θ ) ( y ∗ s i n θ + z ∗ c o s θ ) 1 ] VX(\theta)=\begin{bmatrix}x&amp;y&amp;z&amp;1\end{bmatrix} \begin{bmatrix}1&amp;0&amp;0&amp;0\\0&amp;cos\theta&amp;sin\theta&amp;0\\0&amp;-sin\theta&amp;cos\theta&amp;0\\0&amp;0&amp;0&amp;1\end{bmatrix}= \begin{bmatrix}x&amp;(y*cos\theta-z*sin\theta)&amp;(y*sin\theta+z*cos\theta)&amp;1\end{bmatrix} VX(θ)=[xyz1]10000cosθsinθ00sinθcosθ00001=[x(ycosθzsinθ)(ysinθ+zcosθ)1]

用如下矩阵将一个向量绕着y轴旋转 θ \theta θ弧度。
V Y ( θ ) = [ x y z 1 ] [ c o s θ 0 − s i n θ 0 0 1 0 0 s i n θ 0 c o s θ 0 0 0 0 1 ] = [ ( x ∗ c o s θ + z ∗ s i n θ ) y ( z ∗ c o s θ − x ∗ s i n θ ) 1 ] VY(\theta)=\begin{bmatrix}x&amp;y&amp;z&amp;1\end{bmatrix} \begin{bmatrix}cos\theta&amp;0&amp;-sin\theta&amp;0\\0&amp;1&amp;0&amp;0\\sin\theta&amp;0&amp;cos\theta&amp;0\\0&amp;0&amp;0&amp;1\end{bmatrix}= \begin{bmatrix}(x*cos\theta+z*sin\theta)&amp;y&amp;(z*cos\theta-x*sin\theta)&amp;1\end{bmatrix} VY(θ)=[xyz1]cosθ0sinθ00100sinθ0cosθ00001=[(xcosθ+zsinθ)y(zcosθxsinθ)1]
用如下矩阵将一个向量绕着z轴旋转 θ \theta θ弧度。
V Z ( θ ) = [ x y z 1 ] [ c o s θ s i n θ 0 0 − s i n θ c o s θ 0 0 0 0 1 0 0 0 0 1 ] = [ ( x ∗ c o s θ − y ∗ s i n θ ) ( x ∗ s i n θ + y ∗ c o s θ ) z 1 ] VZ(\theta)=\begin{bmatrix}x&amp;y&amp;z&amp;1\end{bmatrix} \begin{bmatrix}cos\theta&amp;sin\theta&amp;0&amp;0\\-sin\theta&amp;cos\theta&amp;0&amp;0\\0&amp;0&amp;1&amp;0\\0&amp;0&amp;0&amp;1\end{bmatrix}= \begin{bmatrix}(x*cos\theta-y*sin\theta)&amp;(x*sin\theta+y*cos\theta)&amp;z&amp;1\end{bmatrix} VZ(θ)=[xyz1]cosθsinθ00sinθcosθ0000100001=[(xcosθysinθ)(xsinθ+ycosθ)z1]
比例变换矩阵
如果想让一个向量放大q倍,可令该向量与下面矩阵相乘
V S ( q ) = [ x y z 1 ] [ q x 0 0 0 0 q y 0 0 0 0 q z 0 0 0 0 1 ] = [ ( x ∗ q x ) ( y ∗ q y ) ( z ∗ q z ) 1 ] VS(q)=\begin{bmatrix}x&amp;y&amp;z&amp;1\end{bmatrix} \begin{bmatrix}q_{x}&amp;0&amp;0&amp;0\\0&amp;q_{y}&amp;0&amp;0\\0&amp;0&amp;q_{z}&amp;0\\0&amp;0&amp;0&amp;1\end{bmatrix}= \begin{bmatrix}(x*q_{x})&amp;(y*q_{y})&amp;(z*q_{z})&amp;1\end{bmatrix} VS(q)=[xyz1]qx0000qy0000qz00001=[(xqx)(yqy)(zqz)1]
比例矩阵的逆矩阵可简单的通过对比例向量q取倒数得到
S − 1 = S ( 1 q x , 1 q y , 1 q z ) = [ 1 q x 0 0 0 0 1 q y 0 0 0 0 1 q z 0 0 0 0 1 ] S^{-1}=S(\frac{1}{q_{x}},\frac{1}{q_{y}},\frac{1}{q_{z}})=\begin{bmatrix}\frac{1}{q_{x}}&amp;0&amp;0&amp;0\\0&amp;\frac{1}{q_{y}}&amp;0&amp;0\\0&amp;0&amp;\frac{1}{q_{z}}&amp;0\\0&amp;0&amp;0&amp;1\end{bmatrix} S1=S(qx1,qy1,qz1)=qx10000qy10000qz100001
平面
可用一个向量 n n n和平面上一点 p 0 p_{0} p0来描述一个平面,其中向量 n n n称为平面的法向量,该向量与平面垂直。直线上任意一点p满足下式:
n ⋅ ( p − p 0 ) = 0 n·(p-p_{0})=0 n(pp0)=0
另外,平面更常用的形式为:
0 = n x ∗ p x + n y ∗ p y + n z ∗ p z + d = n ⋅ p + d = 0 0=n_{x}*p_{x}+n_{y}*p_{y}+n_{z}*p_{z}+d=n·p+d=0 0=nxpx+nypy+nzpz+d=np+d=0
该方程主要考察点与平面的关系
n ⋅ p + d = 0 n·p+d=0 np+d=0,则点p在平面上。
n ⋅ p + d &gt; 0 n·p+d&gt;0 np+d>0,则点p位于平面的前方,并处于平面的正半区域。
n ⋅ p + d &lt; 0 n·p+d&lt;0 np+d<0,则点p位于平面的后方,并处于平面的负半区域。
另外,平面上两个不共线向量的叉积也能得出法向量,因此也可求出平面公式。
平面的规范化:
如果要规范化已知平面的法向量,需要注意法向量的模会影响常量d的值,规范化时,必须重新计算d的值。
我们可以将平面看做是4D向量,并将它与所期望的变换矩阵的逆转置相乘来实施变换,注意:平面的法向量必须先规范化。
我们用4D齐次向量来同时表示点和向量。当表示向量时,令w分量为0;表示点时,令w为1。如果w≠0且w≠1,则我们称向量(x,y,z,w)位于齐次空间中,并可令其每个分量除以w而映射到3D空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值