当前位置:网站首页>3D数学 - 矢量
3D数学 - 矢量
2022-07-23 10:57:00 【有趣就行】
矢量
Vector 在物理上被称为 矢量,在数学上被称为向量。
矢量的定义:是一个既有大小又有方向的量。
表示方式有两种,选一种即可,如下
行向量 : [ a 1 a 2 a 3 ] 列向量 : [ a 1 a 2 a 3 ] (1) 行向量:\left[ \begin{matrix} a_1 & a_2 & a_3 \end{matrix} \right]\tag{1}\\ 列向量:\left[ \begin{matrix} a_1\\ a_2\\ a_3 \end{matrix} \right] 行向量:[a1a2a3]列向量:⎣⎡a1a2a3⎦⎤(1)
在 Unity 中矢量为 Position(位置),它既可以是一个点,用来表示位置,也可以是一个从原点指向某个位置的矢量。
提示:在数学上点和矢量是等价的
零矢量
0 ⃗ = [ 0 0 ⋯ 0 ] \vec{0} =\left[ \begin{matrix} 0 &0 & \cdots & 0 \end{matrix} \right] 0=[00⋯0]
零矢量是一个唯一没有方向的矢量,且大小为0。
负矢量
− v ⃗ = − [ a 1 a 2 ⋯ a n ] = [ − a 1 − a 2 ⋯ − a n ] -\vec{v} = -\left[ \begin{matrix} a_1 & a_2 & \cdots & a_n \end{matrix} \right] = \left[ \begin{matrix} -a_1 & -a_2 & \cdots & -a_n \end{matrix} \right] −v=−[a1a2⋯an]=[−a1−a2⋯−an]
负矢量是产生的是大小相等但方向相反的矢量
标量 与 矢量 的 关系
标量即一个数,它们不可以直接和矢量相加,但可以和矢量相乘。(k 为标量)
k v ⃗ = k [ a 1 a 2 ⋯ a n ] = [ k a 1 k a 2 ⋯ k a n ] k\vec{v}= k \left[ \begin{matrix} a_1 & a_2 & \cdots & a_n \end{matrix} \right] = \left[ \begin{matrix} ka_1 & ka_2 & \cdots & ka_n \end{matrix} \right] kv=k[a1a2⋯an]=[ka1ka2⋯kan]
相乘的结果还是矢量
- k > 0 时,方向不变,大小变为原来的 |k| 倍
- k = 0 时,变成零矢量
- k < 0 时,方向相反,大小变为原来的 |k| 倍
结论:k > 0 方向不变,k < 0 方向相反。大小为原来的 |k| 倍。
在实际开发中,我们经常使用标量与单位矢量相乘,以获得某个方向的对应大小的矢量
标量的除法与乘法类似,不再赘述
矢量大小
矢量的大小也称矢量的长度,即计算矢量从原点到目标位置的距离。
∥ v ⃗ ∥ = ∑ i = 1 n a i 2 = a 1 2 + a 2 2 + ⋯ + a n 2 \begin{Vmatrix}\vec{v}\end{Vmatrix} = \sqrt{\sum_{i = 1}^na_i^2} = \sqrt{a_1^2 + a_2^2 + \cdots + a_n^2} ∥∥v∥∥=i=1∑nai2=a12+a22+⋯+an2
单位矢量
单位矢量是大小为 1 的矢量,**它们在不代表矢量的大小,只代表矢量的方向。**也称归一化向量。
v ^ = v ⃗ ∥ v ⃗ ∥ \widehat{v} = \frac{\vec{v}}{ \begin{Vmatrix} \vec{v} \end{Vmatrix} } v=∥∥v∥∥v
矢量加法 和 减法
矢量之间是可以加减的。
加法:
a ⃗ + b ⃗ = [ a 1 + b 1 a 2 + b 2 ⋯ a n + b n ] \vec{a} + \vec{b} =\left[ \begin{matrix} a_1 + b_1 \\ a_2 + b_2 \\ \cdots \\ a_n + b_n \end{matrix} \right] a+b=⎣⎡a1+b1a2+b2⋯an+bn⎦⎤
矢量相加是满足交换律。且矢量相加的几何意义非常重要。它们不仅仅是值的相加。更重要的是,获得一个矢量 a 以 矢量 b 的方向延申了矢量 b 的大小的矢量。且矢量加法满足三角形法则。
加法非常常用,它们经常用于矢量的移动(如向某个方向走多少距离的情况)
减法:
a ⃗ − b ⃗ = [ a 1 − b 1 a 2 − b 2 ⋯ a n − b n ] \vec{a} - \vec{b} = \left[ \begin{matrix} a_1 - b_1\\ a_2 - b_2\\ \cdots \\ a_n - b_n \end{matrix} \right] a−b=⎣⎡a1−b1a2−b2⋯an−bn⎦⎤
矢量减法是不满足交换律的,也就是说 a - b 和 b - a 是几何意义是不一样的。
a - b 的几何意义是获得一个 b 指向 a 的矢量,且矢量大小就是 a 与 b 的距离,矢量方向就是 b 指向 a 的方向
相反,b - a 的几何意义是获得获得一个 a 指向 b 的矢量,且矢量大小就是 a 与 b 的距离,矢量方向就是 a 指向 b 的方向。
减法经常用于求两个位置的距离,或者是获得两个位置的相对方向。
矢量的 点积 和 叉积
矢量间的乘法有两种,一种是 点积,一种是 叉积。它们之间最重要的区别是,点积的值是标量,叉积的值是矢量。
点积:
a ⃗ ⋅ b ⃗ = ∑ i = 1 n a i b i = a 1 b 1 + a 2 b 2 + ⋯ + a n b n = ∥ a ⃗ ∥ ∥ b ⃗ ∥ cos θ θ 为它们之间的夹角 \vec{a} \cdot \vec{b} = \sum_{i=1}^{n}a_ib_i = a_1b_1 + a_2b_2+\cdots+a_nb_n = \begin{Vmatrix} \vec{a} \end{Vmatrix} \begin{Vmatrix} \vec{b} \end{Vmatrix} \cos{\theta}\\ \theta为它们之间的夹角 a⋅b=i=1∑naibi=a1b1+a2b2+⋯+anbn=∥∥a∥∥∥∥b∥∥cosθθ为它们之间的夹角
点积的几何意义很重要,我们将重点阐述
首先是 投影,作为点积中最重要的特性,通过点积可以轻松求出一个矢量相对于另一个矢量的投影大小。 a ⃗ ⋅ b ^ \vec{a} \cdot \widehat{b} a⋅b 相对于 a ⃗ \vec{a} a 在 b ⃗ \vec{b} b 上的投影的大小。
a ⃗ ⋅ b ^ = ∥ a ⃗ ∥ cos θ \vec{a} \cdot \widehat{b} = \begin{Vmatrix} \vec{a} \end{Vmatrix} \cos{\theta} a⋅b=∥∥a∥∥cosθ
投影获得的是标量,也就是投影的大小,如果想获得投影的矢量,可以在乘以单位矢量。如下
k = a ⃗ ⋅ b ^ = ∥ a ⃗ ∥ cos θ v ⃗ = k b ^ k = \vec{a} \cdot \widehat{b} = \begin{Vmatrix} \vec{a} \end{Vmatrix} \cos{\theta}\\ \vec{v}=k\widehat{b} k=a⋅b=∥∥a∥∥cosθv=kb
上述我们求出的是矢量 a 相对于 矢量 b 上的 水平矢量。我们还可以求矢量 a 相对于矢量 b 的 垂直矢量
a ⃗ = a ∥ + a ⊥ (1) \vec{a} = a_\parallel + a_\perp\tag{1} \\ a=a∥+a⊥(1)
a ∥ = ( a ⃗ ⋅ b ^ ) b ^ (2) a_\parallel = (\vec{a} \cdot \widehat{b})\widehat{b}\tag{2} a∥=(a⋅b)b(2)
a ⊥ = a ⃗ − a ∥ = a ⃗ − ( a ⃗ ⋅ b ^ ) b ^ (3) \begin{aligned} a_\perp &= \vec{a} - a_\parallel\\ &=\vec{a} - (\vec{a} \cdot \widehat{b})\widehat{b} \end{aligned}\tag{3} a⊥=a−a∥=a−(a⋅b)b(3)
这个求水平和垂直投影的公式非常有用。
其次点积还可以粗略判断角度
- a ⃗ ⋅ b ⃗ \vec{a} \cdot \vec{b} a⋅b > 0 为锐角
- a ⃗ ⋅ b ⃗ \vec{a} \cdot \vec{b} a⋅b = 0 为直角
- a ⃗ ⋅ b ⃗ \vec{a} \cdot \vec{b} a⋅b < 0 为钝角
还有一个非常重要的特性是可以求两个向量之间的角度
θ = arccos a ⃗ ⋅ b ⃗ ∥ a ⃗ ∥ ∥ b ⃗ ∥ \theta = \arccos{\frac{\vec{a} \cdot \vec{b}}{\begin{Vmatrix} \vec{a} \end{Vmatrix}\begin{Vmatrix} \vec{b} \end{Vmatrix}}} θ=arccos∥∥a∥∥∥∥b∥∥a⋅b
它可以简化成
θ = arccos ( a ^ ⋅ b ^ ) \theta = \arccos{(\widehat{a} \cdot \widehat{b})} θ=arccos(a⋅b)
叉积(三维):
a ⃗ × b ⃗ = [ i x 1 x 2 j y 1 y 2 k z 1 z 2 ] = [ ( y 1 z 2 − y 2 z 1 ) i ( z 1 x 2 − z 2 x 1 ) j ( x 1 y 2 − x 2 y 1 ) k ] = [ y 1 z 2 − y 2 z 1 z 1 x 2 − z 2 x 1 x 1 y 2 − x 2 y 1 ] \vec{a} \times \vec{b} = \left[ \begin{matrix} i & x_1 & x_2\\ j & y_1 & y_2\\ k & z_1 & z_2 \end{matrix} \right] = \left[ \begin{matrix} (y_1z_2-y_2z_1)i\\ (z_1x_2 -z_2x_1)j\\ (x_1y_2-x_2y_1)k \end{matrix} \right] = \left[ \begin{matrix} y_1z_2-y_2z_1\\ z_1x_2 -z_2x_1\\ x_1y_2-x_2y_1 \end{matrix} \right] a×b=⎣⎡ijkx1y1z1x2y2z2⎦⎤=⎣⎡(y1z2−y2z1)i(z1x2−z2x1)j(x1y2−x2y1)k⎦⎤=⎣⎡y1z2−y2z1z1x2−z2x1x1y2−x2y1⎦⎤
i = [ 1 0 0 ] j = [ 0 1 0 ] k = [ 0 0 1 ] i = \left[ \begin{matrix} 1 & 0 & 0 \end{matrix} \right]\; j = \left[ \begin{matrix} 0 & 1 & 0 \end{matrix} \right]\; k = \left[ \begin{matrix} 0 & 0 & 1 \end{matrix} \right] i=[100]j=[010]k=[001]
叉积所得结果为矢量,其获得的矢量为**两个矢量组成的平面的法向量。**这也是叉积最重要的用途,获得两个矢量组成平面的法向量。
叉积的其他公式
∥ a ⃗ × b ⃗ ∥ = ∥ a ⃗ ∥ ∥ b ⃗ ∥ sin θ \begin{Vmatrix} \vec{a} \times \vec{b} \end{Vmatrix} = \begin{Vmatrix} \vec{a} \end{Vmatrix} \begin{Vmatrix} \vec{b} \end{Vmatrix} \sin{\theta} ∥∥a×b∥∥=∥∥a∥∥∥∥b∥∥sinθ
这个公式求的是两个矢量组成的四边形的面积。不过用的比较少。
叉积可以使用右手定则来判断法向量的方向。
同理,可以通过法向量来判断两个矢量是顺时针,还是逆时针
边栏推荐
- Shell script case ---3
- 颜值爆表 Redis官方可视化工具来啦,针不戳
- Application of ERP management system in equipment manufacturing enterprise management
- 7.13web safety operation
- [pyGame practice] playing poker? Win or lose? This card game makes me forget to eat and sleep.
- The landing process of 800V high-voltage fast charging was accelerated, and Junsheng Electronics was designated for the 500million euro project
- Start other independent programs through fmmonitoredprocess in unreal
- 800V高压快充落地进程加快均胜电子获5亿欧元项目定点
- Solve the problem that kotlin writes the Android project compilation report execution failed for task ': app:kaptdebugkotlin'. Exception
- Can multithreading optimize program performance?
猜你喜欢

