unity开发中我们要计算角度,判断位置,常用点乘、叉乘、归一化等等,我们看看他们的使用案例
在Unity中的Vector3类提供了Dot()
方法来计算两个向量的点乘。点乘的结果是一个标量值,可以用于判断两个向量的方向关系或者计算投影长度等。
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互相垂直。
Unity中的Vector3类也提供了Cross()
方法来计算两个三维向量的叉乘。叉乘结果是一个新的向量,其方向垂直于原两个向量所在的平面,并遵循右手定则。
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()
方法用于将一个非零向量转换为单位向量,即模长为1但方向保持不变的向量。这对于描述方向而不关心大小的场合非常有用,如光源、观察方向、表面法线等。
Vector3 nonNormalizedVector = new Vector3(3, 4, 5); // 长度不为1的向量
Vector3 normalizedVector = Vector3.Normalize(nonNormalizedVector); // 此时normalizedVector的长度为1
// 在Unity中,例如我们想要获取某个物体朝向的方向,而不关心其速度或力的大小时,就会使用归一化向量。
当然,向量的点乘、叉乘以及归一化在Unity和其他游戏引擎或计算机图形学领域中还有更多的应用:
点乘(Dot Product):
float angleInRadians = Mathf.Acos(Vector3.Dot(normalizedVectorA, normalizedVectorB));
投影长度:如果需要计算一个向量在另一个向量方向上的投影长度,也可以使用点乘。
光照模型:在Phong光照模型中,点乘用于计算表面法线与光线方向的夹角影响漫反射光强。
叉乘(Cross Product):
平面法线:在三维空间中,可以通过两个不共线的向量进行叉乘来获取所在平面的法线向量。
旋转轴:在旋转操作中,确定一个旋转轴通常需要通过两个非平行的方向向量叉乘得到。
力矩计算:在物理学模拟中,计算力对物体产生的力矩需要用到叉乘,即力矢量和力臂(从转动轴到力的作用点)的叉乘。
向量归一化(Normalize):
方向处理:在许多情况下,我们只关心物体的朝向而不关心其速度或大小,这时将速度或加速度向量归一化,就可以得到方向信息。
纹理坐标生成:在某些高级渲染技术如环境映射中,通过归一化的视线方向向量来查询立方体贴图等。
单位向量阵列构建:在构建球形或圆柱形的法线贴图时,需要创建一系列均匀分布的单位向量,这就要用到归一化操作。
总结来说,在Unity开发过程中,点乘、叉乘和归一化是非常基本且实用的操作,广泛应用于碰撞检测、物理模拟、光照计算、相机控制等多个领域。
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(41-50)
————————————————
?最后我们放松一下眼睛