【图形学】数学基础之向量(vector)

515 阅读1分钟

基本概念

image.png

向量:表示方向和长度

  • 向量的记号方法a=AB=BA\vec{a}=\vec{AB}=B - A,这里的AABB表示从原点(0,0)出发的向量
  • 直角坐标系中记作A=(xy)A = \begin{pmatrix} x \\ y \end{pmatrix},这里采用1*2矩阵的表示方式,方便
  • 向量的长度(magnitude)a=x2+y2\left\lVert \vec{a} \right\rVert = \sqrt{x^2 + y^2}

单位向量: 长度为1的向量,记作:a^=aa\widehat{a}= {\vec{a} \over \left\lVert \vec{a} \right\rVert}

向量运算 - 点乘(Dot Product)

ab=abcosθ=(xayaza)+(xbybzb)=xaxb+yayb+zazb\vec{a} \cdot \vec{b}= \left\lVert \vec{a} \right\rVert \left\lVert \vec{b} \right\rVert cos \theta = \begin{pmatrix} x_a \\ y_a \\ z_a \end{pmatrix} + \begin{pmatrix} x_b \\ y_b \\ z_b \end{pmatrix} = x_a x_b + y_a y_b + z_a z_b
ab= aTb= (xayaza)(xb yb zb)=(xaxbyaybzazb)\vec{a} \cdot \vec{b}= \vec{a} ^ T \vec{b}= \begin{pmatrix}x_a & y_a & z_a\end{pmatrix}\begin{pmatrix}x_b \\ y_b \\ z_b\end{pmatrix}=\begin{pmatrix}x_ax_b & y_ay_b & z_az_b\end{pmatrix}

在图形学中应用:

  1. 寻找两个向量间的夹角(比如,光源和平面的夹角)
  2. 一个向量到另一个向量的投影
  3. 测量两个方向的接近程度
  4. 分解向量(方向)
  5. 确定 “前”“后”关系
  6. 用一个点和法线向量可以表示一个平面,通过投影知道是否在平面上

向量运算 - 叉乘(Cross Product)

运算:

a×b=absinθ=(yazbybzazaxbxazbxaybyaxb)=Ab=(0zayaza0xayaxa0)(xbybzb)\vec{a} \times \vec{b} = ||\vec{a}||||\vec{b}||sin\theta =\begin{pmatrix}y_az_b - y_bz_a \\z_ax_b - x_az_b \\x_ay_b - y_ax_b \end{pmatrix} =A^*\vec{b} =\begin{pmatrix} 0 & -z_a & y_a \\ z_a & 0 & -x_a \\ -y_a & x_a & 0 \end{pmatrix} \begin{pmatrix} x_b \\ y_b \\ z_b \end{pmatrix}

其中,A=(0zayaza0xayaxa0)A^*= \begin{pmatrix} 0 & -z_a & y_a \\ z_a & 0 & -x_a \\ -y_a & x_a & 0 \end{pmatrix}a\vec{a} 的是对偶矩阵(dual matrix)

性质:

  1. a×a=0\vec{a} \times \vec{a} = \vec{0}
  2. a×(b+c) = a×b+a×c\vec{a} \times (\vec{b} + \vec{c}) = \vec{a} \times \vec{b} + \vec{a} \times \vec{c} (结合律)
  3. (ka)×b = a×(ka)=k×(a×b)(k\vec{a}) \times \vec{b} = \vec{a} \times (k\vec{a})=k \times (\vec{a} \times \vec{b}) (分配律)
  4. a×b=b×a\vec{a} \times \vec{b} = -\vec{b} \times \vec{a} (不满足交换律哦!)

在图形学中应用:

  1. 判断 “左”“右”,某个物体处于另一个物体的左边还是右边

    • A 叉乘 B,如果方向向上表示在右边;如果是方向向下,表示在左边
  2. 判断 “内”“外”,判断点是否在三角形的内部还是外部

    • 通过计算每个顶点到p的向量 和 三条边组成的向量的叉乘
      • 如果是同一方向 -> 在内部
      • 如果不是 -> 在外部
  3. 在任意位置构建正交坐标系(因为叉乘的结果是垂直于叉乘向量的向量),叉乘的结果是生成一个垂直于两个向量的向量,就好比知道垂直的 x-y 就知道 z 了

  4. 计算三角形法线:n=AC×ABAC×AB\vec{n} = \frac{\vec{AC} \times \vec{AB}}{||\vec{AC} \times \vec{AB} ||}

  5. 计算三角形面积:St=12AB×ACS_t = \frac{1}{2} \vec{AB} \times \vec{AC}

  6. 计算四面体(四个顶点 A,B,C,DA,B,C,D)的体积:V=16BACA×DACA×DAV = \frac{1}{6} \vec{BA} \cdot \frac{\vec{CA} \times \vec{DA}}{||\vec{CA} \times \vec{DA}||}