我一直在为一个小游戏编写一个父/子实体系统,当我试图获得一个子对象的位置时,我遇到了问题。
现在,实体的子节点在父节点的坐标空间中被变换,旋转和缩放。这意味着如果我们的父级位于(2,3,0)的位置,并且我们在(1,2,1)的位置向该父级添加子级,则其世界空间为(3,5,1)。
我的问题是我不知道如何从本地空间(1,2,1)转换到全局空间(3,5,1)。
明显的起点是添加父位置和子位置。这适用于非旋转对象。无论何时应用旋转和比例,虽然它会让人感到困惑,这是我无法弄清楚的。
我在某处读到使用矩阵的逆矩阵,但除此之外的解释并不清楚。任何帮助/数学见解/伪代码将不胜感激,谢谢!
答案 0 :(得分: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 );
}
注意:我编写了自己的矩阵实现,所以你如何相乘和提取位置很可能会有所不同。
答案 1 :(得分:0)
这里使用的基本概念是基于矩阵的变化。 使用局部坐标系的轴向量和相对于局部坐标系的坐标,可以得到全局系统的坐标。
a = [a']M
a' - Coordinates wrt local axis
M - Basis matrix formed using vectors of axis
我发现了非常详细解释相同内容的视频。
链接: