js中使用了raycaster.intersectObjects(colliders)进行碰撞体检测,将gltf中的组件添加到colliders中,却发现函数返回值一直是0。用了另一个可以进行检测的gltf文件比较差异,发现gltf下组件的种类有所区别。
这是无法进行碰撞体检测时console.log()打印出的物体信息,物体类型为SkinnedMesh
这是可以进行碰撞体检测时console.log()打印出的物体信息,物体类型为Mesh。
区别在于使用blender导出gltf时是否在“操作项预设”下的“动画”中选中“蒙皮”选项,选中时导出的材质即为SkinnnedMesh,则无法被检测到。
问了一下gpt,这是它对两种材质区别的解释:
“在gltf中,Mesh
和SkinnedMesh
都是表示3D模型网格的节点类型。它们之间的区别在于是否进行皮肤绑定(skinning)。
Mesh
节点用于表示不进行皮肤绑定的网格模型,也就是静态网格模型。这种类型的节点包含一个或多个Primitive
子节点,每个Primitive
节点包含了一组定义了顶点数据、拓扑结构和材质信息的网格数据。
相比之下three.js,SkinnedMesh
节点用于表示进行皮肤绑定的网格模型,也就是骨骼动画模型。这种类型的节点包含了一个Skin
节点,其中定义了骨骼的层级结构及其与网格的绑定方式,以及一个或多个Primitive
子节点,在每个Primitive
节点中定义了网格的具体数据。在进行渲染时,SkinnedMesh
节点会根据骨骼的变换对网格进行实时的变形,从而实现骨骼动画效果。”
似乎是因为两种材质对几何形状的属性定义不一致,导致Mesh可以被检测到而SkinnedMesh不行(如有说错欢迎纠正)。