目录
一:点乘(Dot)、叉乘(Cross)
1:点乘(Dot)
2:叉乘(Cross)
二:利用这个计算方位
1:点乘(Dot)
2:叉乘(Cross)
一:点乘(Dot)、叉乘(Cross)
1:点乘(Dot)
- 代数公式:a·b=|a|·|b|cos<a,b> 其中|a|和|b|表示向量的模
- 几何意义:a·b代表向量b在向量a向量方向上的投影
- Unity函数Vector3.Dot(a, b)
- 反余弦Mathf.Acos(),返回值是弧度,弧度和角度的转换可以使用 角度= 弧度 * Mathf.Rad2Deg
-
点积大于0则两个向量夹角小于90度,否则两个向量的夹角大于90度,可以用于判断朝向是否大致相同
2:叉乘(Cross)
- 代数公式:aXb=|a||b|sin<a,b> 其中|a|和|b|表示向量的模
- 几何意义:aXb结果是一个向量,或者叫法向量,该向量垂直于a和b向量构成的平面,不满足交换率a x b = - b x a。
- Unity函数Vector3.Cross(a, b)
- 反正弦Mathf.Asin()返回值是弧度
-
可以用返回向量的y轴的值判断两个方位,c=aXb,c.y>0代表b 在 a 的顺时针方向,小于0代表b 在 a 的逆时针方向,等于0代表平行
?
二:利用这个计算方位
物体A到物体B的方向是Vector3 dir = bTrans.position - aTrans.position
1:点乘(Dot)
float frontDot= Vector3.Dot(aTrans.forward, dir.normalized);
frontDot>0在前,frontDot<0在后
float rightDot= Vector3.Dot(aTrans.right, dir.normalized);
rightDot>0在右,rightDot<0在左
如果分为前后左右4个方位可以
//前后
if (Math.Abs(frontDot) > Math.Abs(rightDot))
{
return frontDot > 0 ? "前" : "后";
}
else//左右
{
return rightDot > 0 "右" : "左";
}
2:叉乘(Cross)
Vector3 frontCross= Vector3.Cross(aTrans.forward, dir.normalized);//叉乘判断左右:frontCross.y>0在右,frontCross.y<0在左
Vector3 rightCross= Vector3.Cross(aTrans.right, dir.normalized); //叉乘判断前后:rightCross.y>0在后,rightCross.y<0在前
如果分为前后左右4个方位可以
if (Math.Abs(frontCross.y) > Math.Abs(rightCross.y))
{
return frontCross.y > 0 ? "右" : "左";
}
else
{
return rightCross.y > 0 ? "后" : "前";
}
|