The official redis visualization tool is coming. The needle doesn't poke
![[pyGame practice] playing poker? Win or lose? This card game makes me forget to eat and sleep.](/img/ba/a174c5daccef7a6ea72c11dad8601d.png)
[pyGame practice] playing poker? Win or lose? This card game makes me forget to eat and sleep.

安全合理用电 收获清凉一“夏”

C语言经典例题-求最少数量钞票

广州举办镇街农产品质量安全监管员大比武

IO流之 字节流 & 字符流

Liunx:浅析vim编辑器基本使用

Can multithreading optimize program performance?

Simulink simulation of ESP three-phase SVPWM controller

第二篇 如何设计一个RBAC权限系统
随机推荐
【Pygame实战】打扑克牌嘛?赢了输了?这款打牌游戏,竟让我废寝忘食。
The landing process of 800V high-voltage fast charging was accelerated, and Junsheng Electronics was designated for the 500million euro project
深入理解L1、L2正则化
Application of ERP management system in equipment manufacturing enterprise management
Part I basic information of the project
Part V Druid data source introduction
RTA一种广告精准投放的新玩法?
800V高压快充落地进程加快均胜电子获5亿欧元项目定点
Part II how to design an RBAC authority system
Deep understanding of L1 and L2 regularization
C语言经典例题-用4×4矩阵显示从1到16的所有整数,并计算每行、每列和每条对角线上的和
Unreal中通过FMonitoredProcess启动其他独立程序
Liunx:浅析vim编辑器基本使用
C语言经典例题-贷款余额
重磅 | CertiK:2022年第二季度Web3.0行业安全报告发布(附PDF下载链接)
C语言经典例题-将输入的两位数转成英文
Redis bloom filter
什么是服务器托管及和虚拟主机的区别
Camera flashlight modification
uniapp路由跳转的六种方式