用四元数从变换层次中获得世界位置

Get World-Position from Transform-Hierarchy with Quaternions

本文关键字:世界 位置 层次 四元数 变换      更新时间:2023-10-16

我正在编程一个渲染引擎,我正在寻找一个很好的方法来计算我的对象的世界位置。目前我这样做:

Point3f Node::getWorldPosition()
{
   // Return the translation-component of the world matrix as a Point3f
   return getWorldMatrix().getTranslation(); 
}

Mat4f Node::getWorldMatrix()
{
    if (parent == nullptr) //reached root node
        return transform.getTransformationMatrix();
    return parent->getWorldMatrix() * transform.getTransformationMatrix();
}

这工作得很好,但我试图找到一个解决方案而不计算巨大的变换矩阵。首先是这个

Point3f Node::getWorldPosition()
{
    if (parent == nullptr) //reached root node
        return transform.position;
    return parent->getWorldPosition() * transform.position;
}

但我当然忘了考虑旋转,我不知道我怎么能做到这一点。我使用四元数进行旋转。

Thanks in advance

一个不需要计算巨大变换矩阵

的解

没有。

你能得到的最好结果就是缓存矩阵。也就是说,保留为每个节点生成的世界矩阵,直到该节点发生变化或父节点使其无效为止。但是这样的代码可能是困难和脆弱的,因为许多操作可能会使缓存的矩阵无效。记录这些事情是很困难的。

没有神奇的解决方案可以让你生成世界空间信息而不实际生成世界空间。即使您知道节点变换只涉及平移和旋转,您仍然需要累积所有这些旋转和平移。这是大部分的工作;不使用矩阵可能节省的任何小性能都将是:minor.