Three.js导出具有位置的

问题描述

我正在尝试使用https://github.com/mrdoob/three.js/blob/master/examples/jsm/exporters/OBJExporter.js

从Three.js场景中导出模型

某些网格是基础网格,而另一些是SkinnedMesh,所以我从中编辑了第250行

if ( child instanceof Mesh ) {

if ( child instanceof Mesh || child instanceof SkinnedMesh ) {

,我可以看到导出文件中的所有网格,但是SkinnedMeshes的原点位置和方向错误。 如何编辑导出器以正确获得SkinnedMeshes,为什么会发生这种情况?

编辑: 我尝试使用答案中建议的STL导出器,但是它仍然无法导出姿势,因为它检查了以下三个属性

if(typeof object.obj.geometry.attributes.skinIndex !== 'undefined' && typeof object.obj.geometry.attributes.skinWeight !== 'undefined' && typeof object.obj.skeleton !== 'undefined')
除“ object.obj.skeleton”外,

均未定义。 我在SkinnedMesh对象中看到的属性是“ instanceIndex”,“ normal”,“ position”和“ uv”

编辑2:

很抱歉造成混乱,但是我误读了输出日志。有些网格具有上述属性,这意味着实际名称为“ skinWeight0”和“ skinIndex0”。 我试图将名称更改为代码中的名称,并且可以成功打印这些数组,但是导出的模型完全混乱:

enter image description here

解决方法

之所以会这样,是因为蒙皮网格的转换不仅取决于Object3D.positionObject3D.rotationObject3D.scale及其在对象层次结构中的位置。它也取决于其骨架。

到目前为止,您所做的更改不足以保留框架信息。如果要确保导出实际上反映了蒙皮网格物体的变换和形状,则需要类似此PR的代码:

https://github.com/mrdoob/three.js/pull/16942

因此,其想法是在计算顶点的最终位置(将在OBJ文件中定义)时实际上考虑骨骼变换。