53.本地转世界坐标API区别
53.1 题目
Transform中的本地坐标系的方向转换为相对世界坐标系的方向的两个API TransformVector() 和 TransformDirection() 有什么区别?
53.2 深入解析
- TransformDirection 不受缩放影响。
- TransformVector 受缩放影响。
using UnityEngine;
public class TransformExample : MonoBehaviour
{
void Start()
{
// 设置缩放
transform.localScale = new Vector3(2, 2, 2);
// 创建一个本地方向向量
Vector3 localDirection = new Vector3(1, 0, 0);
// 使用 TransformDirection 转换
Vector3 worldDirection = transform.TransformDirection(localDirection);
Debug.Log("TransformDirection 不受缩放影响: " + worldDirection);
// 使用 TransformVector 转换
Vector3 worldVector = transform.TransformVector(localDirection);
Debug.Log("TransformVector 受缩放影响: " + worldVector);
}
}
在这个例子中:
- 我们设置了物体的缩放值为 (2, 2, 2)。
- 创建了一个本地方向向量 (1, 0, 0)。
TransformDirection 和 TransformVector 的打印结果会有所不同:
TransformDirection 不受缩放影响: (1.0, 0.0, 0.0)
TransformVector 受缩放影响: (2.0, 0.0, 0.0)
- TransformDirection 将本地方向 (1, 0, 0) 转换为世界方向,不受缩放影响,因此输出仍然是 (1, 0, 0)。
- TransformVector 将本地方向 (1, 0, 0) 转换为世界向量,受到缩放影响,因此输出是 (2, 0, 0)。
通过这个例子,可以清晰地看到 TransformDirection 和 TransformVector 在处理缩放时的不同。
53.3 答题示例
“在Unity中,
TransformDirection和TransformVector都用于将本地坐标系的方向转换到世界坐标系,但核心区别在于对缩放的处理方式:
TransformDirection:
- 仅考虑旋转和位移,完全忽略缩放的影响;
- 适用于转换纯方向向量(如朝向、法线),因为方向本身不应该随缩放改变;
- 数学上等价于
transform.rotation * direction。TransformVector:
- 会将缩放因素应用到结果中,输出向量的长度会被缩放比例影响;
- 适用于转换具有实际大小意义的向量(如速度、位移增量);
- 数学上等价于
transform.localToWorldMatrix.MultiplyVector(vector)。例如,当物体在X轴上缩放为2时,本地向量
(1, 0, 0)经TransformDirection转换后仍为(1, 0, 0),而TransformVector会输出(2, 0, 0)。实际开发中,若需处理物理碰撞法线(方向)应使用TransformDirection,而处理角色移动距离(位移)则需使用TransformVector。”
53.4 关键词联想
- 坐标系转换(Coordinate System Transformation)
- 旋转矩阵(Rotation Matrix)
- 缩放因子(Scale Factor)
- 向量与方向(Vector vs Direction)
- 法线变换(Normal Transformation)
- 局部到世界矩阵(LocalToWorldMatrix)
- 物理模拟(Physics Simulation)
- 位移计算(Displacement Calculation)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com