欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

点乘与叉乘

最编程 2024-04-29 21:07:13
...

public static Vector3 Cross(Vector3 lhs, Vector3 rhs);
叉乘的物理意义:返回值的y值如果大于0,在右边,如果小于0,在左边。
a向量与b向量的向量积的方向与这两个向量所在平面垂直

public static float Dot(Vector3 lhs, Vector3 rhs);
点乘的物理意义:返回值如果大于0,两个向量的夹角小于90度,大于0则大于90度。

点乘的特点
在向量u,向量v非零的前提下,点积如果为负,则u,v形成的角大于90度;
如果为零,那么u,v垂直;
如果为正,那么u,v形成的角小于90度。

1.判断目标在自己的前后方位可以使用下面的方法:

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

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

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

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

  返回值为正时,目标在自己的右方,反之在自己的左方
void Update()
    {
        V1 = p1.position - p0.position;
        V2 = p2.position - p0.position;

        Debug.DrawLine(p1.position, p0.position, Color.magenta);
        Debug.DrawLine(p2.position, p0.position, Color.magenta);
        float f = Vector3.Dot(V1.normalized, V2.normalized);
        Debug.LogFormat("{0} {1}", f, Mathf.Acos(f) * Mathf.Rad2Deg);
    }
点乘也可以求出角度
public bool RectAttackJudge(Transform attacker, Transform attacked, float forwardDistance, float rightDistance)
    {
        Vector3 deltaA = attacked.position - attacker.position;

        float forwardDotA = Vector3.Dot(attacker.forward, deltaA);

        if (forwardDotA > 0 && forwardDotA <= forwardDistance)
        {
            if (Mathf.Abs(Vector3.Dot(attacker.right, deltaA)) < rightDistance)
            {
                return true;
            }
        }
        return false;
    }
标准向量与向量点积,可以获取新向量的长度
bool isInRight = false;
            Vector3 p = Vector3.Cross(transform.forward, dir);
            if (p.y > 0)
            {
                isInRight = true;
            }