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