8.Vector3向量叉乘

8.3D数学-Vector3向量-向量叉乘


8.1 知识点

主要学习内容

计算公式

Cross静态方法 计算两个向量的叉乘

Vector3.Cross静态方法用于计算两个向量的叉乘,并返回叉积的结果向量。

  • 参数:两个向量a和b。
  • 返回值:叉积的结果向量,垂直于a和b所在的平面。
Vector3 result = Vector3.Cross(A.position, B.position);
print(result);

几何意义


数学中的叉乘方向使用右手法则。
Unity当中使用左手法则,因为Unity使用的是左手坐标系

// 假设向量 A和B 都在 XZ平面上
// 向量A 叉乘 向量 B 会得到垂直于向量A和向量B所在的平面的向量,又称法向量
// y大于0 证明 B在A右侧
// y小于0 证明 B在A左侧

Vector3 C1 = Vector3.Cross(A.position, B.position);
if (C1.y > 0)
{
    print("B在A的右侧");
}
else
{
    print("B在A的左侧");
}

Vector3 C2 = Vector3.Cross(B.position, A.position);
if (C2.y > 0)
{
    print("A在B的右侧");
}
else
{
    print("A在B的左侧");
}

总结


8.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson08_3D数学_Vector3向量_向量叉乘 : MonoBehaviour
{
    public Transform A;
    public Transform B;
    
    void Start()
    {
        #region 知识点一 叉乘计算

        //Cross静态方法 计算两个向量的叉乘
        //两个向量的叉积。
        print(Vector3.Cross(A.position, B.position));

        #endregion

    }
    
    void Update()
    {
        #region 知识点二 叉乘几何意义
        //假设向量 A和B 都在 XZ平面上
        //向量A 叉乘 向量 B 会得到垂直于向量A和向量B所在的平面的向量 又叫法向量
        //y大于0 证明 B在A右侧
        //y小于0 证明 B在A左侧

        Vector3 C1 = Vector3.Cross(A.position, B.position);
        if (C1.y > 0)
        {
            print("B在A的右侧");
        }
        else
        {
            print("B在A的左侧");
        }

        Vector3 C2 = Vector3.Cross(B.position, A.position);
        if (C2.y > 0)
        {
            print("A在B的右侧");
        }
        else
        {
            print("A在B的左侧");
        }

        #endregion


    }
}

8.3 练习题

判断一个物体B位置再另一个物体A的位置的左上,左下 ,右上,右下哪个方位

计算 A位置向量和AB方向差向量的点乘和叉乘结果

dotResult = Vector3.Dot(A.forward, B.position - A.position);
crossResult = Vector3.Cross(A.forward, B.position - A.position);

根据点乘和叉乘的值判断方位

if (dotResult >= 0)
{
    // 右侧
    if (crossResult.y >= 0)
    {
        print("右前");
    }
    // 左侧
    else
    {
        print("左前");
    }
}
else
{
    // 右侧
    if (crossResult.y >= 0)
    {
        print("右后");
    }
    // 左侧
    else
    {
        print("左后");
    }
}

当一个物体B在物体A左前方20度角或右前方30度范围内,并且离A只有5米距离时,在控制台打印“发现入侵者”

计算叉乘用于判断左边还是右边

crossResult = Vector3.Cross(A.forward, B.position - A.position);

判断距离后再判断左右和角度

// 判断距离
if (Vector3.Distance(A.position, B.position) <= 5)
{
    // 判断角度和左右逻辑
    if (crossResult.y >= 0 && Vector3.Angle(A.forward, B.position - A.position) <= 30 ||
        crossResult.y < 0 && Vector3.Angle(A.forward, B.position - A.position) <= 20)
    {
        print("发现入侵者");
    }
}

8.4 练习题代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson08_练习题 : MonoBehaviour
{

    //拖拽得到AB位置变量
    public Transform A;
    public Transform B;

    //点乘接过和叉乘结果变量
    private float dotResult;
    private Vector3 crossResult;

    void Update()
    {
        #region 练习题一
        //判断一个物体B位置再另一个物体A的位置的左上,左下 ,右上,右下哪个方位

        //计算 A位置向量和AB方向差向量 点乘和叉乘结果
        dotResult = Vector3.Dot(A.forward, B.position - A.position);
        crossResult = Vector3.Cross(A.forward, B.position - A.position);

        //根据点乘和叉乘的值判断前后左右
        if (dotResult >= 0)
        {
            //右侧
            if (crossResult.y >= 0)
            {
                print("右前");
            }
            //左侧
            else
            {
                print("左前");
            }
        }
        else
        {
            //右侧
            if (crossResult.y >= 0)
            {
                print("右后");
            }
            //左侧
            else
            {
                print("左后");
            }
        }

        #endregion

        #region 练习题二
        //当一个物体B在物体A左前方20度角或右前方30度范围内,并且离A只有5米距离时,在控制台打印“发现入侵者”

        //计算叉乘 用于判断左边还是右边
        crossResult = Vector3.Cross(A.forward, B.position - A.position);

        //判断距离
        if (Vector3.Distance(A.position, B.position) <= 5)
        {
            //判断角度和左右逻辑
            if (crossResult.y >= 0 && Vector3.Angle(A.forward, B.position - A.position) <= 30 ||
                crossResult.y < 0 && Vector3.Angle(A.forward, B.position - A.position) <= 20)
            {
                print("发现入侵者");
            }
        }

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