在没有任何预先存在的库或加载器的帮助下从gltf加载边界框将是一个编程挑战,但这是可以做到的.当然,您将使用浏览器的JSON解析器,并且某种向量/矩阵数学助手库将非常有用.
以下是大体轮廓:
- 将gltf的JSON部分解析为一个我们称之为
glTF
的对象.
- 读取
glTF.scene
以获取默认场景索引,通常为0
.
- 从
glTF.scenes[sceneIndex].nodes
获取根 node 列表,它是从glTF.nodes[]
到glTF.nodes[]
的索引array.
- 在
glTF.nodes[n]
的每个 node 上,考虑matrix
或translation
、rotation
和scale
中的变换.这些将转换 node 的边界框及其子边界框.
- 向下递归 node 的
children
(如果存在),它将是具有自己的转换的子 node 的索引array.
- 对于在步骤4和5中找到的所有 node ,查找
node.mesh
,这将是glTF.meshes
数组的索引.
- 对于步骤6中的每个网格,查找对象
mesh.primitives
的array.与gltf中的其他数组不同,基本体直接嵌入到网格中,而不是单独索引.
- 对于步骤7中的每个基元,查找
primitive.attributes.POSITION
,它将是glTF.accessors[]
数组的索引.
- 规范要求gltf中的位置访问器具有两个数组
accessor.min[]
和accessor.max[]
,这两个数组都有X、Y和Z的3个元素.这是该网格中原始的、未转换的数据的边界框.
所以现在你已经向下递归了整个 struct ,并在叶 node 上找到了一些边界框.这些长方体包含原始网格数据,并且必须通过其父 node 、祖父 node 和所有祖先 node 的变换进行变换,才能了解这些长方体在模型空间中的位置.
当然,如果每个网格代表一个单独的物理对象,那么您可能不想要所有的祖先变换.您可以将原始网格数据的长方体按原样接受,并将其直接父 node 的变换作为物理的开始位置.你必须想出你想要在这里发生什么的细节.
请注意,像动画、蒙皮和变形这样的东西会增加边界框计算的额外复杂性,但这超出了这里的回答范围.祝好运!