3D数学基础:向量运算
向量的定义
从几何上讲,向量就是有方向,有大小的有向线段。
向量的运算
负向量
要得到任意维向量的负向量,只需要简单的将向量每个分量都变负即可。数学表达式:
−[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∑nvi2
向量与标量的乘法
标量与向量的乘法非常直接,将向量的每个分量都与标量相乘即可。标量与向量乘的顺序并不重要,但经常把标量写在左边,数学表达式为:
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⎣⎢⎢⎡a1a2...an⎦⎥⎥⎤=⎣⎢⎢⎡a1a2..an⎦⎥⎥⎤k=⎣⎢⎢⎡ka1ka2...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} ⎣⎢⎢⎡a1a2...an⎦⎥⎥⎤+⎣⎢⎢⎡b1b2...bn⎦⎥⎥⎤=⎣⎢⎢⎡a1+b1a2+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−axby−aybz−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} ⎣⎢⎢⎡a1a2...an⎦⎥⎥⎤⋅⎣⎢⎢⎡b1b2...bn⎦⎥⎥⎤=a1b1+a2b2+...+anbn
用连加符号简写:
a⋅b=∑i=1naibia\cdot b=\sum_{i=1}^n a_ib_i a⋅b=i=1∑naibi
一般来说,点乘结果描述了两个向量的“相似”程度,点乘结果越大,两向量越相近。
点乘等于向量大小与向量夹角的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} ⎣⎡x1y1z1⎦⎤×⎣⎡x2y2z2⎦⎤=⎣⎡y1z2−z1y2z1x2−x1z2x1y2−y1x2⎦⎤
当点乘和叉乘放在一起时,叉乘优先计算,因为点乘返回一个标量,同时标量和向量之间不能叉乘。
向量叉乘不满足交换律,满足反交换律:
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数学基础:向量运算相关推荐
- 数学基础 —— 向量运算(叉乘)
向量的叉乘,即求同时垂直两个向量的向量,即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* ...
- Unity 3D数学 — 向量运算
向量(又称适量)是游戏开发中非常重要的概念.是用于描述具有方向和大小两个属性的物理量. 在数学里有大小和方向的量就是向量.在几何中,向量可以用一段有方向的线段表示. 1.向量的运算 (1)加减法:向量 ...
- [Unity3D学习]3D数学基础之向量
[Unity3D学习]3D数学基础之向量 2014.05.11 向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础. 一.向量 1.向量的数学定义 向量就是一个数字列表,对于程序员来说一个向量 ...
- 《3D数学基础》系列视频 1.5 向量的夹角
理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...
- 《3D数学基础系列视频》1.1向量基本概念
今天带来的是系列最新视频,关于向量的内容 本次视频,主要讲解一下向量的基本概念. 国内网盘: http://pan.baidu.com/s/1c0ldm5U 苹果iTunes U注册代码: 1班:EF ...
- 《3D数学基础》实践1 向量类代码分析
理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...
- 3D数学读书笔记——向量运算及在c++上的实现
本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/24782661 开始之前:接 ...
- 3d数学基础学习总结
3d数学基础目录 第1章 简介 1.1 什么是3D数学 1.2 为什么选择本书 1.3 阅读本书需要的基础知识 1.4 概览 第2章 笛卡尔坐标系统 2.1 1D数学 2.2 2D笛卡尔数学 2.3 ...
- 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 ...
- 3d数学基础:图形和游戏开发(第2版)_游戏引擎编程需要哪些基本数学知识?
现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...
最新文章
- Java 技术篇 - 连接oracle数据库执行sql使用close()关闭createStatement()无效无法清除游标缓存问题解决,报“ORA-01000: 超出打开游标的最大数“错误解决方法
- 虚拟函数的静态决议 和 RTTI 小例子
- 【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)
- 电信业务分类目录2019_2019年1月国内增值电信业务许可情况分析报告,市场区域发展不均衡...
- linux7.3ssh登陆不上,centos7.3升级openssh到7.7p1后root用户无法登陆的问题
- Linux安装SmartSVN及破解
- mysql主键和外键的连接_MySQL主键和外键使用及说明
- 1047 : 对数表
- oracle primavera p6 破解版,P6项目管理软件下载 Primavera P6 Professional(项目管理软件) 16.1 免费安装版(附安装教程) 下载-脚本之家...
- Java 的package 機制 王森
- 腾讯产品策划运营类职位笔试题和参考答案
- 小米笔记本电脑的SN码如何查找?
- 太原市消防工程师培训_关于消防工程师的满满干货
- 解决在uniapp项目中小程序调用获取微信绑定手机号
- 杂项:Unity3D
- 计算机基础及photoshop应用试题,计算机基础及Photoshop应用选择题(计算机一级B考试卷).doc...
- Pycharm导入tabula模块包
- JAVA程序设计:买卖股票的最佳时机含手续费(LeetCode:714)
- TP5 入口文件提到根目录
- 矩阵乘法的并行化算法讨论
热门文章
- 证券市场的法律法规体系
- UA MATH564 概率论 概率不等式
- 单包授权(spa)简介
- Navicat删除注册表
- C语言中abs()用法及其他绝对值函数
- 电脑上游戏视频录制的方法
- 判断分解的无损连接性和保持函数依赖
- 平面设计之PS(前)
- 计算机本地连接无internet访问权限,ipv4连接无internet访问权限怎么解决
- unity 2021.3.6f1 报错 dependencies manifest(Microsoft.NetCore.App.deps.json)was not found