UnityShader学习02_3D数学基础

3D数学基础

坐标系
模型坐标系:模型自身的坐标系
世界坐标系:物体在空间中的坐标
摄像机坐标系:物体在摄像机位置和方向下的坐标
屏幕投影坐标系:物体在二维屏幕投影下的坐标
向量
二维向量举例

  • 向量相加 ( x 1 , y 1 ) + ( x 2 , y 2 ) = ( x 1 + x 2 , y 1 + y 2 ) (x_1,y_1)+(x_2,y_2)=(x_1+x_2,y_1+y_2) (x1,y1)+(x2,y2)=(x1+x2,y1+y2) 向量头尾相连
  • 向量相减 ( x 1 , y 1 ) − ( x 2 , y 2 ) = ( x 1 − x 2 , y 1 − y 2 ) (x_1,y_1)-(x_2,y_2)=(x_1-x_2,y_1-y_2) (x1,y1)(x2,y2)=(x1x2,y1y2) 减数向量尾指向被减数向量尾
  • 向量乘标量(数乘) a ∗ ( x 1 , y 1 ) = ( a ∗ x 1 , a ∗ y 1 ) a*(x_1,y_1)=(a*x_1,a*y_1) a(x1,y1)=(ax1,ay1)
  • 向量点积(数量积) ( x 1 , y 1 ) ⋅ ( x 2 , y 2 ) = x 1 ∗ x 2 + y 1 ∗ y 2 (x_1,y_1)\cdot(x_2,y_2)=x1*x2+y1*y2 (x1,y1)(x2,y2)=x1x2+y1y2
    • 数形结合 a ⃗ ⋅ b ⃗ = ∣ a ∣ ∗ ∣ b ∣ ∗ c o s θ \vec{a}\cdot\vec{b}=|a|*|b|*cos\theta a b =abcosθ
    • 几何意义: 点积的正负或零<=>角度小于、大于或等于90°
    • 推论 当 a ⃗ \vec{a} a b ⃗ \vec{b} b 都是单位化向量时, θ = a c o s ( a ⃗ ⋅ b ⃗ ) \theta=acos(\vec{a}\cdot\vec{b}) θ=acos(a b )
  • 向量叉积 a ⃗ × b ⃗ = [ i j k x 1 y 1 z 1 x 2 y 2 z 2 ] = ( y 1 z 2 − y 2 z 1 ) i − ( x 1 z 2 − x 2 z 1 ) j + ( x 1 y 2 − x 2 y 1 ) k \vec{a}\times\vec{b}=\left[\begin{matrix} i & j & k \\x_1 & y_1 & z_1 \\x_2 & y_2 & z_2 \end{matrix}\right]=(y_1z_2-y_2z_1)i-(x_1z_2-x_2z_1)j+(x_1y_2-x_2y_1)k a ×b =ix1x2jy1y2kz1z2=(y1z2y2z1)i(x1z2x2z1)j+(x1y2x2y1)k
    • 其中ijk为3个方向向量,当其都是标准化向量时 a ⃗ × b ⃗ = ( y 1 z 2 − y 2 z 1 , z 1 x 2 − z 2 x 1 , x 1 y 2 − x 2 y 1 ) = n ⃗ \vec{a}\times\vec{b}=(y_1z_2-y_2z_1,z_1x_2-z_2x_1,x_1y_2-x_2y_1)=\vec{n} a ×b =(y1z2y2z1,z1x2z2x1,x1y2x2y1)=n
    • 几何意义: n ⃗ \vec{n} n 垂直于 a ⃗ \vec{a} a b ⃗ \vec{b} b 所构成的平面,即成为该平面的法向量
    • 注意:法向量满足左手螺旋法则,即将 a ⃗ \vec{a} a 旋转到 b ⃗ \vec{b} b 看做螺旋, n ⃗ \vec{n} n 为大拇指朝向,因此Unity中叉乘应该为顺时针计算

矩阵

