点积公式为:
A·B = |A| * |B| * cos<A, B>
A·B = Ax·Bx + Ay·By + Az·Bz
再结合余弦曲线可以知道:
当夹角在[0,90], [270, 360]区间内,cosx > 0
当夹角在[90, 270]区间内,cosx < 0
所以:
- 当你跟目标点方向的叉积 > 0 时,说明你面向它;
- 当你跟目标点方向的叉积 < 0 时,说明你背对它。
Vector3 dirA = transform.forward;
Vector3 dirB = target.position - transform.position;
float dp = Vector3.Dot(dirA, dirB);
if(dp > 0)
Debug.Log("target is in the front");
else if(dp < 0)
Debug.Log(target is in the back");
叉积公式为:
// 值为向量,且此向量垂直于dirA,dirB构成的平面
A * B = A * B * sin<A, B>
A * B = (Ay·Bz-Az·By, Az·Bx-AxBz, AxBy-AyBx)
Unity使用左手坐标系,所以:
- 当dirC.y > 0 时,目标点在右侧
- 当dirC.y > 0 时,目标点在左侧
// a的当前朝向
Vector3 vec3Forward = a.transform.TransformDirection(Vector3.forward);
// 目标方向
Vector3 vec3Target = b.transform.transform.position - a.transform.position;
// 计算叉乖
Vector3 vec3Cross = Vector3.Cross( vec3Forward, vec3Target );
// 计算转角
float dAngle = Vector3.Angle( vec3Forward, vec3Target ); // Angle方法始终返回最小角
// 根据左手法则,y向上,说明目标在右边,y向下,说明目标在左边
if( vec3Cross.y > 0 )
{
// 向右转
a.transform.Rotate( cube.transform.up, dAngle )
}
else
{
// 向左转
a.transform.Rotate( cube.transform.up, -dAngle )
}
网友评论