Unity-向量点乘

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

public class Dotstudy : MonoBehaviour
{
    /// <summary>
    /// 学习向量点乘
    /// 业务逻辑:主角前方的向量与每一个怪物的连线构成的向量
    /// 两个向量之间的夹脚可以判断怪物是否在人物前方,如果在前方则可以显示怪物,并让怪物走过来,如果前方没有怪物就无需渲染,节省性能。
    /// 
    /// 程序逻辑:
    /// 1.拿到主角的前方向量A
    /// 2.拿到怪物的当前坐标向量B
    /// 3.算出任务到怪物的方向向量C
    /// 4.点乘A和C 得出一个cos(A和C夹角)的余弦值-一个标量数值=Vector.Doc(A,C)
    /// 5.如果数值大于0,两个向量之间的夹角小于90°,即它们大致指向相同的方向;=0时,两个向量是正交的,即他们的夹角为90°;<0时,两个向量之间的夹角大于90°,即它们大致指向相反方向。
    /// </summary>

    public GameObject _role;
    public GameObject _enemy;

    // Update is called once per frame
    void Update()
    {
        Vector3 roleForw = _role.transform.forward;//主角前方向量
        Vector3 RoleToMonster = _enemy.transform.position - _role.transform.position;

        float dotResult = Vector3.Dot(roleForw, RoleToMonster);
        if (dotResult > 0)
        {
            Debug.Log("夹角<90°,怪物在我的前方");
            _enemy.transform.Translate(-RoleToMonster * 1* Time.deltaTime);
        }
        else if (dotResult == 0)
        {
            Debug.Log("夹角=90°,怪物在我的侧方");
        }
        else
        {
            Debug.Log("夹角>90°,怪物在我的后方");
        }

        Debug.DrawRay(_role.transform.position, roleForw * 1000, Color.red);
        Debug.DrawRay(_role.transform.position, RoleToMonster, Color.red);

        //#region
        //Vector3 roleFront = _role.transform.forward;
        //Vector3 roleToEnemy = (_enemy.transform.position - _role.transform.position).normalized;

        //接下来计算点乘
        //float DotResult = Vector3.Dot(roleFront, roleToEnemy);//点乘计算得出一个夹角余弦值,也就是一个标量
        //Mathf.Cos(60 * Mathf.Deg2Rad);//用来计算60°的余弦值
        //if (DotResult > 0)
        //{
        //    Debug.Log("它们大致指向相同方向");
        //}
        //if (DotResult == 0)
        //{
        //    Debug.Log("它们的夹角为90°");
        //}
        //if (DotResult< 0)
        //{
        //    Debug.Log("它们大致指向相反方向");
        //}


    }//end update
}//end class

### 向量(Dot Product) 向量是一种二元运算,其结果是一个标量。在Unity中,两个向量 **a** 和 **b** 的可以使用 `Vector3.Dot(a, b)` 方法进行计算。的数学定义如下: ``` dot = a.x * b.x + a.y * b.y + a.z * b.z ``` 几何上,也可以通过两个向量之间的夹角 θ 来表示: ``` dot = |a| * |b| * cos(θ) ``` 其中,|a| 和 |b| 分别是向量 **a** 和 **b** 的模长,θ 是它们之间的夹角。该公式表明,的值与两个向量的方向密切相关。如果为正,则夹角小于 90 度;若为零,则两个向量垂直;若为负,则夹角大于 90 度 [^1]。 在游戏开发中,的应用包括但不限于以下场景: - 判断两个物体的相对方向,例如判断玩家是否面向某个目标。 - 计算光照模型中的漫反射强度,根据光源方向和表面法线方向的夹角来决定亮度 [^2]。 ### 向量(Cross Product) 叉是另一种重要的向量运算,其结果是一个向量,而不是标量。Unity 提供了 `Vector3.Cross(a, b)` 方法用于计算两个三维向量的叉。设向量 **a** 和 **b** 的叉结果为 **c**,则 **c** 的方向垂直于 **a** 和 **b** 所构成的平面,并遵循左手坐标系下的左手法则 [^3]。 叉的数学表达式如下: ``` c.x = a.y * b.z - a.z * b.y c.y = a.z * b.x - a.x * b.z c.z = a.x * b.y - a.y * b.x ``` 叉具有以下特-结果向量的大小等于两个原始向量所张成的平行四边形面积。 - 方向由左手法则确定,垂直于原向量所在平面。 常见的应用包括: - 计算一个平面的法线向量- 确定旋转轴,例如在角色动画或物理模拟中。 - 检测两个向量是否共面或者计算三角形的朝向 [^2]。 ### 向量归一化(Normalization) 归一化是指将向量调整为单位长度的过程,即保持方向不变,但模长变为 1。在 Unity 中,可以通过调用 `Normalize()` 方法实现这一操作,或者手动执行以下步骤: ```csharp Vector3 normalizedVector = originalVector / originalVector.magnitude; ``` 其中,`magnitude` 表示向量的模长,计算公式为: ``` |v| = sqrt(v.x² + v.y² + v.z²) ``` 归一化后的向量通常用于描述方向,因为其长度不会影响后续的向量运算,例如在光照计算、物理碰撞响应或相机朝向控制中。此外,在处理运动学问题时,归一化的速度向量可以帮助简化加速度或力的施加逻辑 。 ### 示例代码 以下是一些实际使用 Unity 进行向量运算的代码片段: #### 示例:判断两个物体是否正面相对 ```csharp Vector3 directionToTarget = (target.position - transform.position).normalized; float dotProduct = Vector3.Dot(transform.forward, directionToTarget); if (dotProduct > 0.5f) { Debug.Log("目标位于前方"); } ``` #### 叉示例:计算三角形的法线 ```csharp Vector3 edge1 = vertexB - vertexA; Vector3 edge2 = vertexC - vertexA; Vector3 normal = Vector3.Cross(edge1, edge2).normalized; ``` #### 归一化示例:确保移动方向一致 ```csharp Vector3 movementDirection = new Vector3(inputX, 0, inputZ); movementDirection = movementDirection.normalized; transform.Translate(movementDirection * speed * Time.deltaTime, Space.World); ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值