[ m 11 m 12 m 13 m 21 m 22 m 23 m 31 m 32 m 33 ] \left[\begin{matrix} m_{11} & m_{12} & m_{13} \\m_{21} & m_{22} & m_{23} \\m_{31} & m_{32} & m_{33} \end{matrix}\right] m11m21m31m12m22m32m13m23m33

  • 矩阵和标量乘法 λ A = [ λ m 11 λ m 12 λ m 13 λ m 21 λ m 22 λ m 23 λ m 31 λ m 32 λ m 33 ] \lambda A=\left[\begin{matrix} \lambda m_{11} & \lambda m_{12} & \lambda m_{13} \\\lambda m_{21} & \lambda m_{22} & \lambda m_{23} \\\lambda m_{31} & \lambda m_{32} & \lambda m_{33} \end{matrix}\right] λA=λm11λm21λm31λm12λm22λm32λm13λm23λm33

  • 矩阵乘法

    • a对于一个mxn的矩阵 A ( a m n ) A(a_{mn}) A(amn)和nxp的矩阵 B ( b n p ) B(b_{np}) B(bnp),相乘后得到mxp的矩阵 C ( c m p ) C(c_{mp}) C(cmp)
    • c i j = ∑ r = 1 n a i r b r j ( m ≥ i > 0 , p ≥ j > 0 ) c_{ij}=\displaystyle \sum^n_{r=1}{a_{ir}b_{rj}(m\geq i>0,p\geq j>0)} cij=r=1nairbrj(mi>0,pj>0)
    • 不满足交换律,满足结合律和分配律
  • 矩阵转置 A T = [ m 11 m 21 m 31 m 12 m 22 m 32 m 13 m 23 m 33 ] A^T=\left[\begin{matrix} m_{11} & m_{21} & m_{31} \\m_{12} & m_{22} & m_{32} \\m_{13} & m_{23} & m_{33} \end{matrix}\right] AT=m11m12m13m21m22m23m31m32m33

    • 性质1: ( A T ) T = A (A^T)^T=A (AT)T=A
    • 性质2: ( λ A ) T = λ A T (\lambda A)^T=\lambda A^T (λA)T=λAT
    • 性质3: ( A B ) T = B T A T (AB)^T=B^TA^T (AB)T=BTAT
  • 方阵就是行数和列数相等的矩阵

    • 方阵计算方法1:对角线和反对角线法
      ∣ A 3 ∣ = ∣ m 11 m 12 m 13 m 21 m 22 m 23 m 31 m 32 m 33 ∣ = m 11 m 22 m 33 + m 12 m 23 m 31 + m 13 m 21 m 32 − m 13 m 22 m 31 − m 12 m 21 m 33 − m 11 m 23 m 32 |A_3|=\left|\begin{matrix} m_{11} & m_{12} & m_{13} \\m_{21} & m_{22} & m_{23} \\m_{31} & m_{32} & m_{33} \end{matrix}\right|=m_{11}m_{22}m_{33}+m_{12}m_{23}m_{31}+m_{13}m_{21}m_{32}-m_{13}m_{22}m_{31}-m_{12}m_{21}m_{33}-m_{11}m_{23}m_{32} A3=m11m21m31m12m22m32m13m23m33=m11m22m33+m12m23m31+m13m21m32m13m22m31m12m21m33m11m23m32
    • 方阵计算方法2:代数余子式
      余子式: M 12 = [ m 21 m 23 m 31 m 33 ] M_{12}=\left[\begin{matrix} m_{21} & m_{23}\\m_{31} & m_{33} \end{matrix}\right] M12=[m21m31m23m33]
      即Mij为删除第i行第j列元素后剩下元素组成的,阶数-1的方阵
      代数余子式 c 12 = ( − 1 ) 1 + 2 ∣ M 12 ∣ c_{12}=(-1)^{1+2}|M_{12}| c12=(1)1+2M12(注意正负)
      ∣ A m ∣ = ∑ j = 1 m m i j c i j ( i ∈ [ 1 , m ] ) = ∑ i = 1 m m i j c i j ( j ∈ [ 1 , m ] ) |A_{m}|=\displaystyle \sum_{j=1}^m{m_{ij}c_{ij}(i\in[1,m])}=\displaystyle \sum_{i=1}^m{m_{ij}c_{ij}(j\in[1,m])} Am=j=1mmijcij(i[1,m])=i=1mmijcij(j[1,m])
      简而胭脂就是任取某一行/列,计算该行/列上的代数余子式之和
    • 性质1 ∣ M 1 M 2 ∣ = ∣ M 1 ∣ ∣ M 2 ∣ |M_1M_2|=|M_1||M_2| M1M2=M1M2
    • 性质2: ∣ A T ∣ = ∣ A ∣ |A^T|=|A| AT=A
    • 性质3:任意行或列为0,则行列式为0
    • 性质4:交换两行或两列,行列式取反
    • 性质5:任意行/列加上 其他任意行/列的任意倍,行列式不变
  • 矩阵的逆
    A ( A − 1 ) = A − 1 A = I A(A^{-1})=A^{-1}A=I A(A1)=A1A=I

    • 逆矩阵的前提:为方阵、矩阵行列式不为0
    • 计算代数余子式矩阵:
      M = [ c 11 c 12 c 13 c 21 c 22 c 23 c 31 c 32 c 33 ] M=\left[\begin{matrix} c_{11} & c_{12} & c_{13} \\c_{21} & c_{22} & c_{23} \\c_{31} & c_{32} & c_{33} \end{matrix}\right] M=c11c21c31c12c22c32c13c23c33
    • 计算标准伴随矩阵:
      a d j M = M T adjM=M^{T} adjM=MT
    • 计算逆矩阵
      M − 1 = a d j M ∣ M ∣ M^{-1}=\frac{adjM}{|M|} M1=MadjM
    • 性质1 ( M − 1 ) − 1 = M (M^{-1})^{-1}=M (M1)1=M
    • 性质2 I − 1 = I I^{-1}=I I1=I
    • 性质3 ( M − 1 ) T = ( M T ) − 1 (M^{-1})^T=(M^{T})^{-1} (M1)T=(MT)1
    • 性质4 ( A B ) − 1 = B − 1 A − 1 (AB)^{-1}=B^{-1}A^{-1} (AB)1=B1A1
    • 正交矩阵: M − 1 < = > M T M^{ -1}<=>M^T M1<=>MT
      • 仅包含一个方向的旋转的矩阵是正交矩阵

