向量的定义

从几何上讲,向量就是有方向,有大小的有向线段。

向量的运算

负向量

要得到任意维向量的负向量,只需要简单的将向量每个分量都变负即可。数学表达式:
−[ab...x]=[−a−b...−x]\begin{gathered} -\begin{bmatrix}a\\b\\...\\x\end{bmatrix} = \begin{bmatrix}-a\\-b\\...\\-x\end{bmatrix} \end{gathered}−⎣⎢⎢⎡​ab...x​⎦⎥⎥⎤​=⎣⎢⎢⎡​−a−b...−x​⎦⎥⎥⎤​​

向量大小

向量大小也常被称为向量的长度
也就是向量各分量的平方和的平方根。计算公式如下:
∥v∥=∑i=1nvi2\lVert v \rVert = \sqrt{\sum_{i=1}^n v_{i}^2}∥v∥=i=1∑n​vi2​​

向量与标量的乘法

标量与向量的乘法非常直接,将向量的每个分量都与标量相乘即可。标量与向量乘的顺序并不重要,但经常把标量写在左边,数学表达式为:
k[a1a2...an]=[a1a2..an]k=[ka1ka2...kan]\begin{gathered} k\begin{bmatrix}a_{1}\\a_{2}\\...\\a_{n}\end{bmatrix}= \begin{bmatrix}a_{1}\\a_{2}\\..\\a_{n}\end{bmatrix}k= \begin{bmatrix}ka_{1}\\ka_{2}\\...\\ka_{n}\end{bmatrix} \end{gathered} k⎣⎢⎢⎡​a1​a2​...an​​⎦⎥⎥⎤​=⎣⎢⎢⎡​a1​a2​..an​​⎦⎥⎥⎤​k=⎣⎢⎢⎡​ka1​ka2​...kan​​⎦⎥⎥⎤​​

标准化向量

对任意非零向量vvv,都能计算出一个和vvv方向相同的单位向量vnormv_{norm}vnorm​。这个过程就称为向量的标准化,要标准化向量,将向量除以它的模(大小)即可。
vnorm=v∥v∥,v≠0v_{norm}=\frac {v} {\lVert v \rVert} ,v\not =0vnorm​=∥v∥v​,v​=0
零向量不能被标准化。数学上是不允许的,因为将导致除零。几何上也没有意义,因为零向量没有方向。

向量的加法和减法

如果两个向量的维度相同,那么它们能相加,或相减。结果向量的维度与原向量相同。
向量加法的运算法则很简单,两个向量相加,将对应分量相加即可。
[a1a2...an]+[b1b2...bn]=[a1+b1a2+b2...an+bn]\begin{gathered} \begin{bmatrix}a_1\\a_2\\...\\a_n\end{bmatrix}+ \begin{bmatrix}b_1\\b_2\\...\\b_n\end{bmatrix}= \begin{bmatrix}a_1+b_1\\a_2+b_2\\...\\a_n+b_n\end{bmatrix} \end{gathered} ⎣⎢⎢⎡​a1​a2​...an​​⎦⎥⎥⎤​+⎣⎢⎢⎡​b1​b2​...bn​​⎦⎥⎥⎤​=⎣⎢⎢⎡​a1​+b1​a2​+b2​...an​+bn​​⎦⎥⎥⎤​​
减法解释为加负向量:a−b=a+(−b)a-b=a+(-b)a−b=a+(−b)

一个点到另一个点的向量(减法的应用)

计算一个点到另一个点的位移是一种非常普遍的需求,可以使用向量减法来解决这个问题。
图1展示了怎样用b−ab-ab−a计算aaa到bbb的位移向量。

距离公式

