向量点乘和叉乘在计算机图形学中的应用

196 阅读1分钟

向量点乘和叉乘在计算机图形学中的应用

向量点乘(Dot Product)(内积)

定义:空间中两个向量:a=(x1,y1,z1)\vec{a}=(x_1,y_1,z_1)b=(x2,y2,z2)\vec{b}=(x_2,y_2,z_2)

定义:a\vec{a}b\vec{b}之间的夹角为θ\theta

  1. 代数角度理解:点积是对两个向量对应位置上的值相乘再相加的操作
ab=(x1y1z1)(x2y2z2)=x1x2+y1y2+z1z2 \vec{a} \cdot \vec{b} = \begin{pmatrix} x_1 \\ y_1 \\ z_1 \\ \end{pmatrix} \cdot \begin{pmatrix} x_2 \\ y_2 \\ z_2 \\ \end{pmatrix} = x_1 x_2 + y_1 y_2 + z_1 z_2
  1. 几何角度理解:点积是两个向量的模与它们夹角余弦的积

13381920249677.png

ab=abcosθ \vec{a} \cdot \vec{b} = |\vec{a}||\vec{b}| cos\theta
  1. 推导:

a\vec{a}的终点为A=(x1,y1,z1)A = (x_1,y_1,z_1)

b\vec{b}的终点为B=(x2,y2,z2)B = (x_2,y_2,z_2)

设原点为O(0,0,0)O(0,0,0)

在三角形OABOAB中,根据余弦定理:

313173620237544.png

可得:

AB2=a2+b22abcosθ |\vec{AB}|^2 = |\vec{a}|^2+ |\vec{b}|^2-2|\vec{a}||\vec{b}|cos\theta
a=(x12)+(y12)+(z12) |\vec{a}| = \sqrt{(x_1^2)+ (y_1^2) + (z_1^2)}
b=(x22)+(y22)+(z22) |\vec{b}| = \sqrt{(x_2^2)+ (y_2^2) + (z_2^2)}
AB=(x1x2)2+(y1y2)2+(z1z2)2 |\vec{AB}| = \sqrt{(x_1-x_2)^2+ (y_1-y_2)^2 + (z_1-z_2)^2}

代入得:

abcosθ=x1x2+y1y2+z1z2 |\vec{a}||\vec{b}|cos\theta = x_1 x_2 + y_1 y_2 + z_1 z_2

即:

ab=abcosθ=x1x2+y1y2+z1z2 \vec{a} \cdot \vec{b} = |\vec{a}||\vec{b}|cos\theta = x_1 x_2 + y_1 y_2 + z_1 z_2

  1. 结论:

ab\vec{a} \cdot \vec{b} 点乘的结果表示a\vec{a}b\vec{b}方向上的投影与 b|\vec{b}|的乘积。

反映了两个向量在方向上相似度,结果越大越相似。基于结果可以判断这两个向量是否是同一方向,是否正交垂直。具体对应关系为:

(1) ab\vec{a} \cdot \vec{b} >0,则, a\vec{a}b\vec{b} 方向基本相同,夹角在 00^。9090^。之间。

(2) ab\vec{a} \cdot \vec{b} =0,则, a\vec{a}b\vec{b} 方向垂直。

(3) ab\vec{a} \cdot \vec{b} <0,则, a\vec{a}b\vec{b} 方向基本相反,夹角在 9090^。180180^。之间。


4.点乘的应用:ab\vec{a} \cdot \vec{b}

(1)判断向量在方向上相似度

(2)判断前面(forward)或者后面(backward),如果点积大于0,说明cosθ\cos\theta>0,说明a在前面。

向量叉乘(Cross Product)(外积)(向量积)

定义:空间中两个向量:a=(x1,y1,z1)\vec{a}=(x_1,y_1,z_1)b=(x2,y2,z2)\vec{b}=(x_2,y_2,z_2)

定义:a\vec{a}b\vec{b}之间的夹角为θ\theta

  1. 代数角度理解:
a×b=y1z2z1y2z1x2x1z2x1y2y1x2 \vec{a} \times \vec{b} = (y_1 z_2- z_1 y_2,z_1 x_2-x_1 z_2 ,x_1 y_2-y_1 x_2 )
  1. 几何角度理解:

n\vec{n}a\vec{a}b\vec{b}所构成的平面的单位向量

a×b=absinθn \vec{a} \times \vec{b} = |\vec{a}||\vec{b}| sin\theta * \vec{n}

理解: 运算结果还是一个向量,并且与这两个向量都垂直,可以用右手定则确定方向。

  1. 右手定则:a\vec{a}X b\vec{b},则用四指头从a\vec{a}旋转至 b\vec{b}。大拇指方向所指就是叉乘结果向量的方向。

451630521257710.png

  1. 叉乘的应用:a×b\vec{a}\times \vec{b}

(1)判断a\vec{a}b\vec{b}的左右关系:

a×b\vec{a} \times \vec{b} >0,则 a\vec{a}b\vec{b}的右侧。

(2) 判断点是否在三角形内部:

89172321250379.png

![](vx_images/89172321250379.png =385x)

三角形abc按顺序,逆时针,形成 ab\vec{ab}bc\vec{bc}ca\vec{ca}

以每个顶点为基准:形成 ap\vec{ap}bp\vec{bp}cp\vec{cp}

根据叉乘的性质:右手定则:假设p在三角形内部:则必然 ab\vec{ab}bc\vec{bc}ca\vec{ca} 都在点p的右侧。

则:计算:ab×ap\vec{ab} \times \vec{ap} >0

同理:bc×bp\vec{bc} \times \vec{bp} >0

ca×cp\vec{ca} \times \vec{cp} >0