应用

2D旋转
A = [ x y ] A=\left[\begin{matrix} x & y \end{matrix}\right] A=[xy]
顺时针旋转角为α
A ′ = [ x y ] ∗ [ c o s α s i n α − s i n α c o s α ] A'=\left[\begin{matrix} x & y \end{matrix}\right]*\left[\begin{matrix} cos\alpha& sin\alpha \\-sin\alpha &cos\alpha \end{matrix}\right] A=[xy][cosαsinαsinαcosα]
3D旋转
x轴旋转(x,y,z)
[ 1 0 0 0 c o s α s i n α 0 − s i n α c o s α ] \left[\begin{matrix} 1&0&0\\0&cos\alpha& sin\alpha \\0&-sin\alpha &cos\alpha \end{matrix}\right] 1000cosαsinα0sinαcosα
y、z轴旋转同理可知


2D平移(3X3矩阵)
A = [ x y ] A=\left[\begin{matrix} x & y \end{matrix}\right] A=[xy]
平移距离(dx,dy,0)
A ′ = [ x y 1 ] ∗ [ 1 0 0 0 1 0 d x d y 1 ] = [ x + d x y + d y 1 ] A'=\left[\begin{matrix} x & y &1\end{matrix}\right]*\left[\begin{matrix} 1&0&0 \\0&1&0\\dx&dy&1 \end{matrix}\right]= \left[\begin{matrix} x+dx &y+dy &1 \end{matrix}\right] A=[xy1]10dx01dy001=[x+dxy+dy1]
3D平移(4X4矩阵)
A ′ = [ x y z 1 ] ∗ [ 1 0 0 0 0 1 0 0 0 0 1 0 d x d y d z 1 ] = [ x + d x y + d y z + d z 1 ] A'=\left[\begin{matrix} x & y &z&1\end{matrix}\right]*\left[\begin{matrix} 1&0&0&0 \\0&1&0&0\\0&0&1&0\\dx&dy&dz&1 \end{matrix}\right]=\left[\begin{matrix} x+dx &y+dy &z+dz&1 \end{matrix}\right] A=[xyz1]100dx010dy001dz0001=[x+dxy+dyz+dz1]


y轴旋转+3D平移
[ c o s α 0 s i n α 0 0 1 0 0 − s i n α 0 c o s α 0 0 0 0 1 ] ∗ [ 1 0 0 0 0 1 0 0 0 0 1 0 d x d y d z 1 ] = [ c o s α 0 s i n α 0 0 1 0 0 − s i n α 0 c o s α 0 d x d y d z 1 ] \left[\begin{matrix} cos\alpha&0&sin\alpha&0 \\0&1&0&0\\-sin\alpha&0&cos\alpha&0\\0&0&0&1 \end{matrix}\right] *\left[\begin{matrix} 1&0&0&0 \\0&1&0&0\\0&0&1&0\\dx&dy&dz&1 \end{matrix}\right]=\left[\begin{matrix} cos\alpha&0&sin\alpha&0 \\0&1&0&0\\-sin\alpha&0&cos\alpha&0\\dx&dy&dz&1 \end{matrix}\right] cosα0sinα00100sinα0cosα00001100dx010dy001dz0001=cosα0sinαdx010dysinα0cosαdz0001
(3D平移的左上角3X3可以看做是一个单位矩阵,任何矩阵乘单位矩阵等于原矩阵,旋转的矩阵复制过来即可)


缩放矩阵
[ s c a l e x 0 0 0 0 s c a l e y 0 0 0 0 s c a l e z 0 0 0 0 1 ] \left[\begin{matrix} scale_x&0&0&0 \\0&scale_y&0&0\\0&0&scale_z&0\\0&0&0&1 \end{matrix}\right] scalex0000scaley0000scalez00001


透视投影
Py为原位置,忽略掉P’y的正负性,可以得相似三角形的计算,转为矩阵计算
在这里插入图片描述

A ′ = [ 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 ] A'=\left[\begin{matrix} x & y &z&1\end{matrix}\right]*\left[\begin{matrix} 1&0&0&0 \\0&1&0&0\\0&0&1&\frac{1}{d}\\0&0&0&0 \end{matrix}\right]=\left[\begin{matrix} x &y &z&\frac{z}{d} \end{matrix}\right] A=[xyz1]10000100001000d10=[xyzdz]
虽然这里是四元向量,但在摄像机上只能显示两个(x,y),所以需要根据z和d来设置距离信息(x,y)*d/z

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值