如何在three.js中使用mtlLoader和objLoader中的多个纹理?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在three.js中使用mtlLoader和objLoader中的多个纹理?相关的知识,希望对你有一定的参考价值。

我有.mtl.obj和多个纹理.jpg文件。我试图在导出加载器obj中使用不同的纹理。我可以让我的对象在场景中可见,但我的对象black颜色可见。我的代码中有什么错误/遗漏的想法?

var mtlLoader = new THREE.MTLLoader();
mtlLoader.setPath('models/LivingRoom/Sample/');
mtlLoader.load( 'small plant.mtl', function( materials ) {
  materials.preload();

  var objLoader = new THREE.OBJLoader();
  objLoader.setMaterials(materials);
  objLoader.setPath('models/LivingRoom/Sample/');
  objLoader.load( 'small plant.obj', function ( object ) {

      var geometry = object.children[ 0 ].geometry;
      var materials = [];
      var mat1=new THREE.MeshLambertMaterial( { map : THREE.ImageUtils.loadTexture('models/LivingRoom/Sample/Listik-2.jpg')});
      var mat2=new THREE.MeshLambertMaterial({ map : THREE.ImageUtils.loadTexture('models/LivingRoom/Sample/22_zemlya_oboi_1920x1080.jpg')});
      materials.push(mat1);
      materials.push(mat2);
      mesh = THREE.SceneUtils.createMultiMaterialObject(geometry,materials);
      mesh = THREE.SceneUtils.createMultiMaterialObject(geometry,threeDTexture);

      object.traverse(function (child) {
        if (child instanceof THREE.Mesh) {
          child.materials = materials;

        }
      });

    },
    function ( xhr ) {
      returnValue = ( xhr.loaded / xhr.total * 100 ) + '% loaded';
      console.log(returnValue);
    },
    function ( error ) {
      console.log( 'An error happened' );
    }
  );
});     
答案

检查.mtl文件中的纹理路径。如果路径错误,您可以使用3d对象编辑器(如 - Blender或其他一些3D编辑器工具)。

Blender使用Blender Internal渲染器作为活动渲染器导入具有纹理的obj文件。但是,当Cycles是活动渲染器时,目前不支持导入具有纹理的obj文件。使用Cycles,您必须使用纹理创建新材质所以首先想法是在尝试导入网格时检查您使用的渲染器。然后是文件格式本身。 Obj文件格式由两个文件组成,而不是一个。 * .obj文件包含网格数据。 * .mtl文件包含一个或多个带有相关纹理路径的简单phong材质。好消息是Obj是一种文本形式的超级简单文件格式。您可以在文本编辑器中打开文件并根据需要进行编辑。当* .mtl文件是missig时,没有任何东西可以导入Blender。没有mtl文件意味着没有材料和纹理可用。当* .mtl文件存在但文件中的纹理路径是绝对的,并且纹理位于另一个位置时,由于找不到纹理,因此没有任何内容可以导入Blender。首先要检查的是:* .mtl文件是否存在?如果是这种情况并且纹理不导入:* .mtl文件中的纹理路径是相对还是绝对?例如,在wordpad中打开* .mtl文件。看一下前面有map_kd的行。例如,绝对路径为map_Kd C:\ UserX \ myfolder \ mytextures \ mytexture.png当您将其更改为map_Kd mytexture.png时,此路径将变为相对路径。当你将纹理放在obj文件之外时,通常会加载纹理 - 当Blender Internal是活动渲染器时。如上所述,此时不支持Cycles。

How to export .obj format file with texture in blender?

以上是关于如何在three.js中使用mtlLoader和objLoader中的多个纹理?的主要内容,如果未能解决你的问题,请参考以下文章

three.js如何加载带材质的obj外部模型

谁有three.js的loader扩展包下载地址 或者给我发一下 谢谢 我需要objmtlload

有没有办法使用 obj 文件中的路径加载 mtl?

3d模型一般怎么导入到到Threejs中使用

如何在 TypeScript 中使用 three.js 加载 OBJ 模型

如何在使用three.js和jsonLoader时制作加载屏幕?