翻译glTF2.0 说明文档Skins这段

ε祈祈猫儿з 提交于 2020-02-25 18:24:50

英文原文

蒙皮

所有蒙皮都存储在资源的皮肤数组中。每个皮肤都由inverseBindMatrices属性定义(该属性指向一个带有IBM数据的访问器),用于将蒙皮坐标变换到每个关节相同的坐标系下; 以及一个关节数组属性,该属性列出用作蒙皮动画的关节的节点索引。关节的顺序是在skin.joints数组中定义的,它必须与inverseBindMatrices数据的顺序相匹配。骨架属性(如果存在)指向作为关节层次结构的公共根的节点,或者指向公共根的直接或间接父节点。
注:这里IBM指的是inverseBindMatrices
实现注意: 定义如何将蒙皮的几何形状与关节一起使用的矩阵(“绑定形状矩阵”)应该预乘到网格数据或反向绑定矩阵。
实现注意: 客户端实现应该只将骨骼根节点的转换应用于蒙皮网格物体,而忽略蒙皮网格节点的转换。在下面的示例中,应用node_0的平移和node_1的缩放,而忽略node_3的平移和node_4的旋转。

{
    "nodes": [
        {
            "name": "node_0",
            "children": [ 1 ],
            "translation": [ 0.0, 1.0, 0.0 ]
        },
        {
            "name": "node_1",
            "children": [ 2 ],
            "scale": [ 0.5, 0.5, 0.5 ]
        },
        {
            "name": "node_2"
        },
        {
            "name": "node_3",
            "children": [ 4 ],
            "translation": [ 1.0, 0.0, 0.0 ]
        },
        {
            "name": "node_4",
            "mesh": 0,
            "rotation": [ 0.0, 1.0, 0.0, 0.0 ],
            "skin": 0
        }
    ],
    "skins": [
        {
            "name": "skin_0",
            "inverseBindMatrices": 0,
            "joints": [ 1, 2 ],
            "skeleton": 1
        }
    ]
}

蒙皮模型的属性

蒙皮的网格物体由顶点着色器中用于皮肤计算的顶点属性定义。JOINTS_0属性数据包含对应关节数组中应该影响顶点的关节的索引。WEIGHTS_0属性数据定义了权值,表示节点对顶点的影响程度。下面的网格皮肤为三角形网格物体定义了JOINTS_0和WEIGHTS_0顶点属性:

{
    "meshes": [
        {
            "name": "skinned-mesh_1",
            "primitives": [
                {
                    "attributes": {
                        "JOINTS_0": 179,
                        "NORMAL": 165,
                        "POSITION": 163,
                        "TEXCOORD_0": 167,
                        "WEIGHTS_0": 176
                    },
                    "indices": 161,
                    "material": 1,
                    "mode": 4
                }
            ]
        }
    ]
}

影响一个顶点的关节数量被限制在每组4个,所以引用访问器必须有VEC4类型和以下组件格式:

  • JOINTS_0: UNSIGNED_BYTE or UNSIGNED_SHORT
  • WEIGHTS_0: FLOAT, or normalized UNSIGNED_BYTE, or normalized UNSIGNED_SHORT
    每个顶点的联合权值必须是非负的,并且归一化后的线性和为1.0。对于给定的顶点,一个关节只有一个非零权值。
    当任意一个顶点受四个以上的关节影响时,附加的关节和权值信息将在后续的集合中找到。例如,如果存在,则JOINTS_1和WEIGHTS_1将引用最多4个影响顶点的附加关节的访问器。请注意,客户端实现只需要支持一组最多四个权值和关节,但是不支持文件中出现的所有权值和关节集可能会影响模型的动画。
    所有的关节值必须在皮肤关节的范围内。未使用的关节值(即权重为零的关节)应设置为零。

骨骼节点的层级

用于控制蒙皮网格物体变换的关节层次结构就是glTF节点层次结构,每个节点都被指定为一个关节。每个皮肤的关节必须有一个共同的根,根本身可能是也可能不是一个关节节点。当场景中的节点引用蒙皮时,公共根必须属于同一场景。

更多的蒙皮解释详见简介中的大图
实现注意: 节点定义没有指定是否应将节点视为骨髓。客户端实现可以先遍历皮肤数组,标记每个节点。
实现注意: 一个节点可以附加其它常规的节点,甚至可以有完整的网格节点子图。它经常被用来将整个几何图形连接到一个关节上,而不会被关节剥皮。(即。剑附在手关节上)。请注意,节点转换是节点相对于节点的本地转换,就像转换部分中描述的glTF节点层次结构中的任何其他节点一样。

例示

网格由node.mesh属性实例化。相同的网格可以被许多节点使用,这些节点可以有不同的转换。例如:

{
    "nodes": [
        {
            "mesh": 11
        },
        {
            "mesh": 11,
            "translation": [
                -20,
                -1,
                0
            ]
        }
    ]
}

变形目标在一个节点内使用以下命令:

  • 网格属性中引用的变形目标。
  • 变形目标的权值覆盖网格属性中引用的变形目标的权值。下面的示例使用非默认的权重设置了一个变形目标。

使用节点的网格和皮肤属性的组合在节点内实例化皮肤。皮肤实例的网格在mesh属性中定义。皮肤属性包含皮肤到实例的索引。

{
    "skins": [
        {
            "inverseBindMatrices": 29,
            "joints": [1, 2] 
        }
    ],
    "nodes": [
        {
            "name":"Skinned mesh node",
            "mesh": 0,
            "skin": 0
        },
        {
            "name":"Skeleton root joint",
            "children": [2],
            "rotation": [
                0,
                0,
                0.7071067811865475,
                0.7071067811865476
            ],
            "translation": [
                4.61599,
                -2.032e-06,
                -5.08e-08
            ]
        },
        {
            "name":"Head",
            "translation": [
                8.76635,
                0,
                0
            ]
        }
    ]
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!