Unity中向量的点乘、叉乘区别和作用以及经典案例

文章目录

unity开发中我们要计算角度,判断位置,常用点乘、叉乘、归一化等等,我们看看他们的使用案例

点乘(Dot Product)

在Unity中的Vector3类提供了Dot()方法来计算两个向量的点乘。点乘的结果是一个标量值,可以用于判断两个向量的方向关系或者计算投影长度等。

csharp 复制代码
Vector3 vectorA = new Vector3(1, 2, 3);
Vector3 vectorB = new Vector3(4, 5, 6);

float dotProduct = Vector3.Dot(vectorA, vectorB);

// 如果dotProduct > 0,表示vectorA和vectorB大致指向同一方向;
// 如果dotProduct < 0,表示vectorA和vectorB大致指向相反方向;
// 如果dotProduct = 0,表示vectorA和vectorB互相垂直。

叉乘(Cross Product)

Unity中的Vector3类也提供了Cross()方法来计算两个三维向量的叉乘。叉乘结果是一个新的向量,其方向垂直于原两个向量所在的平面,并遵循右手定则。

csharp 复制代码
Vector3 vectorA = new Vector3(1, 0, 0); // 假设是X轴正方向
Vector3 vectorB = new Vector3(0, 1, 0); // 假设是Y轴正方向

Vector3 crossProduct = Vector3.Cross(vectorA, vectorB); // 结果应该是Z轴正方向的单位向量

// 在Unity中,常利用叉乘来计算面法线、旋转轴等信息。

向量归一化(Normalize)

Normalize()方法用于将一个非零向量转换为单位向量,即模长为1但方向保持不变的向量。这对于描述方向而不关心大小的场合非常有用,如光源、观察方向、表面法线等。

csharp 复制代码
Vector3 nonNormalizedVector = new Vector3(3, 4, 5); // 长度不为1的向量

Vector3 normalizedVector = Vector3.Normalize(nonNormalizedVector); // 此时normalizedVector的长度为1

// 在Unity中,例如我们想要获取某个物体朝向的方向,而不关心其速度或力的大小时,就会使用归一化向量。

其他作用

当然,向量的点乘、叉乘以及归一化在Unity和其他游戏引擎或计算机图形学领域中还有更多的应用:

点乘(Dot Product):

  1. 计算角度:通过点乘可以求出两个单位向量之间的夹角余弦值,进而得到角度。例如,在计算物体与光源的照射角度时会用到。
csharp 复制代码
float angleInRadians = Mathf.Acos(Vector3.Dot(normalizedVectorA, normalizedVectorB));
  1. 投影长度:如果需要计算一个向量在另一个向量方向上的投影长度,也可以使用点乘。

  2. 光照模型:在Phong光照模型中,点乘用于计算表面法线与光线方向的夹角影响漫反射光强。

叉乘(Cross Product):

  1. 平面法线:在三维空间中,可以通过两个不共线的向量进行叉乘来获取所在平面的法线向量。

  2. 旋转轴:在旋转操作中,确定一个旋转轴通常需要通过两个非平行的方向向量叉乘得到。

  3. 力矩计算:在物理学模拟中,计算力对物体产生的力矩需要用到叉乘,即力矢量和力臂(从转动轴到力的作用点)的叉乘。

向量归一化(Normalize):

  1. 方向处理:在许多情况下,我们只关心物体的朝向而不关心其速度或大小,这时将速度或加速度向量归一化,就可以得到方向信息。

  2. 纹理坐标生成:在某些高级渲染技术如环境映射中,通过归一化的视线方向向量来查询立方体贴图等。

  3. 单位向量阵列构建:在构建球形或圆柱形的法线贴图时,需要创建一系列均匀分布的单位向量,这就要用到归一化操作。

总结来说,在Unity开发过程中,点乘、叉乘和归一化是非常基本且实用的操作,广泛应用于碰撞检测、物理模拟、光照计算、相机控制等多个领域。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)


​最后我们放松一下眼睛

相关推荐
寂寞的船17 小时前
【Unity Bug挑战】第12期 Awaitable 二次 await 死锁之谜 —— 为什么同一个异步操作等两次就卡死?
unity·c#·游戏引擎·bug
探求虚无2 天前
用 AI 在 Unity 里做一款 RTS:最难的不是生成代码,而是证明它真的能玩
人工智能·unity·游戏引擎
17岁的勇气3 天前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
寂寞的船4 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
Martina_03215 天前
AI生成3D场景的霓虹灯一开就糊成光团?用6步检查Emissive、Bloom与曝光
人工智能·3d·ai·自然语言处理·游戏引擎·材质·贴图
寂寞的船6 天前
【Unity知识速递】第8期 IL2CPP 托管堆内存碎片与原生堆交互机制深度解析
unity·游戏引擎·交互
寂寞的船7 天前
【Unity知识速递】第5期 Unity 6.2 深度解析:AI Assistant 登场,World Space UI 与 Sentis 全面升级
人工智能·ui·unity
寂寞的船7 天前
【Unity知识速递】第4期 MCP for Unity:用 AI 自然语言控制编辑器
人工智能·unity·编辑器
淡海水7 天前
09-04-内存-Unity原生对象生命周期
unity·c#·游戏引擎·gc
寂寞的船7 天前
【Unity知识速递】第6期 URP性能优化完全指南:从内存到GPU的三维调优
unity·性能优化·编辑器