当前位置:   article > 正文

Unity游戏开发——向量运算(点乘和叉乘)_unity 点乘

unity 点乘

Unity游戏开发——向量运算(点乘和叉乘)

0.前言

在游戏开发中,确定目标得方向,朝向,夹角等相关数据需要用到向量的计算,其中最常用到的就时点乘和叉乘。
因为我们主要研究的是游戏开发中的3D世界向量,所以小面的介绍会以几何定义为主,不研究其代数定义。

1.点乘

定义
点乘又称点积、数量积、标量积。
从几何角度看,点乘是两个向量的长度和它们的夹角余玄值的积。
在这里插入图片描述
从名称和定义来看,点乘的结果是标量。点乘的名称也源自与点乘的运算符号。
在这里插入图片描述
通过上面的公式,我们也可以得到如下公式。
在这里插入图片描述
也就是说如果给定了两个向量,那么我们就可以求出两个向量的夹角。

关于这里的计算需要插播一个点。**当两个单位向量的长度都为1的时候,向量的点乘就是它们夹角的余玄值。**在游戏开发中会有归一化的操作,然后直接求夹角的情况,如果对这个知识点没有了解,可能看不懂夹角计算的原理。
我们通过点积公式可以看出来a,b都是标量,都是正数,余玄值会根据角度有正负变化。
当(0-90)°的始后,余玄值是正数,整个点乘公式都是正的。
当90°的时候,余玄值为0,整个公式为0.
当(90-180)°的时候,余玄值为负数,整个公式为负的。

在Unity中的应用

using UnityEngine;
public class Example : MonoBehaviour
{
    public Transform cubeRed;//敌人
    public Transform cubeBlue;//玩家自身

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            CalculateDot();
        }
    }
    private void CalculateDot()
    {
        //先计算出敌人相对自身的位置信息
        Vector3 relativePosition = cubeRed.position - cubeBlue.position;
        //再使用自身正方向与相对方向两个向量做点乘的相关运算
        Vector3 cubeForward = cubeRed.forward;
        //计算两个向量的点乘
        //如果大于0说明敌人在玩家自身前方
        //如果小于0说明敌人在玩家自身后方
        //如果等于0说明玩家在玩家自身的左右
        float result = Vector3.Dot(cubeForward, relativePosition);
        Debug.Log($"点积的结果:{result}");
        //得到两个向量后,可以直接计算其夹角
        float angle = Vector3.Angle(cubeForward, relativePosition);
        Debug.Log($"两个向量的夹角:{angle}");

        //这是前面说到的当两个向量的长度都为1时,点乘的结果就是夹角的余玄值
        float cos = Vector3.Dot(cubeForward.normalized, relativePosition.normalized);
        Debug.Log($"余玄值:{cos}");
        //通过反余玄函数得到两个向量的角度
        //不过这里得到的时弧度值,并不是角度值
        float radians = Mathf.Acos(cos);
        Debug.Log($"通过余玄值求弧度:{radians}");
        //弧度值通过数据转换成角度值
        angle = radians * Mathf.Rad2Deg;
        Debug.Log($"把弧度转换成角度:{angle}");

    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

得到的结果如图所示,当敌人在自身后方时,点乘的结果小于0,当敌人在自身前方时,点乘的结果大于0。
在这里插入图片描述
在这里插入图片描述

2叉乘

定义

又称叉积、向量积

首先叉乘的结果是向量不是标量。

叉乘的名称也来源于符号
在这里插入图片描述
叉乘的公式定义稍微复杂一点
在这里插入图片描述
叉乘最后的结果是一个向量,大小可以根据公式算出,但是方向要根据右手法则确定。
在这里插入图片描述
实际上Unity中用的是左手坐标系,所以确定方向的时候我们要用左手法则,最后得到的方向正好与右手法则相反。所以两个向量的叉乘并不是一个真向量,它受参照系的影响,这个在以后的计算中要注意我们使用的到底是哪种坐标系。
Unity官方API文档
几何意义

如果以向量a和b为边构成一个平行四边形,那么这两个向量的叉乘的模长与这个平行四边形的面积相等。
在这里插入图片描述
其实这个概念很好理解。我们不考虑叉乘方向的问题,叉乘的模长就是absinθ,其实也就是平行四边形面积公式中的底乘高。

在Unity中的应用

  private void CalculateCross()
    {
        Vector3 relativePosition = cubeRed.position - cubeBlue.position;
        Vector3 cubeForward = cubeBlue.forward;
        Vector3 result = Vector3.Cross(cubeForward, relativePosition);
        Debug.Log(result.y);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

根据左手定则,y轴是法向量的方向,当y大于零的时候,敌人在我方右边,当y小于零的时候,敌人在我方左边。
在实际开发中,我们可以用叉乘来判断最优转向角,根据敌人的方位,判断我们应该向什么方向是最快的。

3总结

简单来说,在两个物体的位置关系判断中。

点乘可以判断出目标物体在我的前方还是后方。大于零在前方,小于零在后方。

叉乘可以判断出目标物体在我的左边还是右边。大于零在右方,小于零在左方。

在计算机图形学中。

点乘可以用来计算夹角余弦值。

叉乘可以用来计算平面法向量。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/100174
推荐阅读
相关标签
  

闽ICP备14008679号