该公式用来计算两点之间的距离。
首先定义距离为两点之间线段的长度。因为向量是有向线段,所以从几何意义上说,两点之间的距离等于从一个点到另一个点的向量的长度。
先计算从a到b的向量d,在3D的情况下:
d=b−a=[bx−axby−aybz−az]\begin{gathered} d=b-a=\begin{bmatrix}b_x-a_x\\b_y-a_y\\b_z-a_z\end{bmatrix} \end{gathered} d=b−a=⎣⎡​bx​−ax​by​−ay​bz​−az​​⎦⎤​​
a到b的距离等于向量d的长度:
距离(a,b)=∥d∥=(bx−ax)2+(by−ay)2+(bz−az)2距离(a,b)=\lVert d \rVert = \sqrt{(b_x-a_x)^2+(b_y-a_y)^2+(b_z-a_z)^2} 距离(a,b)=∥d∥=(bx​−ax​)2+(by​−ay​)2+(bz​−az​)2​
这样就推导出了3D距离公式,2D距离公式也很好推导出来:
距离(a,b)=∥b−a∥=(bx−ax)2+(by−ay)2距离(a,b)=\lVert b-a \rVert = \sqrt{(b_x-a_x)^2+(b_y-a_y)^2} 距离(a,b)=∥b−a∥=(bx​−ax​)2+(by​−ay​)2​

向量点乘

向量点乘就是对应分量乘积的和,其结果是个分量。向量点乘不能省略点乘号。
[a1a2...an]⋅[b1b2...bn]=a1b1+a2b2+...+anbn\begin{gathered} \begin{bmatrix}a_1\\a_2\\...\\a_n\end{bmatrix}\cdot \begin{bmatrix}b_1\\b_2\\...\\b_n\end{bmatrix}=a_1b_1+a_2b_2+...+a_nb_n \end{gathered} ⎣⎢⎢⎡​a1​a2​...an​​⎦⎥⎥⎤​⋅⎣⎢⎢⎡​b1​b2​...bn​​⎦⎥⎥⎤​=a1​b1​+a2​b2​+...+an​bn​​
用连加符号简写:
a⋅b=∑i=1naibia\cdot b=\sum_{i=1}^n a_ib_i a⋅b=i=1∑n​ai​bi​

一般来说,点乘结果描述了两个向量的“相似”程度,点乘结果越大,两向量越相近。
点乘等于向量大小与向量夹角的cos值的积:
a⋅b=∥a∥∥b∥cos⁡θa\cdot b=\lVert a \rVert \lVert b \rVert \cos\theta a⋅b=∥a∥∥b∥cosθ
解得:
θ=arccos⁡(a⋅b∥a∥∥b∥)\theta = \arccos(\frac {a\cdot b} {\lVert a \rVert \lVert b \rVert}) θ=arccos(∥a∥∥b∥a⋅b​)
如果a、b是单位向量,就可以避免上面公式的除法运算:
θ=arccos⁡(a⋅b)\theta = \arccos(a\cdot b) θ=arccos(a⋅b)
如果不需要θ\thetaθ的确切值而只需要a和b的夹角类型,可以只取用点乘结果的符号。

  • 如果a⋅ba\cdot ba⋅b大于0,则0°⩽θ<90°0\degree\leqslant\theta<90\degree0°⩽θ<90°
  • 如果a⋅ba\cdot ba⋅b等于0,则θ=90°\theta = 90\degreeθ=90°
  • 如果a⋅ba\cdot ba⋅b小于0,则90°<θ⩽180°90\degree<\theta\leqslant180\degree90°<θ⩽180°

注意:如果a、b任意一个向量为零,那么a⋅ba\cdot ba⋅b的结果也为零。因此点乘对零向量的解释是,零向量对任意其他向量都垂直。(当然,前面定义零向量平行于或垂直于任意向量那是不对的,因为零向量没有方向。)

向量的投影

给定两个向量v和n,能将v分解成两个分量:v⊥v_{\perp}v⊥​和v∥v_{\parallel}v∥​。它们分别垂直和平行于n,并且满足v=v⊥+v∥v=v_{\perp}+v_{\parallel}v=v⊥​+v∥​。一般称平行分量v∥v_\parallelv∥​为v在n上的投影
我们使用点乘计算投影:

