当我单纯地用MTLLoader引入材质, OBJLoader引入模型并添加到场景中时, 发现模型非常得暗. 需要将环境光的强度设置到3.5左右看起来才比较正常. 但正常情况下环境光的值不应该超出1. 研究了网上提供几种不同的方式, 再加上TS对类型的限制导致绕了些弯路.

需要调整的地方有两个, 模型材质的自发光emissive 以及渲染器renderer的渲染输出方式outputEncoding. 通过控制台输出OBJ的子对象可以看到其材质的自发光emissive是没有设置颜色的( Color为一个包含rgb颜色属性的对象, ThreeJS提供了其类型, 可以自己定义color对象并用Color类型作类型断言), emissiveMap也没有配置.

现贴上部分代码和方法.

 1   import * as ThreeJS from 'three';
2 // OBJ模型子项的类型需要自己在控制台输出查看
3 import { Mesh, MeshPhongMaterial, sRGBEncoding } from 'three';
4 import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader';
5 import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader';
6
7 // ...省略代码
8
9 const mtlLoader = new MTLLoader();
10 const objLoader = new OBJLoader();
11 mtlLoader.load('/model/body/body.mtl', (material) => {
12 material.preload();
13 // mtl文件中的材质设置到obj加载器
14 objLoader.setMaterials(material);
15 objLoader.load(
16 'model/body/body.obj',
17 (obj) => {
18 // 设置模型大小
19 // obj.scale.set(2, 2, 2);
20 // 设置模型位置
21 obj.position.set(0, 0, 0);
22 obj.children.forEach((child) => {
23 const c = child as Mesh;
24 const cm = c.material as MeshPhongMaterial;
25 cm.emissive = cm.color;
26 cm.emissiveMap = cm.map;
27 });
28 scene.add(obj);
29 },
30 (xhr) => {
31 console.log(`${(xhr.loaded / xhr.total) * 100}% loaded`);
32 },
33 (error) => {
34 console.log('An error happened', error);
35 }
36 );
37 });
38 // ...省略代码
39 const renderer = new ThreeJS.WebGLRenderer();
40 renderer.outputEncoding = sRGBEncoding;

关于emissive属性的补充说明可以看这篇文章: https://www.jianshu.com/p/f9d81761ce2f

关于renderer渲染器的输出可以参考这篇文章: https://www.jb51.net/article/256430.htm

vue3 ThreeJS 引入obj模型过暗的问题的更多相关文章

  1. raycaster选取捕获obj模型&&选中高亮代码

    目录 raycaster选取捕获obj模型&&选中高亮代码 raycaster关键代码 选中高亮代码 obj整体上色 raycaster选取捕获obj模型&&选中高亮代 ...

  2. 教你如何利用threejs对3D模型皮肤进行DIY

    一步一步教你如何利用threejs加载gltf模型来实现DIY换肤功能. 模型准备 模型制作 模型可以通过网上下载,也可以自己通过c4d.maya.blender等模型制作软件得到.这里就不叙述有关模 ...

  3. Obj模型功能完善(物体材质,光照,法线贴图).Cg着色语言+OpenTK+F#实现.

    这篇文章给大家讲Obj模型里一些基本功能的完善,包含Cg着色语言,矩阵转换,光照,多重纹理,法线贴图的运用. 在上篇中,我们用GLSL实现了基本的phong光照,这里用Cg着色语言来实现另一钟Blin ...

  4. opengl导入obj模型

    在经过查阅各种资料以及各种bug之后,终于成功的实现了导入基本的obj模型. 首相介绍一下什么是obj模型 一.什么是OBJ模型 obj文件实际上是一个文本文档,主要有以下数据,一般可以通过blend ...

  5. 三维引擎导入obj模型全黑总结

    最近有客户试用我们的三维平台,在导入模型的时候,会出现模型全黑和不可见的情况.本文说下全黑的情况. 经过测试,发现可能有如下几种情况. obj 模型没有法线向量 如果obj模型导出的时候没有导出法线向 ...

  6. 君子性非异也,善假于物也 - Threejs 引入TrackballControls 查看场景

    君子性非异也,善假于物也 - Threejs 引入TrackballControls 查看场景 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循" ...

  7. OpenGL OBJ模型加载.

    在我们前面绘制一个屋,我们可以看到,需要每个立方体一个一个的自己来推并且还要处理位置信息.代码量大并且要时间.现在我们通过加载模型文件的方法来生成模型文件,比较流行的3D模型文件有OBJ,FBX,da ...

  8. 由于OBJ模型的读取引起的Release无问题Debug卡死问题

    有些时候会遇到Release版本正常运行,但是Debug无法运行甚至崩溃,原因有很多种,这里记录一下由于模型文件读取引起的Debug问题. 项目中需要读取一个obj模型文件,30M左右,Debug模式 ...

  9. Three.js中的group,obj,模型中layers层级与相机

    目录 Three.js中的group,obj,模型中layers层级与相机 layers group中的.layers.mask设置 一些设想 Three.js中的group,obj,模型中layer ...

  10. 三维引擎导入obj模型不可见总结

    最近有客户试用我们的三维平台,在导入模型的时候,会出现模型全黑和不可见的情况.上一篇文章说了全黑的情况.此文说下不可见的情况. 经过测试,发现可能有如下两种情况. 导入的模型不在镜头视野内 导入的模型 ...

