Unity点乘和叉乘的基本使用

这篇博客介绍了如何在Unity中通过Vector3.Dot和Vector3.Cross方法判断物体间的前后左右方位及计算两者之间的角度。通过点乘可以判断物体相对方向,而叉乘则用于确定顺时针或逆时针旋转。示例代码展示了具体实现过程。
摘要由CSDN通过智能技术生成

//求角度 及前后左右方位  
public void checkTargetDirForMe(Transform target)  
{  
    //xuqiTest:  target.position = new Vector3(3, 0, 5);  
    Vector3 dir = target.position - transform.position; //位置差,方向  
    //方式1   点乘  
    //点积的计算方式为: a·b =| a |·| b | cos < a,b > 其中 | a | 和 | b | 表示向量的模 。  
    float dot = Vector3.Dot(transform.forward, dir.normalized);//点乘判断前后:dot >0在前,<0在后
    float dot1 = Vector3.Dot(transform.right, dir.normalized);//点乘判断左右: dot1>0在右,<0在左
    float angle = Mathf.Acos(Vector3.Dot(transform.forward.normalized, dir.normalized)) * Mathf.Rad2Deg;//通过点乘求出夹角  
  
    //方式2   叉乘  
    //叉乘满足右手准则  公式:模长|c|=|a||b|sin<a,b>    
    Vector3 cross = Vector3.Cross(transform.forward, dir.normalized);//叉乘判断左右:cross.y>0在左,<0在右   
    Vector3 cross1 = Vector3.Cross(transform.right, dir.normalized); //叉乘判断前后:cross.y>0在前,<0在后   
    angle = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(transform.forward.normalized, dir.normalized))) * Mathf.Rad2Deg;  
      
}  

项目中常会用到物体移动,追踪,判断两物体移动方向是否相同,两物体移动方向夹角,以及物体 A 朝 物体 B 顺时针方向还是逆时针方向移动。物体 A 在 物体 B 的前后左右方向。 
下面通过点乘(Dot)、叉乘(Cross), 得到上面的需求结果。

using UnityEngine;
using System.Collections;
 
public class VectorDotCross : MonoBehaviour {
 
    // 关于点积
    private void Dot()
    {
        /*
        点积 
        点积的计算方式为:  a·b=|a|·|b|cos<a,b>  其中|a|和|b|表示向量的模,
        <a,b>表示两个向量的夹角。 通过点积判断当两个向量的方向向是否相同
        (大致相同即两个向量的夹角在 90 度范围内)
        两个向量的 点积 大于 0 则两个向量夹角小于 90 度, 否则 两个向量的
        夹角大于 90 度,
        */
        // 定义两个向量 a、b
        Vector3 a = new Vector3(1, 1, 1);
        Vector3 b = new Vector3(1, 5, 1);
 
        // 计算 a、b 点积结果
        float result = Vector3.Dot(a, b);
 
        // 通过向量直接获取两个向量的夹角(默认为 角度), 此方法范围 [0 - 180]
        float angle = Vector3.Angle(a, b);
 
        // 下面获取夹角的方法,只是展示用法,太麻烦不必使用
        // 通过向量点积获取向量夹角,需要注意,必须将向量转换为单位向量才行
        // 计算 a、b 单位向量的点积
        result = Vector3.Dot(a.normalized, b.normalized);
        // 通过反余弦函数获取 向量 a、b 夹角(默认为 弧度)
        float radians = Mathf.Acos(result);
        // 将弧度转换为 角度
        angle = radians * Mathf.Rad2Deg;
    }
 
 
    // 关于叉乘
    private void Cross()
    {
        /*
          叉积 
          叉积的定义: c = a x b  其中a,b,c均为向量。两个向量的叉积是向量, 向量的模为  |c|=|a||b|sin<a,b>
          且 向量 c 垂直于 a、b, c 垂直于 a、b 组成的平面, a x b = - b x a;
        */
        // 定义两个向量 a、b
        Vector3 a = new Vector3(1, 1, 1);
        Vector3 b = new Vector3(1, 5, 1);
 
        //计算向量 a、b 的叉积,结果为 向量 
        Vector3 c = Vector3.Cross(a, b);
 
        // 下面获取夹角的方法,只是展示用法,太麻烦不必使用
        // 通过反正弦函数获取向量 a、b 夹角(默认为弧度)
        float radians = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized)));
        float angle = radians * Mathf.Rad2Deg;
 
        // 判断顺时针、逆时针方向,是在 2D 平面内的,所以需指定一个平面,下面以X、Z轴组成的平面为例(忽略 Y 轴)
        // 以 Y 轴为纵轴
        // 在 X、Z 轴平面上,判断 b 在 a 的顺时针或者逆时针方向
        if (c.y > 0)
        {
            // b 在 a 的顺时针方向
        }
        else if (c.y == 0)
        {
            // b 和 a 方向相同(平行)
        }
        else
        {
            // b 在 a 的逆时针方向
        }
    }
 
 
    // 获取两个向量的夹角  Vector3.Angle 只能返回 [0, 180] 的值
    // 如真实情况下向量 a 到 b 的夹角(80 度)则 b 到 a 的夹角是(-80)
    // 通过 Dot、Cross 结合获取到 a 到 b, b 到 a 的不同夹角
    private void GetAngle(Vector3 a, Vector3 b)
    {
        Vector3 c = Vector3.Cross(a, b);
        float angle = Vector3.Angle(a, b);
 
        // b 到 a 的夹角
        float sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(a.normalized, b.normalized)));
        float signed_angle = angle * sign;
 
        Debug.Log("b -> a :" + signed_angle);
 
        // a 到 b 的夹角
        sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(b.normalized, a.normalized)));
        signed_angle = angle * sign;
 
        Debug.Log("a -> b :" + signed_angle);
    }
 
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 中,点乘(Dot Product)、叉乘(Cross Product)和投影(Projection)是常用的向量运算。下面我会分别解释它们的含义和用法。 1. 点乘(Dot Product):点乘是两个向量之间的一种运算,结果是一个标量(Scalar)。它可以用来计算两个向量之间的夹角余弦值,还可以判断两个向量是否正交(垂直)或平行。在 Unity 中,可以使用 Vector3.Dot 方法来计算两个三维向量的点乘结果。 示例代码: ```csharp Vector3 a = new Vector3(1, 2, 3); Vector3 b = new Vector3(4, 5, 6); float dotProduct = Vector3.Dot(a, b); ``` 2. 叉乘(Cross Product):叉乘是两个向量之间的一种运算,结果是一个新的向量。它的方向垂直于原始两个向量,并符合右手法则。在 Unity 中,可以使用 Vector3.Cross 方法来计算两个三维向量的叉乘结果。 示例代码: ```csharp Vector3 a = new Vector3(1, 2, 3); Vector3 b = new Vector3(4, 5, 6); Vector3 crossProduct = Vector3.Cross(a, b); ``` 3. 投影(Projection):投影是将一个向量沿着另一个向量的方向进行投影的过程。投影后的结果是一个新的向量,与原始向量垂直。在 Unity 中,可以使用 Vector3.Project 方法来计算一个三维向量在另一个三维向量上的投影结果。 示例代码: ```csharp Vector3 a = new Vector3(1, 2, 3); Vector3 b = new Vector3(4, 0, 0); Vector3 projectedVector = Vector3.Project(a, b); ``` 以上是在 Unity使用点乘叉乘和投影的基本示例。希望对你有所帮助!如果还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值