点积和叉积在计算机图形学中,是最为基础且重要的概念,初学者弄清它的概念的应用,是很重要的。最后一节,是为了加强理解记录,如果不看也是可以的,大家选择观看,有兴趣可以去看原视频,结合我的笔记。
前置知识
- 列向量
以下均采用列向量的表示方法,和线性代数书本上的行向量不同,采用列向量表示,则表达为列向量左乘矩阵,只是定义的不同,其他含义没有什么不同。列向量写法如下:
a → = ( x y z ) \overrightarrow{a} = \left( \begin{gathered} \begin{matrix} x \\ y \\ z \end{matrix} \end{gathered} \right) a=⎝⎛xyz⎠⎞ - 单位化
将向量的各分量除以向量的模即得单位向量,单位指模为1的向量。 - 向量加减法的几何意义
- 行列式
行列式在数学中,是一个函数,其定义域为det的矩阵A,取值为一个标量,写作det(A)或 | A | 。行列式可以看做是有向面积(二维)或体积(三维)的概念在一般的欧几里得空间中的推广。
点积
点积在数学中,又称数量积(dot product; scalar product),是指接受在实数R上的两个向量并返回一个实数值标量的二元运算。它是欧几里得空间的标准内积。点积的结果是一个数。
a → ⋅ b → = ∣ a ∣ ∣ b ∣ c o s θ \overrightarrow{a} \cdot \overrightarrow{b} = \left| a \right| \left| b \right| cos {\theta} a⋅b=∣a∣∣b∣cosθ

几何意义

a向量在b向量上投影的长度 乘以 b向量的长度(模)就是 点积的结果。
点乘是存在交换律的,所以也等同于:
b向量在a向量上投影的长度 乘以 a向量的长度就是 点积的结果。
在图形学的应用
- 求两个向量的夹角
当 a → \overrightarrow{a} a与 b → \overrightarrow{b} b都是单位向量(单位化),两个向量点积就是 cos θ \cos {\theta} cosθ,在通过 arccos \arccos arccos 就可以求出夹角。 - 求投影
将 a → \overrightarrow{a} a单位化, a → ⋅ b → \overrightarrow{a} \cdot \overrightarrow{b} a⋅b就是 b → \overrightarrow{b} b在 a → \overrightarrow{a} a上的投影长度。
《计算机图形学》书上有这么一个举例,利用投影将向量w分解成两个向量和:
- 比较两个向量的接近程度(方向上)
也就是向量是否两个向量间的夹角大小,在聚光灯的效果计算中,可以根据点积来得到光照效果,如果点积越大,说明夹角越小,则物体离光照的轴线越近,光照越强。
也常会用来判断两向量是否为同方向:
举个例子
叉积
二维向量的叉积是个标量,看起来违背了定义,先假设二维向量得出来的叉积是z,如果把二维向量看作成z轴值恒为0的三维向量,它们的叉积就 ( 0 , 0 , z ) T (0,0,z)^T (0,0,z)T,三维空间被压缩成了二维,叉积就只是一个标量了。
v → ⋅ w → = x v y w − y v x w \overrightarrow{v} \cdot \overrightarrow{w} = x_vy_w – y_vx_w v⋅w=xvyw−yvxw
三维向量的叉积的结果是个向量:
v → ⋅ w → = ( y v z w − z v y w z v x w − x v z w x v y w − y v x w ) \overrightarrow{v} \cdot \overrightarrow{w} = \left( \begin{gathered} \begin{matrix} y_v z_w – z_v y_w \\ z_vx_w – x_vz_w \\ x_vy_w – y_vx_w \end{matrix} \end{gathered} \right) v⋅w=⎝⎛yvzw−zvywzvxw−xvzwxvyw−yvxw⎠⎞
这个看起来很难记忆,我们随后再讲解。444额方法

几何意义
坐标系的问题
在图形学的应用
- 二维空间判断左右

这个判断又可以衍生出如何判断一条路径存在交叉
2. 三维空间求法向量
法向量在计算图形学的应用很广泛,很多地方都会利用到,比如求已知入射角度 O B → \overrightarrow{OB} OB求一个平面的反射角度 B P → \overrightarrow{BP} BP。取平面上不共线的三个点ABC,求得法线
A B → × A C → = Z → ( 法 线 ) \overrightarrow{AB} \times \overrightarrow{AC} = \overrightarrow{Z} (法线) AB×AC=Z(法线)
B P → = O B → − Z → \overrightarrow{BP} = \overrightarrow{OB} – \overrightarrow{Z} BP=OB−Z
再举个例子
以线性变换去看点乘和叉乘
这部分我是基于B站的一部分的视频总结的,如果觉得作者讲解不够好,可以去看原视频。
点乘
叉乘
先看左边, p → \overrightarrow{p} p与随机变量的点积,其实就随机变量在 p → \overrightarrow{p} p的投影长度,再乘以 p → \overrightarrow{p} p的模。(1)
再看看右边,是一个行列式,表示这三个向量组成的立方体的体积大小。(2)
我们再回顾下,体积的求法,高✖️底面积(u v 组成底面)(3)
高为随机变量在平面垂直方向的投影长度。(4)
由(2)(3)(4)得到右边为 随机变量在平面垂直方向的投影长度,再乘以u v 组成的平面面积(5)
由(1)(5)得到, p → \overrightarrow{p} p为,模长为两向量组成的平面面积,且为这个平面的法线。
这个叉积的几何意义不就是这样的嘛。
字丑的那些图都是我画的,除了一张小手手,请各位见谅,最后感谢我的首席插画师 yc君 画的那种小手手的插图,O(∩_∩)O哈哈~。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202501.html原文链接:https://javaforall.net