随机推荐

  1. CH340N串口无法检测问题的解决

    问题原因: type-C有好几种类型,其中包括能传输数据的,也有不能传输数据.只能供电的.(本质差别就是引脚数目不同) 问题解决:只要将原来的type-C转USB的充电线换成数据线,电脑就能识别CH3 ...

  2. Android开发数据库Sqlite

    创建数据库 首先我们要了解这个类:SQLiteOpenHelper: 1.写一个类继承SQLiteOpenHelper 2.实现里面的方法,创建构造方法 参数解释: /** @param: conte ...

  3. iOS底层原理01:源码探索的三种方式

    ios 开发探索源码三种方法 1.下符号断点的形式直接跟流程 2.通过摁住 control + step  into 3.汇编查看跟流程 1.符号断点直接跟流程 以alloc为例: 选择断点Symbo ...

  4. 手动收集oracle的统计信息脚本及相关操作

    我们一般习惯使用oracle自带的统计信息收集,但很多时候我们会发现,有很多关键的表始终没有被收集过. connect 用户/密码grant create any table to 用户;-- 这一步 ...

  5. 启动Eureka报org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configurationPropertiesBeans' defined in class path resource

    我出现这种情况是下图两个版本不对应 要结合官文档的版本号 也就是说将parent版本号改为2.2.x或者2.3.x

  6. 如何用calibredrv 来merge多个cell的gds

    1. 两个cell合并到一个gds calibredrv -shell layout filemerge -in A.gds -in B.gds -out  AB.gds -createtop AB_ ...

  7. vue父子件,子件页面table数据列按条件显示不同的内容

    需求:在父件中点击按钮.子件弹框中,table列根据条件显示不同的数据 实现思路:点击按钮,执行不同的方法,方法中参数值不同,从而展示不同的columns. 父件按钮如下图: 父件中导入子件需要注意的 ...

  8. 10 soundJs 初体验

    最近想做一个h5的小游戏所以用上了soundjs. 还在开发中  http://www.hetenglife.com/mouse/game.html 刚刚把控制做完. 首先是要导入这个文件 <s ...

  9. AVD文件转移到非系统盘

    AVD文件默认是生成在C:\Users\用户名\.android\avd目录下面的,而AVD文件非常大,可以用下面的方法将AVD文件转移到其他盘中. 1. 将每个模拟器对应的***.avd文件夹的内容 ...

  10. 昨天写了个ATM系统,学了点思想

    昨天上黑马的基础课终结,有个小测验是做个ATM系统 拿到之后我就明白该怎么做了 但是在后面遇到了瓶颈 就是 不知道怎么进入下级菜单 后面稍微看了一下他的做法,学会了 就继续做了,后面就做出来了 他这个 ...