THREE.js OBJMTLLoader - 请求简单的示例文件

时间:2015-09-30 15:51:21

标签: three.js .obj

详见previous question我已经学会了如何使用相同的对象&使用THREE.js OBJMTLLoader。 official example中使用的材料。

该示例使用(对我而言)复杂模型和DDSLoader。

我想加载更简单的OBJ + MTL模型,并尝试从网上获得的几个免费模型。我已经设法加载OBJ文件OK(通过应用更多THREE.js代码,如定义法线),但是从MTL文件加载材质纹理时出现问题。

以下是我的代码的一个简单示例。

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon startFromScratch="true">
    <tabs>
    <tab idMso="TabHomeAccess" visible="true" />
    <tab idMso="TabCreate" visible="false" />
    <tab idMso="TabExternalData" visible="false" />
    <tab idMso="TabDatabaseTools" visible="false" />
    <tab idMso="TabSourceControl" visible="false" />
    <tab idMso="TabAddIns" visible="true" />
    </tabs> 
</ribbon>

这是MTL代码

//...DolphinB
var posX = -3445; var posY = 750; var posZ = -100; 
var common_scale = 100;

var loader = new THREE.OBJMTLLoader();
loader.load(
   'TRI_VP_files/models/dolphin/DOLPHIN_B.obj', 
   'TRI_VP_files/models/dolphin/DOLPHIN_B.mtl', 
    function(object) 
    {
    object.position.set( posX, posY, posZ );
    scene222.add( object );
    object.scale.set(common_scale, common_scale, common_scale);
     } );

我的问题

请有人指点一些简单的OBJ + MTL文件,这些文件已知可以通过OBJMTLLoader加载。

1 个答案:

答案 0 :(得分:0)

您可以使用Mohammad Alizadeh创建的以下免费私人用途文件集hand(好工作,谢谢Mohammad)。

它使用单个.JPG图像文件作为材质纹理的来源。

它使用单一材料。

这是.MTL文件内容......

# Blender MTL File: 'Hand.blend'
# Material Count: 1    
newmtl defaultMat
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 1.000000
illum 2
map_Kd hand_mapNew.jpg

您需要更改.OBJ文件的前几行...

# Blender v2.74 (sub 0) OBJ File: 'Hand.blend'
# www.blender.org
mtllib Hand.mtl
o ZBrushPolyMesh3D
v 0.614360 0.281365 -0.675872
v 0.684894 0.445729 -0.634615

# Blender v2.74 (sub 0) OBJ File: 'Hand.blend'
# www.blender.org
## mtllib Hand.mtl    <===== commented out
usemtl defaultMat ##  <===== added usemtl command,note proper name of material
## o ZBrushPolyMesh3D <===== commented out
v 0.614360 0.281365 -0.675872
v 0.684894 0.445729 -0.634615

请注意,许多免费的3D对象文件集都使用.TIF图像文件。但.TIF不能在浏览器(或THREE.js)中显示。可以将它们转换为.JPG格式,但不保留UV映射。

另请注意,需要编辑一些免费的3D对象文件集,以便.OBJ文件中的材质名称与.MTL文件中给出的名称相匹配。

另请注意,需要编辑一些.OBJ文件(如上面的手动示例),以便通过 usemtl 命令指示材料,例如: -

usemtl defaultMat

儿童处理

对于Hand文件集,是.OBJ文件中的顶点法线(vn)。但由于某些原因,不应用平滑。应用以下代码将生成平滑(并调整光泽度并为对象拾取设置rootObject引用): -

object.traverse (  function (child)
{
    if (child instanceof THREE.Mesh) 
    {           
        child.material.shininess = 10;//range 0.1 to 30 (default) to 1000 or more, applies to Phong materials.    
        //child.userData.rootObject = object; //... see West Langley answer at http://stackoverflow.com/questions/22228203/picking-object3d-loaded-via-objmtlloader
        //... used for object picking so that, for further operations, we can select picked child object or child's rootObject.
        child.rootObject = object; //... avoids infinite loop if cloning 3D objects.    
        child.geometry.computeFaceNormals(); 
        child.geometry.computeVertexNormals();   
        //child.geometry.normalsNeedUpdate = true; //... only required if object has already been rendered.
    }
}; )

<强>声明

这些技巧让我在这个特殊情况下工作。我并不是说这是最好的做事方式。