点积,叉积

点积公式为:

A·B = |A| * |B| * cos  
A·B = Ax·Bx + Ay·By + Az·Bz

再结合余弦曲线可以知道:

点积,叉积_第1张图片

当夹角在[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 = (Ay·Bz-Az·By, Az·Bx-AxBz, AxBy-AyBx) 
点积,叉积_第2张图片

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 )
}

你可能感兴趣的:(点积,叉积)