2016-07-30 169 views
0

我一直在为小型游戏编写父/子实体系统,并且在尝试获取子对象的位置时遇到问题。将本地坐标转换为全局坐标

现在,实体的孩子在父代的坐标空间中被变换,旋转和缩放。这意味着如果我们的父母在(2,3,0)的位置,并且我们在(1,2,1)的位置向该父母添加了一个孩子,则其世界空间是(3,5,1)。

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

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

我读了一些地方使用矩阵的逆,但超出这一点的解释并不清楚。任何帮助/数学洞察力/伪代码将不胜感激,谢谢!

回答

1

只是想发布这个,以防万一它帮助任何人造成它导致我相当混乱。

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

在下面的例子中,我们可以看到如何从具有和不具有父项的实体的模型矩阵中获取位置。 (其实我不这样做我店单独每个实体的位置,这是你知道有父,需要在世界空间中的位置的实体正好有用。)

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); 
} 

注:我写的我自己的矩阵实现,所以如何乘法和提取位置很可能会有所不同。