下面我们先求v∥v_\parallelv∥​。观察到v∥v_\parallelv∥​平行于n,它可以表示为:v∥=n∥v∥∥∥n∥v_\parallel=n\frac {\lVert v_\parallel \rVert} {\lVert n \rVert}v∥​=n∥n∥∥v∥​∥​。
因此只要求出v∥v_\parallelv∥​的模就能计算出该投影向量的值了。很幸运,三角分解能帮助我们求出该值:cos⁡θ=∥v∥∥∥v∥\cos\theta=\frac{\lVert v_\parallel \rVert}{\lVert v \rVert}cosθ=∥v∥∥v∥​∥​
cos⁡θ∥v∥=∥v∥∥\cos\theta\lVert v \rVert=\lVert v_\parallel \rVertcosθ∥v∥=∥v∥​∥
将其代入之前的公式:
v∥=ncos⁡θ∥v∥∥n∥=ncos⁡θ∥v∥∥n∥∥n∥2=nv⋅n∥n∥2\begin{gathered} v_\parallel=n\frac {\cos\theta\lVert v \rVert} {\lVert n \rVert} \\=n\frac {\cos\theta\lVert v \rVert\lVert n \rVert} {\lVert n \rVert^2} \\=n\frac{v\cdot n}{\lVert n \rVert^2} \end{gathered} v∥​=n∥n∥cosθ∥v∥​=n∥n∥2cosθ∥v∥∥n∥​=n∥n∥2v⋅n​​
当然,如果是n单位向量,那除法就没必要了
知道了v∥v_\parallelv∥​,求v⊥v_\perpv⊥​就很容易了,如下:
v⊥+v∥=vv⊥=v−v∥=v−nv⋅n∥n∥2v_\perp+v_\parallel = v \\v_\perp=v-v_\parallel \\=v-n\frac{v\cdot n}{\lVert n \rVert^2} v⊥​+v∥​=vv⊥​=v−v∥​=v−n∥n∥2v⋅n​

向量的叉乘

另一种向量乘法称作叉乘或叉积,尽可应用于3D向量
术语叉乘来自记法a×ba\times ba×b中的叉号。
叉乘的公式为:
[x1y1z1]×[x2y2z2]=[y1z2−z1y2z1x2−x1z2x1y2−y1x2]\begin{bmatrix}x_1\\y_1\\z_1\end{bmatrix}\times\begin{bmatrix}x_2\\y_2\\z_2\end{bmatrix}=\begin{bmatrix}y_1z_2-z_1y_2\\z_1x_2-x_1z_2\\x_1y_2-y_1x_2\end{bmatrix} ⎣⎡​x1​y1​z1​​⎦⎤​×⎣⎡​x2​y2​z2​​⎦⎤​=⎣⎡​y1​z2​−z1​y2​z1​x2​−x1​z2​x1​y2​−y1​x2​​⎦⎤​
当点乘和叉乘放在一起时,叉乘优先计算,因为点乘返回一个标量,同时标量和向量之间不能叉乘。
向量叉乘不满足交换律,满足反交换律:
a×b=−(b×a)a\times b=-(b\times a)a×b=−(b×a)
叉乘也不满足结合律。

几何解释

叉乘得到的向量垂直于原来的两个向量。

图中,向量a和b在一个平面中。向量a×ba\times ba×b指向该平面的正上方,垂直于a和b。
a×ba\times ba×b的长度等于向量的大小与向量夹角sin值的积,如下:
∥a×b∥=∥a∥∥b∥sin⁡θ\lVert a\times b\rVert=\lVert a\rVert\lVert b\rVert\sin\theta∥a×b∥=∥a∥∥b∥sinθ
可以看到,∥a×b∥\lVert a\times b\rVert∥a×b∥也等于以a和b为两边的平行四边形的面积。

如果a、b平行或任意一个为0,则a×b=0a\times b=0a×b=0。叉乘对零向量的解释为:它平行于任意其他向量。(当然,前面定义零向量平行于或垂直于任意向量那是不对的,因为零向量没有方向。)

已经证明了a×ba\times ba×b垂直于a、b。但是垂直于a、b有两个方向。那a×ba\times ba×b指向哪个方向呢?通过将a的头和b的尾相接,并检查从a到b是顺时针还是逆时针,能够确定a×ba\times ba×b的方向。

  • 左手坐标系:
    如果a和b呈顺时针,则a×ba\times ba×b指向您。
    如果a和b呈逆时针,则a×ba\times ba×b远离您。

  • 右手坐标系:
    如果a和b呈顺时针,则a×ba\times ba×b远离您。
    如果a和b呈逆时针,则a×ba\times ba×b指向您。

