从局部坐标转换为全局坐标

Convert From Local Coordinates To Global Coordinates

我一直在为一个小游戏编写 Parent/Child 实体系统,但在尝试获取子对象的位置时遇到问题。

就目前而言,实体的子实体在父实体的坐标 space 中进行变换、旋转和缩放。这意味着如果我们的父级位于 ( 2, 3, 0 ) 的位置,并且我们在 ( 1, 2, 1 ) 的位置向该父级添加一个子级,则它的世界 space 是 ( 3, 5 , 1).

我的问题是我不知道如何从本地 space ( 1, 2, 1 ) 转换为全局 space ( 3, 5, 1 )。

显而易见的起点是添加父位置和子位置。这适用于非旋转对象。每当应用旋转和缩放时,它都会变得混乱,这是我无法弄清楚的。

我在某处读到使用逆矩阵,但除此之外的解释不清楚。任何 help/mathematical insight/pseudocode 将不胜感激,谢谢!

只是想post这个以防它对任何人有帮助,因为它让我很困惑。

这其实很简单。您所要做的就是将父实体模型矩阵乘以子实体模型矩阵,然后像这样从底行恢复坐标。

在下面的示例中,我们可以看到我如何从具有和不具有父实体的实体的模型矩阵中获取位置。 (我实际上并没有这样做。我分别存储每个实体的位置。这仅对您知道有父代并且需要在世界中的位置的实体有用 space。)

Vector3f Entity::GetPosition() const {
    Matrix4f matrix;
    if ( GetParent() != 0 ) { 
        matrix = GetParent()->GetModelMatrix() * GetModelMatrix();
    } else {
        matrix = GetModelMatrix();
    }

    float x = matrix[ 3 ][ 0 ];
    float y = matrix[ 3 ][ 1 ];
    float z = matrix[ 3 ][ 2 ];

    return Vector3f( x, y, z );
}

注意:我编写了自己的矩阵实现,因此乘法和提取位置的方式很可能会有所不同。

这里使用的基本概念是改变矩阵的基础。 利用局部坐标系的轴向量和相对于局部坐标系的坐标,可以得到全局坐标系的坐标。

a = [a']M

a' - Coordinates wrt local axis
M  - Basis matrix formed using vectors of axis

我找到了详细解释相同内容的视频。

链接:

1) https://youtu.be/zntNi3-ybfQ

2) https://youtu.be/1j5WnqwMdCk