Bootstrap

三维向量点乘、叉乘对于unity中判断移动方向等应用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

当我们在判断物体的移动方向以及朝向时,往往需要对该点的三维向量进行判断,来达到对其数值修改的效果。

更扩大来说,我为啥要去判断去向?那么这个就能应用在对物体的追踪是否相同以及移动方向的demo上。


一、点乘和叉乘的区别

        相信学过线性代数的同学都知道,点乘和叉乘虽然都是两个向量的乘积,但是其最直观的区别就是得到的结果,点乘Dot的结果是一个标量,一个数值,点乘公式为

                                                        a*b=x1x2+y1y2+z1z2

        从几何角度看点乘表示向量a在向量b上的投影长度与向量b模的乘积,即向量a在向量b上的投影长度=|a|cos,a*b=|a||b|cosの;

        叉积Cross又称向量积,结果是一个向量,既有大小又有方向,并且满足右手定制,几何意义:得到的结果垂直于原来的两个向量。

                                                a*b=(y1z2-z1y2,z1x2-x1z2,x1y2-y1x2)

        右手定则中,我们设定大拇指为x轴,食指为y轴,中指即为z轴方向,因此a*b=|a||b|sinの

 

另外叉乘的优先级高于点乘,在计算中需要十分注意。

二、在脚本中定义点乘和叉乘

1.示例

代码如下(示例):

点乘:

//首先定义两个三维向量
Vector3 a=new Vector3(1,2,3);
Vector3 b=new Vector3(2,2,0);

//向量归一化,我们重新定义一个变量来存储它,重新赋值也可以,我这里为了更方便区分
Vector3 v11=a.normalized;
Vector3 v22=b.normalized;

//计算a,b点乘结果
float result=Vector3.Dot(v11,v22);
//反余弦函数获取向量夹角
float radians=Mathf.Acos(result);
float angle= radians*Mathf.Ead2Deg;
//输出
//计算a,b叉乘,输出结果为向量
Vector3 c=Vector3.Cross(v111,v22);
//计算c在正方向坐标轴上的投影长度
Vector3 normal=new Vector3(1,2,3);
normal=normal.normalized;

float vlaue=Vector3.Dot(c,normal);
//点乘为负数时为逆时针
if(vlaue<0)
{
    angle*=-1;
}
print(value);


 


总结

在右手坐标系中
当 value > 0 时,向量a到向量b是逆时针方向, θ 取值范围是 [0, 180)
当 value = 0 时,向量a 与向量b 平行共线, θ 值是 0
当 value < 0 时,向量a到向量b 是顺时针方向, θ 取值范围是 [0, -180)

在左手坐标系中(Unity 使用的是左手坐标系)
当 value > 0 时,向量a到向量b是顺时针方向, θ 取值范围是 [0, 180),
当 value = 0 时,向量a 与向量b 平行共线, θ 值是 0
当 value < 0 时,向量a到向量b是逆时针方向, θ 取值范围是 [0, -180)

我们在读取到相应物体的移动方向时可以对其进行判定,3D向量的应用非常广泛,祝大家成功!

;