基向量 变换矩阵

总结
- **基向量**:描述局部坐标系在全局坐标系中的方向和大小。
- **变换矩阵**:由基向量组成的矩阵,用于将局部坐标转换为全局坐标。

变换矩阵的列向量就是基向量,通过将局部坐标系的基向量组合成变换矩阵,我们可以用矩阵乘法将局部坐标转换为全局坐标。这个过程的几何意义是,变换矩阵包含了描述局部坐标系相对于全局坐标系的所有信息。

在三维引擎中:  节点内的变换矩阵 就是一个 从局部坐标系到全局坐标系的变换矩阵,就是 节点内的子节点坐标(不包括当前节点,当前节点坐标是父节点的本地坐标) 乘以 当前节点的变换矩阵,就能得到 相对于父节点坐标系的坐标,要获得世界坐标,需要递归找到全部的变换矩阵并相乘,再做转换, 引擎的实现代码如下:

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/

posted @ 2024-07-10 09:02  porter_代码工作者  阅读(8)  评论(0编辑  收藏  举报