白泽图

  • 文章
    • Unity渲染
    • Unity项目开发
    • 工具
    • 数学
    • 算法
    • 网站搭建
    • 网络&操作系统
蒋程个人博客
互联网技术经验总结&分享
  1. 首页
  2. Unity渲染
  3. 正文

图形学基础-向量

2020-11-24 1598点热度 0人点赞 0条评论

向量有两个属性  1是长度  2是方向

向量长度(模长) 记作: \(\left \| \vec{a} \right \|=\sqrt{x^{2}+y^{2}+z^{2}}\)

模长为1的向量为单位向量 记作: \(\hat{a}\)

向量的运算

1.相向相加

下图分别为: 平行四边形法   与  三角行法

2.向量相减

向量相减与相加互逆,已知红色 \(\vec{c}\)  和 \(\vec{a}\) 或 \(\vec{b}\) ,则可得另一个向量

3.向量点乘

\(\vec{a}\cdot\vec{b}\)=||\(\vec{a}\)|| ||\(\vec{b}\)|| cosθ

通过这个公式我们可以得

cosθ = \(\frac{\vec{a}\cdot\vec{b} }{||\vec{a}||||\vec{b}||}\)

如果向量a和向量b都是单位向量,则可得

\(\hat{a}\cdot\hat{b}\)=cosθ

3.1向量点乘的作用

3.1.1.算夹角

通过上面的公式,可得到了cosθ的值,然后通过反三角函数arccos,就能得出角度θ,所以通常我们用相量点乘算夹角

3.1.2.算投影

如图,如果向量a与向量b有一个共同的起点,那么我们可以过点乘的方式算出向量b在向量a的上的投影

\(\vec{b}_{\perp}=||\vec{b}_{\perp}||\cdot\hat{a}\)

\(||\vec{b}_{\perp}||=||\vec{b}||\cdot\)cosθ

投影操作可以使我们把一个向量投影到某个坐标系轴上进行旋转计算

3.1.3.判断方向一致性

通过上面两张图可以知道两个向量点乘,

1.  -π/2 < cosθ < π/2 时,值 > 0 说明两个向量大方向一致(点乘结果 > 0)

2.  当π/2 < cosθ < π 时,值 < 0 , 说明两个方向大致相反(点乘结果 < 0)

3.  如果 值= 0,说明两个向量垂直(点乘结果 = 0)

4.  如果 值 越接近1,说明两个向量越越接(夹角越小)  (点乘结果越接近1,两个相向越接近)

3.2向量点乘的数学特性

\(\vec{a}\cdot\vec{b}=\vec{b}\cdot\vec{a}\)

\(\vec{a}\cdot(\vec{b}+\vec{c})=\vec{a}\cdot\vec{b}+\vec{a}\cdot\vec{c}\)

\((k\vec{a})\cdot\vec{b}=\vec{a}\cdot(k\vec{b})=k(\vec{a}\cdot\vec{b})\)

4.向量叉乘


如图,向量a叉乘向量b,可以得到一个垂直于向量a与向量b所在平面一个向量(注意:向量叉乘的结果是一个向量)

记作: \(\vec{c}=\vec{a}\times\vec{b}\)  (向量c为上图中的红色向量)

叉乘基本公式:

\(||\vec{a}\times \vec{b}||=||\vec{a}|| ||\vec{b}||\)sinθ

4.1右手螺旋定则与左手螺旋定则

伸出右手,弯曲四指并伸出大拇指,四指弯曲方向用于模拟向量a到向量b,则大拇指的方向(向上)就是向量a与向量b叉乘的结果

当我们使用向量b叉乘向量b的时候,我们发现大拇指向下,这说明:  \(\vec{a}\times\vec{b}=\vec{b}\times\vec{a}\)

4.2叉乘的作用

4.2.1.算法线

4.2.2.判断左右关系(以下使用右手螺旋)

如果向量a叉乘向量b的结果向量的z值是正的,说明向量a在向量b的右边

如果向量a叉乘向量b的结果向量的z值是负的,说明向量a在向量b的左边

4.3.3.判断一个点是否在三角形的内部

这个方法在光栅化的时候会用到,是个很有用的性质,具体思路如下:

1.向量AB X 向量 AP,结果归一化

2.向量BC X 向量BP, 结果归一化

3.向量CA X 向量CP,结果归一化

4.如果这三个结果都相等,则说明P点在三角形ABC的内部,否则说明不在三角形内部(注意,这里的ABCP四个点也可以是三维空间中的点)


4.3.4.构建坐标系

如果我们有两个单位向量和\(\hat{u}\)和\(\hat{v}\),我们可以通过叉乘并归一化得到\(\hat{w}\)

那么我们可以将空间中的任意一个点用该坐标系进行表示为:

\(\vec{p} = (\vec{p}\cdot\hat{u})\hat{u}+(\vec{p}\cdot\hat{v})\hat{v}+(\vec{p}\cdot\hat{w})\hat{w}\)

这里用到点乘里的投影,原理就是先算p点在坐标系uvw下三个轴的投影向量,然后相加就可以得到原来的向量,另外由于三个向量都是单位向量所以可以直接用点乘得到cosθ||\(\vec{p}\)||,也是为什么大家都使用单位向量构建坐标系,说白了就是方便计算


4.4向量叉乘的数学特性

\(\vec{a}\times\vec{b}=\vec{b}\times\vec{a}\)

\(\vec{a}\times\vec{a}=\vec{0}\)

\(\vec{a}\times(\vec{b}+\vec{c})=\vec{a}\times\vec{b}+\vec{a}\times\vec{c}\)

\(\vec{a}\times(k\vec{b})=k(\vec{a}\times\vec{b})\)


4.5向量叉车的矩阵表示方法

通常我们用列矩阵(3行1列)来表示一个向量

\(\vec{a}\times\vec{b}=\begin{bmatrix}
y_{a}z_{b}-y_{b}z_{a}\\ 
z_{a}x_{b}-x_{b}z_{a}\\ 
x_{a}y_{b}-y_{b}x_{a}\\
\end{bmatrix}\)
其实这个公式我们也不用硬背,这里可以将这个结果看成两个矩阵相乘的结果即可

\(\vec{a}\times\vec{b}=A* b =\begin{bmatrix}
0&-z_{a}&y_{b} \\ 
z_{a}&0&-x_{a}\\ 
-y_{b}&x_{a}&0 
\end{bmatrix}\begin{bmatrix}
x_{b}\\ 
y_{b}\\ 
z_{b}\\
\end{bmatrix}\)


本文参考:https://www.bilibili.com/video/BV1X7411F744?p=2

标签: 向量
最后更新:2020-11-25

蒋程

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

COPYRIGHT © 2023 白泽图. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

登录
注册|忘记密码?