美文网首页
点积,叉积

点积,叉积

作者: 晓龙酱 | 来源:发表于2017-09-15 19:39 被阅读13次

    点积公式为:

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

    相关文章

      网友评论

          本文标题:点积,叉积

          本文链接:https://www.haomeiwen.com/subject/qndesxtx.html