Three.js加载.obj和.mtl文件(无法加载材质、路径错误问题)

加载.obj模型文件

本文是Three.js电子书的14.3节

使用三维软件导出.obj模型文件的时候,会同时导出一个材质文件.mtl.obj.stl文件包含的信息一样都是几何体顶点相关数据,材质文件.mtl包含的是模型的材质信息,比如颜色、贴图路径等。

加载.obj三维模型的时候,可以只加载.obj文件,然后借助three.js引擎自定义材质Material,也可以同时加载.obj.mtl文件。

只加载obj文件

只加载obj文件,引入路径three.js-master/examples/js/loaders/OBJLoader.js下的OBJLoader.js文件即可

<!-- 引入obj模型加载库OBJLoader.js -->
<script src="../../three.js-master/examples/js/loaders/OBJLoader.js"></script>

文件加载

/**
 * OBJ文件加载  只加载obj文件中的几何信息,不加载材质文件.mtl
 */
var loader = new THREE.OBJLoader();
// 没有材质文件,系统自动设置Phong网格材质
loader.load('./立方体/box.obj',function (obj) {
  // 控制台查看返回结构:包含一个网格模型Mesh的组Group
  console.log(obj);
  // 查看加载器生成的材质对象:MeshPhongMaterial
  console.log(obj.children[0].material);
  scene.add(obj);
})

加载文件返回的对象插入场景中后,你也可以做一些自定的设置,比如缩放、居中等操作。

// 加载后的一些编辑操作
obj.children[0].scale.set(20,20,20);//网格模型缩放
obj.children[0].geometry.center();//网格模型的几何体居中
obj.children[0].material.color.set(0xff0000);//设置材质颜色

同时加载obj文件和mtl文件

mtl文件包含了模型的材质信息,比如模型颜色、透明度等信息,还有纹理贴图的路径,比如颜色贴图、法线贴图、高光贴图等等。

<!-- 引入obj模型加载库OBJLoader.js -->
<script src="../../three.js-master/examples/js/loaders/OBJLoader.js"></script>
<!-- 引入obj模型材质加载库MTLLoader.js -->
<script src="../../three.js-master/examples/js/loaders/MTLLoader.js"></script>

/**
 * OBJ和材质文件mtl加载
 */
var OBJLoader = new THREE.OBJLoader();//obj加载器
var MTLLoader = new THREE.MTLLoader();//材质文件加载器
MTLLoader.load('./立方体/box.mtl', function(materials) {
  // 返回一个包含材质的对象MaterialCreator
  console.log(materials);
  //obj的模型会和MaterialCreator包含的材质对应起来
  OBJLoader.setMaterials(materials);
  OBJLoader.load('./立方体/box.obj', function(obj) {
    console.log(obj);
    obj.scale.set(10, 10, 10); //放大obj组对象
    scene.add(obj);//返回的组对象插入场景中
  })
})

obj包含多个网格模型

obj文件可以包含多个网格模型对象,不一定就是一个,这些网格模型对象全部是并列关系,无法通过父子关系构建一个树结构层级模型。


// 没有材质文件,系统自动设置Phong网格材质
OBJLoader.load('./多个模型/model.obj',function (obj) {
  // 控制台查看返回结构:包含一个网格模型Mesh的组Group
  console.log(obj);
  scene.add(obj);
  // 加载后的一些编辑操作
  obj.scale.set(20,20,20);//网格模型缩放
  // 设置其中一个网格模型的颜色
  obj.children[0].material.color.set(0xff0000);
})

模型纹理贴图

obj模型的mtl文件可能包含纹理贴图,也可能不包含,这主要看3D美术是否设置。

一个包含纹理贴图路径的.mtl文件,如果路径有问题,可能会无法加载,可以仿照该案例修改。

// 一个包含纹理贴图路径的.mtl文件
newmtl material_1
	Ns 32
	d 1
	Tr 0
	Tf 1 1 1
	illum 2
	Ka 0.5880 0.5880 0.5880
	Kd 0.9880 0.9880 0.9880
	Ks 0.1200 0.1200 0.1200
	map_Kd ./贴图/Earth.png
  map_ks ./贴图/EarthSpec.png
	norm ./贴图/EarthNormal.png

mtl和threejs贴图对应关系

mtl贴图Threejs贴图
map_kdmap
map_ksspecularMap
map_bump/bumpbumpMap
/**
 * OBJ和材质文件mtl加载
 */
var OBJLoader = new THREE.OBJLoader(); //obj加载器
var MTLLoader = new THREE.MTLLoader(); //材质文件加载器
MTLLoader.load('./贴图/material.mtl', function(materials) {
  // 返回一个包含材质的对象MaterialCreator
  console.log(materials);
  //obj的模型会和MaterialCreator包含的材质对应起来
  OBJLoader.setMaterials(materials);
  OBJLoader.load('./贴图/model.obj', function(obj) {
    console.log(obj);
    scene.add(obj); //返回的组对象插入场景中
    // 加载后操作
    obj.children[0].scale.set(2, 2, 2); //缩放球体网格模型
    // 通过调节参数,地球表面的凹凸感更强
    obj.children[0].material.normalScale.set(3, 3);
  })
})

导出.obj.mtl的名称、路径问题

3dmax导出的obj和mtl模型文件有时候需要修改一下个别位置字符,比如.obj.mtl文件的名称可能是乱码mtllib �����.mtl.mtl文件中贴图的路径要设置正确,比如导出的是绝对路径还是相对路径,可以打开看下。

.obj文件不包含信息

.obj文件不包含场景的相机Camera、光源Light等信息,不能导出骨骼动画、变形动画,如果希望导出光照信息、相机信息、骨骼动画信息、变形动画信息,可以选择.fbx.gltf等格式。

使用three.js加载.obj和.mtl文件可以通过以下步骤完成: 1. 首先,你需要引入three.js文件,通过在HTML页面中添加如下代码来导入库文件: ``` <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script> ``` 2. 创建一个用于显示3D模型的容器,可以是一个div元素或者canvas元素。例如: ``` <div id="canvas"></div> ``` 3. 在Javascript代码中,创建一个场景(scene)、摄像机(camera)和渲染器(renderer): ``` var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.getElementById("canvas").appendChild(renderer.domElement); ``` 4. 使用OBJLoader加载.obj文件MTLLoader加载.mtl文件。确保将路径指定为正确的模型文件路径。例如: ``` var objLoader = new THREE.OBJLoader(); var mtlLoader = new THREE.MTLLoader(); mtlLoader.load('model.mtl', function (materials) { materials.preload(); objLoader.setMaterials(materials); objLoader.load('model.obj', function (object) { scene.add(object); }); }); ``` 5. 设置摄像机的位置以及添加光源: ``` camera.position.z = 5; var light = new THREE.PointLight(0xFFFFFF, 1, 100); light.position.set(10, 10, 10); scene.add(light); ``` 6. 创建一个渲染函数,以及在每帧更新场景的方法: ``` function render() { requestAnimationFrame(render); renderer.render(scene, camera); } render(); ``` 以上代码可以让你使用three.js加载.obj和.mtl文件,并在页面上显示出3D模型。尽量准备好正确路径下的.obj和.mtl文件以及相关的纹理文件
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Threejs可视化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值