返回首页DA系统C#IDE文件同步服务屏保 今天是: 2026-05-05    "立夏"  夏季的第一个节气,表示盛夏时节的正式开始

搜索
热搜: linux 技术
Hi~登录注册
查看: 2323|回复: 0

[原创] 【原创】三角函数点乘、叉乘讲解与实际案例

[复制链接]
发表于 2021-6-26 18:30:37 | 显示全部楼层 |阅读模式
     * 点乘 - Dot  --重点理论课程
     * · 又称“点积”或“内积”。
     * · 公式:各分量乘积和
     *   [x1,y1,z1] · [x2,y2,z2] = x1·x2 + y1·y2 + z1·z2
     * · 几何意义:a·b = |a| · |b| · cos<a,b>
     *   两个向量的单位,向量相乘后再乘以二者夹角的余弦值。
     *   
     * · API:
     *   float DotNum = Vector3.Dot(a, b);
     *   
     * 点乘结果与角度关系
     * · 对于标准化(归一化、向量的方向)过的向量,方向完全相同(夹角为0),点乘结果为1(cos值为1),
     *   方向完全相反(夹角为180°),点乘结果为-1(cos值为-1),方向互相垂直(夹角90°)结果为0(cos值为0)。




     *
     * 点乘的应用
     * · 对于标准化过的向量,点乘结果等于两向量夹角的余弦值。
     * · 应用:计算两向量的夹角。
     *   float DotNum = Vector3.Dot(a.normalized, b.normalized);
     *   CosNum = Mathf.Acos(DotNum) * Mathf.Rad2Deg;

     *   
     * 叉乘 - Cross
     * · 又称“叉积”或“外积”。
     * · 公式:
     *   [x1,y1,z1] x [x2,y2,z2] = [y1 * z2 - z1 * y2,z1 * x2 - x1 * z2,x1 * y2 - y1 * x2]
     * · 几何意义:结果为两个向量所组成面的垂直向量,模长为两向量模长乘积再乘夹角的正弦值。
     * · 脚本:Vector vector = Vector3.Cross(a,b);
     *
     * 应用
     * · 创建垂直于平面的向量。
     * · 判断两条向量相对位置。

     *
     * 点乘和叉乘在游戏的实际运用
     * · 在敌人正前方20米的120度为敌人视觉危险区,超过正前方的20米120度则是安全区
     * · 解题思路:计算敌人的正前方向量方向和玩家减敌人的向量方向,使用点乘计算夹角,小于60°代表已经进入视觉危险区,图例如下:


    public GameObject GameObjPort1;  //点乘、叉乘方法测试语句

    public GameObject GameObjPort2;  //点乘、叉乘方法测试语句

    public float CosNum;             //点乘、叉乘方法测试语句,利用点乘计算的夹角值

    private void Update()
    {
        DotFF();         //点乘、叉乘讲解方法
    }

    //点乘、叉乘讲解方法
    private void DotFF()
    {
        Debug.DrawLine(Vector3.zero, GameObjPort1.transform.position);

        Debug.DrawLine(Vector3.zero, GameObjPort2.transform.position);

        //举例,根据Dot方法,实参传两个向量的方向,即可求出余弦值
        float DotNum = Vector3.Dot(GameObjPort1.transform.position.normalized, GameObjPort2.transform.position.normalized);

        //计算夹角,反余弦值乘以转换为角度即可求出两根向量的夹角角度
        CosNum = Mathf.Acos(DotNum) * Mathf.Rad2Deg;

       //注意:点乘结果转换出来的夹角为计算最小夹角,即范围为0-180° !!
        //注意:Vector3.Dot计算出来的值为-1至1,是两根向量的夹角弧度,如果代码需要优化,则可以使用弧度为单位做类似if判断的作业,
        //可不用反余弦,可以增加计算资源,优化性能!

        //计算叉乘
        Vector3 CroNum = Vector3.Cross(GameObjPort1.transform.position, GameObjPort2.transform.position);
        //判定叉乘的垂直面y轴是否小于0(小于0代表夹角大于180°),是则计算大于180°的夹角
        if (CroNum.y < 0)
        {
            CosNum = 360 - CosNum;
        }

        Debug.DrawLine(Vector3.zero, CroNum);  
    }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
游客
回复
*滑块验证:

DA论坛飞机票来了~
快速回复 返回顶部 返回列表