我阅读了glTF的github 教程中的Skins部分,但没有理解jointMatrix是如何工作的。
在本教程中,它被定义为
jointMatrix(j) =
globalTransformOfNodeThatTheMeshIsAttachedTo^-1 *
globalTransformOfJointNode(j) *
inverseBindMatrixForJoint(j);我被globalTransform和取消的航班搞糊涂了。在我看来,jointMatrix就像
jointMatrix(j) =
jointSpaceToModelSpace(j) *
jointTransform(j) *
modelSpaceToJointSpace(j);在顶点着色器中
// assume 'joint' is a matrix computed from weighted aggregation of all jointMatrix(j)
vertex_world_space = model-view-proj * joint * vertex_model_space;我的问题是
jointMatrix是这样定义的?发布于 2021-03-17 17:55:01
要记住的一件事是,顶点着色器是在蒙皮网格节点的上下文中执行的,而不是骨架根或关节。这意味着模型视图矩阵可能处于“无意义”的位置:这个皮肤上的节点可能已经被赋予了一个转换,但它不会受到影响,因为它的所有顶点都是由关节控制的。由于这个原因,glTF验证器甚至会警告皮肤节点不是根节点,因为应用到皮肤本身的转换是不操作的。
因此,皮肤中任何特定顶点所需的步骤如下:
这三个步骤对应于教程中列出的三个步骤。
让我们谈谈第三个问题。每个关节都有一个“休息”的位置。例如,手臂骨可能位于皮肤原始形状的左臂(绑定姿势),而腿骨则可能位于右腿。这些骨头不是原处,而是散落在模型周围。但是我们不希望它们在休息的时候拉点,例如,手臂骨头可能在原点的上方和左边,但是当它静止时,不应该拉任何顶点到左边。
因此,每个关节都有一个“逆约束矩阵”,它消除了关节在其自身休息位置上自然会产生的影响。当关节移动时,它相对于自己的休息位置移动,而增量(步骤2和步骤3之间的差异)将被应用于目标顶点。
如果皮肤本身试图移动,什么都不会发生。这样的转换在教程的着色器结束时应用于u_modelViewMatrix,而该转换的逆变换在步骤1中应用,因此它们会抵消掉。如果您想移动整个蒙皮网格,当然正确的方法是重新定位整个骨架,而不是皮肤节点。移动根节点将在步骤2中对网格中的所有顶点应用新的转换。
https://stackoverflow.com/questions/66677427
复制相似问题