基向量 变换矩阵
总结
- **基向量**:描述局部坐标系在全局坐标系中的方向和大小。
- **变换矩阵**:由基向量组成的矩阵,用于将局部坐标转换为全局坐标。
变换矩阵的列向量就是基向量,通过将局部坐标系的基向量组合成变换矩阵,我们可以用矩阵乘法将局部坐标转换为全局坐标。这个过程的几何意义是,变换矩阵包含了描述局部坐标系相对于全局坐标系的所有信息。
在三维引擎中: 节点内的变换矩阵 就是一个 从局部坐标系到全局坐标系的变换矩阵,就是 节点内的子节点坐标(不包括当前节点,当前节点坐标是父节点的本地坐标) 乘以 当前节点的变换矩阵,就能得到 相对于父节点坐标系的坐标,要获得世界坐标,需要递归找到全部的变换矩阵并相乘,再做转换, 引擎的实现代码如下:
Vector3 Node3D::to_global(Vector3 p_local) const {
ERR_READ_THREAD_GUARD_V(Vector3());
return get_global_transform().xform(p_local);
}
Transform3D Node3D::get_global_transform() const {
ERR_FAIL_COND_V(!is_inside_tree(), Transform3D());
uint32_t dirty = _read_dirty_mask();
if (dirty & DIRTY_GLOBAL_TRANSFORM) {
if (dirty & DIRTY_LOCAL_TRANSFORM) {
_update_local_transform(); // Update local transform atomically.
}
Transform3D new_global;
if (data.parent && !data.top_level) {
new_global = data.parent->get_global_transform() * data.local_transform;
} else {
new_global = data.local_transform;
}
if (data.disable_scale) {
new_global.basis.orthonormalize();
}
data.global_transform = new_global;
_clear_dirty_bits(DIRTY_GLOBAL_TRANSFORM);
}
return data.global_transform;
}
公式 𝑈 ⋅ 𝑋 + 𝑉 ⋅ 𝑌 U⋅X+V⋅Y 用于将对象的相对位置(类似于纹理的 UV 坐标)转换为世界坐标。这里的关键是基向量 𝑋 和 𝑌 描述了对象的局部坐标系在世界坐标系中的方向和大小。
坐标变换的原理
https://zpye.github.io/2019/11/17/transform/