【问题标题】:What does mOffsetMatrix actually do in Assimp?mOffsetMatrix 在 Assimp 中实际上做了什么?
【发布时间】:2018-10-13 02:16:58
【问题描述】:

我很确定 mOffsetMatrix 将顶点从网格空间转换为骨骼空间,这一点证实了这一点 http://assimp.sourceforge.net/lib_html/structai_bone.html

但后来我看到了这个,它说它实际上将顶点从骨骼空间转换到网格空间。 https://github.com/assimp/assimp/pull/1803

现在我很困惑。那么mOffsetMatrix到底是做什么的呢?

【问题讨论】:

    标签: c++ opengl assimp


    【解决方案1】:

    骨骼的offsetMatrix该骨骼在绑定姿势时的全局变换的倒数。换句话说,如果您遍历骨骼/节点层次结构,将每个骨骼/节点的局部变换(Assimp 中的mTransformation)分层应用于其子节点,我们将获得每个骨骼/节点的全局变换。特定骨骼的此矩阵的 等于它的 offsetMatrix。正如这里所暗示的,它可以手动计算——无论如何,它是恒定的,不应该每帧计算。

    “offsetMatrix”这个名称虽然有点令人困惑(类似 inverseBind 会更清楚),但可能来自它的使用。我们用于蒙皮的变换是 (B_keyframe * offsetMatrix),其中 B_keyframe 是骨骼在某个目标位置的全局变换,例如:通过动画剪辑。这种复合变换实际上是一个偏移,从绑定姿势(定义网格顶点的位置)到 B_keyframe。当应用于顶点时,(B_keyframe * offsetMatrix) 会将顶点从绑定位置“移动”到 B_keyframe 转换到的任何位置。
    请注意,如果 B_keyframe 等于绑定变换,例如如上所述从骨架的 mTransformation:s 计算,则 (B_keyframe * offsetMatrix) 是恒等式,并且顶点不会从绑定姿势中的原始位置移动。

    当谈到 offsetMatrix 时,我个人更喜欢“从网格空间到骨骼空间”的定义。为什么?因为 offsetMatrix 的逆矩阵 - (全局)骨骼变换(在绑定姿势) - 最直观地理解为 从骨骼到网格/模型空间的变换。反过来,offsetMatrix 将从网格/模型空间转换为骨骼空间
    对比渲染中的 View 矩阵:它是相机世界变换(T*R)的逆矩阵,一般理解为从世界到视空间的变换。

    【讨论】:

      【解决方案2】:

      这是您问题的答案(来自错误的解决方案):

      这取决于您对转换的看法。如果矩阵 乘法出现在点之后(即点*用点变换 作为“行”向量),那么说它从 “网格空间到骨骼空间”,因为它需要网格空间中的一个点和 输出骨骼空间中的一个点。但是当使用矩阵预乘 正如 assimp 所做的(将 * 点转换为点为“列”向量) 将其视为改变空间本身更有意义, 从“骨骼空间到网格空间”,因此网格空间中的点可以 使用。

      这就是原发者困惑的原因,因为他们在想 与 assimp 如何处理点变换相比,它倒退了。 这可能直接导致他们对锻炼感到困惑 骨骼的变换矩阵,认为这应该是 与 mOffsetMatrix 相同,但实际上是相反的。

      这一切都特别令人困惑,因为 DirectX 使用后乘法, 而 OpenGL 使用预乘法。

      这一切都说了,我希望有人可以更新文档以便 它让每个人都清楚。很难指定 显然没有“官方”的思考方式 事物。我什至无法在任何地方找到它记录 assimp 如何对待 变换矩阵乘法...虽然矩阵符号 在 assimp 文档的“数据结构”页面上使用的暗示 与列向量进行预乘。

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        文档有误。所以我需要更新我们的文档。见issue 1950

        【讨论】:

        • 感谢您的回答。我只是想澄清一些事情。我尝试通过连接从场景->根节点开始的所有 mTransformation 连接到每个有问题的骨骼来计算反向绑定姿势矩阵。我得到的结果与 mOffsetMatrix 不同,据我了解,这不应该。这是预期的吗?
        • 我很想知道这个问题的答案。
        猜你喜欢
        • 2013-06-02
        • 2020-11-21
        • 2015-02-26
        • 2017-06-29
        • 2013-06-13
        • 2021-10-25
        • 2011-08-12
        • 1970-01-01
        • 2010-11-27
        相关资源
        最近更新 更多