3D数学基础:向量运算相关推荐

  1. 数学基础 —— 向量运算(叉乘)

    向量的叉乘,即求同时垂直两个向量的向量,即c垂直于a,同时c垂直于b(a与c的夹角为90°,b与c的夹角为90°) c =  a×b = (a.y*b.z-b.y*a.z , b.x*a.z-a.x* ...

  2. Unity 3D数学 — 向量运算

    向量(又称适量)是游戏开发中非常重要的概念.是用于描述具有方向和大小两个属性的物理量. 在数学里有大小和方向的量就是向量.在几何中,向量可以用一段有方向的线段表示. 1.向量的运算 (1)加减法:向量 ...

  3. [Unity3D学习]3D数学基础之向量

    [Unity3D学习]3D数学基础之向量 2014.05.11 向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础. 一.向量 1.向量的数学定义 向量就是一个数字列表,对于程序员来说一个向量 ...

  4. 《3D数学基础》系列视频 1.5 向量的夹角

    理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...

  5. 《3D数学基础系列视频》1.1向量基本概念

    今天带来的是系列最新视频,关于向量的内容 本次视频,主要讲解一下向量的基本概念. 国内网盘: http://pan.baidu.com/s/1c0ldm5U 苹果iTunes U注册代码: 1班:EF ...

  6. 《3D数学基础》实践1 向量类代码分析

    理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...

  7. 3D数学读书笔记——向量运算及在c++上的实现

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/24782661 开始之前:接 ...

  8. 3d数学基础学习总结

    3d数学基础目录 第1章 简介 1.1 什么是3D数学 1.2 为什么选择本书 1.3 阅读本书需要的基础知识 1.4 概览 第2章 笛卡尔坐标系统 2.1 1D数学 2.2 2D笛卡尔数学 2.3 ...

  9. 3D Math Primer for Graphics and Game Development -- 图形与游戏开发(3D数学基础) (简介)...

    3D Math Primer for Graphics and Game Development //z 2014-04-28 13:18:20 L.247'38500 BG57IV3@XCL T20 ...

  10. 3d数学基础:图形和游戏开发(第2版)_游戏引擎编程需要哪些基本数学知识?

    现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...

最新文章

  1. Java 技术篇 - 连接oracle数据库执行sql使用close()关闭createStatement()无效无法清除游标缓存问题解决,报“ORA-01000: 超出打开游标的最大数“错误解决方法
  2. 虚拟函数的静态决议 和 RTTI 小例子
  3. 【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)
  4. 电信业务分类目录2019_2019年1月国内增值电信业务许可情况分析报告,市场区域发展不均衡...
  5. linux7.3ssh登陆不上,centos7.3升级openssh到7.7p1后root用户无法登陆的问题
  6. Linux安装SmartSVN及破解
  7. mysql主键和外键的连接_MySQL主键和外键使用及说明
  8. 1047 : 对数表
  9. oracle primavera p6 破解版,P6项目管理软件下载 Primavera P6 Professional(项目管理软件) 16.1 免费安装版(附安装教程) 下载-脚本之家...
  10. Java 的package 機制 王森
  11. 腾讯产品策划运营类职位笔试题和参考答案
  12. 小米笔记本电脑的SN码如何查找?
  13. 太原市消防工程师培训_关于消防工程师的满满干货
  14. 解决在uniapp项目中小程序调用获取微信绑定手机号
  15. 杂项:Unity3D
  16. 计算机基础及photoshop应用试题,计算机基础及Photoshop应用选择题(计算机一级B考试卷).doc...
  17. Pycharm导入tabula模块包
  18. JAVA程序设计:买卖股票的最佳时机含手续费(LeetCode:714)
  19. TP5 入口文件提到根目录
  20. 矩阵乘法的并行化算法讨论

热门文章

  1. 证券市场的法律法规体系
  2. UA MATH564 概率论 概率不等式
  3. 单包授权(spa)简介
  4. Navicat删除注册表
  5. C语言中abs()用法及其他绝对值函数
  6. 电脑上游戏视频录制的方法
  7. 判断分解的无损连接性和保持函数依赖
  8. 平面设计之PS(前)
  9. 计算机本地连接无internet访问权限,ipv4连接无internet访问权限怎么解决
  10. unity 2021.3.6f1 报错 dependencies manifest(Microsoft.NetCore.App.deps.json)was not found