蒙皮
所有蒙皮都存储在资源的皮肤数组中。每个皮肤都由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
orUNSIGNED_SHORT
WEIGHTS_0
:FLOAT
, or normalizedUNSIGNED_BYTE
, or normalizedUNSIGNED_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
]
}
]
}
来源:oschina
链接:https://my.oschina.net/u/235558/blog/3162462