首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解glTF jointMatrix

理解glTF jointMatrix
EN

Stack Overflow用户
提问于 2021-03-17 16:39:45
回答 1查看 435关注 0票数 1

我阅读了glTF的github 教程中的Skins部分,但没有理解jointMatrix是如何工作的。

在本教程中,它被定义为

代码语言:javascript
复制
jointMatrix(j) =
  globalTransformOfNodeThatTheMeshIsAttachedTo^-1 *
  globalTransformOfJointNode(j) *
  inverseBindMatrixForJoint(j);

我被globalTransform和取消的航班搞糊涂了。在我看来,jointMatrix就像

代码语言:javascript
复制
jointMatrix(j) =
  jointSpaceToModelSpace(j) *
  jointTransform(j) *
  modelSpaceToJointSpace(j);

在顶点着色器中

代码语言:javascript
复制
// assume 'joint' is a matrix computed from weighted aggregation of all jointMatrix(j)
vertex_world_space = model-view-proj * joint * vertex_model_space;

我的问题是

  • 为什么jointMatrix是这样定义的?
  • 我的版本怎么了?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-17 17:55:01

要记住的一件事是,顶点着色器是在蒙皮网格节点的上下文中执行的,而不是骨架根或关节。这意味着模型视图矩阵可能处于“无意义”的位置:这个皮肤上的节点可能已经被赋予了一个转换,但它不会受到影响,因为它的所有顶点都是由关节控制的。由于这个原因,glTF验证器甚至会警告皮肤节点不是根节点,因为应用到皮肤本身的转换是不操作的。

因此,皮肤中任何特定顶点所需的步骤如下:

  1. 撤销皮肤的世界到节点的转换,如果有的话。
  2. 应用关节的世界到联合的转换。
  3. 松开关节的“休息”位置。

这三个步骤对应于教程中列出的三个步骤。

让我们谈谈第三个问题。每个关节都有一个“休息”的位置。例如,手臂骨可能位于皮肤原始形状的左臂(绑定姿势),而腿骨则可能位于右腿。这些骨头不是原处,而是散落在模型周围。但是我们不希望它们在休息的时候拉点,例如,手臂骨头可能在原点的上方和左边,但是当它静止时,不应该拉任何顶点到左边。

因此,每个关节都有一个“逆约束矩阵”,它消除了关节在其自身休息位置上自然会产生的影响。当关节移动时,它相对于自己的休息位置移动,而增量(步骤2和步骤3之间的差异)将被应用于目标顶点。

如果皮肤本身试图移动,什么都不会发生。这样的转换在教程的着色器结束时应用于u_modelViewMatrix,而该转换的逆变换在步骤1中应用,因此它们会抵消掉。如果您想移动整个蒙皮网格,当然正确的方法是重新定位整个骨架,而不是皮肤节点。移动根节点将在步骤2中对网格中的所有顶点应用新的转换。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66677427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档