Unity 把向量归一化的normalized和Normalized的联系和区别【权威】

本文详细介绍了Unity中向量归一化的normalized和Normalized的联系与区别。两者均用于将向量转化为长度为1的单位向量,保持原始方向不变。Normalized是方法,可直接对向量进行操作;而normalize是属性,只能获取归一化后的结果,无法设置。了解这些细节对于准确使用Unity进行3D开发至关重要。

Unity  把向量归一化的normalized和Normalized官方解释:

两者联系:

其实两个方法是一模一样,结果目的都一样,把一个向量拿到或者改变成 归一化向量,所谓归一化就是 把原来某个向量变成 x,y,z平方之和的平方根为1,也就是新向量长度为1.但是!方向与原向量一样!

两者区别: 

一个是方法Normalized(); 他会把一个向量直接变成 长度为一的 单位向量。

ThirdVectorPoint.Normalize(); 注意这是一个函数,一个方法!!!!

一个小写normalize 这是一个属性,只能get 不能set

可以随时获取访问。

### 向量点乘(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); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unity青子

难题的解决使成本节约,求打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值