unity3d:向量计算:获得两点连线的垂直向量,判断目标方位(前后左右)

获得两点连线垂直向量

/// <summary>
    /// 获取某向量的垂直向量
    /// </summary>
    public static Vector3 GetVerticalDir(Vector3 _dir)
    {
        //(_dir.x,_dir.z)与(?,1)垂直,则_dir.x * ? + _dir.z * 1 = 0
        if (_dir.z == 0)
        {
            return new Vector3(0, 0, -1);
        }
        else
        {
            return new Vector3(-_dir.z / _dir.x, 0, 1).normalized;
        }
    }

获得向量后,有时要判断目标是在向量的前方,还是后方
1.判断目标在自己的前后方位可以使用下面的方法:

Vector3.Dot(transform.forward, target.position)

   返回值为正时,目标在自己的前方,反之在自己的后方

2.判断目标在机子的左右方位可以使用下面的方法:

Vector3.Cross(transform.forward, target.position).y

  返回值为正时,目标在自己的右方,反之在自己的左方

3.点积和叉积:

A.点积
点积的计算方式为: a·b=|a|·|b|cos<a,b> 其中|a|和|b|表示向量的模,<a,b>表示两个向量的夹角。另外在 点积 中,<a,b>和<b,a> 夹角是不分顺序的。
所以通过点积,我们其实是可以计算两个向量的夹角的。
另外通过点积的计算我们可以简单粗略的判断当前物体是否朝向另外一个物体: 只需要计算当前物体的transform.forward向量与 otherObj.transform.position 的点积即可, 大于0则在前方,否则在后方。

B.叉积
叉积的定义: c =a x b 其中a,b,c均为向量。即两个向量的叉积得到的还是向量!
性质1: c⊥a,c⊥b,即向量c垂直与向量a,b所在的平面 。
性质2: 模长|c|=|a||b|sin<a,b>
性质3: 满足右手法则 。从这点我们有axb ≠ bxa,而axb = – bxa。所以我们可以使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向

猜你喜欢

转载自blog.csdn.net/luoyikun/article/details/88948560