【threeJs笔记】3. Three.js贴图Texture

本文介绍了如何使用Three.js加载OBJ模型,并详细展示了如何为心脏模型应用普通颜色纹理、法线贴图、高光贴图和环境贴图,同时配置了合适的光源,以实现逼真的3D渲染效果。

在这里插入图片描述

心脏案例 模型图
在这里插入图片描述

普通颜色纹理贴图map

/**
 * OBJ文件加载  只加载obj文件中的几何信息,不加载材质文件.mtl
 */
var loader = new THREE.OBJLoader();
// 没有材质文件,系统自动设置Phong网格材质
var mesh = null; //声明一个网格模型变量
loader.load('./heart/model.obj', function(obj) {
  // 控制台查看返回结构:包含一个网格模型Mesh的组Group
  console.log(obj);
  scene.add(obj);
  mesh = obj.children[0]; //获得心脏网格模型
  mesh.scale.set(10, 10, 10); //网格模型缩放
  // 创建一个纹理加载器
  var textureLoader = new THREE.TextureLoader();
...
})

设置模型的颜色贴图.map

  var texture = textureLoader.load('./heart/color.png');
  mesh.material.map = texture;

法线贴图normalMap

**
设置模型的法线贴图.normalMap,表面细节更丰富,为了压缩模型顶点数量,也就是降低文件大小,3D美术通常会给程序员提供法线贴图。**

  //加载颜色纹理
var textureNormal = textureLoader.load('./heart/normal.png');
mesh.material.normalMap = textureNormal

// 设置深浅程度
mesh.material.normalScale.set(1.5, 1.5)

高光贴图specularMap

**对于心脏模型而言,模型外表面不同区域的粗糙度不同,对光线的镜面反射程度不同,所以可以把这些不同区域的不同光反射信息记录在一个贴图上,即高光贴图.specularMap,设置高光贴图需要高光网格模型材质MeshPhongMaterial。
**


// 设置高光贴图,一个网格模型不同的区域反射光线的能力不同
var textureSpecular = textureLoader.load('./heart/Specular.png');
mesh.material.specularMap = textureSpecular;
mesh.material.specular.set(0xffffff);// 高光反射颜色
mesh.material.shininess = 100;// 高光高亮程度,默认30


环境贴图envMap

通过类CubeTextureLoader来加载六张纹理贴图’px.jpg’, ‘nx.jpg’, ‘py.jpg’, ‘ny.jpg’, ‘pz.jpg’, ‘nz.jpg’。
设置环境贴图.envMap,反射周围环境效果,渲染更逼真。

var textureCube = new THREE.CubeTextureLoader()
  .setPath('环境贴图/')
  .load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg']);
mesh.material.envMap = textureCube;

光源设置

渲染模型的时候,合理的设置光源是很必要的,比如光源强度太低,模型就会比较灰暗,光源强度太高,模型会过于明亮。

/**
 * 光源设置
 */
 
//点光源
var point = new THREE.PointLight(0xffffff, 0.3);
point.position.set(400, 200, 300); //点光源位置
scene.add(point); //点光源添加到场景中

// 环境光
var ambient = new THREE.AmbientLight(0xffffff, 0.8);
scene.add(ambient);

// 方向光1
var directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
directionalLight.position.set(400, 200, 300);
scene.add(directionalLight);

// 方向光2
var directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
directionalLight.position.set(-400, -200, -300);
scene.add(directionalLight);

参考 http://www.webgl3d.cn/Three.js/

Three.js中,深度测试是用来确定哪些物体在渲染时应该显示在前面,哪些应该显示在后面的一种技术。默认情况下,深度测试是开启的,可以通过设置renderer的depthTest属性为false来关闭深度测试。例如,可以使用以下代码来创建一个开启了抗锯齿和对数深度缓冲的WebGL渲染器: ```javascript renderer = new THREE.WebGLRenderer({ antialias: true, logarithmicDepthBuffer: true }); ``` 另外,如果在使用Raycaster的intersectObject方法时遇到报错,可能是因为没有正确加载纹理。在加载纹理图片后,需要在图片加载完成后更新纹理,可以通过设置texture的needsUpdate属性为true来实现。例如: ```javascript var canvas = document.createElement("canvas"); var ctx = canvas.getContext('2d'); var Image = new Image(); Image.src = "./贴图.jpg"; Image.onload = function() { var bg = ctx.createPattern(Image, "no-repeat"); // ... // 注意图片加载完成执行canvas相关方法后,要更新一下纹理 texture.needsUpdate = true; } ``` 此外,如果想要在Three.js中使用orbitcontrol来控制模型的交互动作,并且希望绕x轴和z轴旋转,可以通过设置camera的up属性来实现。例如: ```javascript camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000); camera.position.z = 2900; // 关键就是设置camera的up为y轴 camera.up = new THREE.Vector3(0, 0, 1); scene.add(camera); ``` 最后,如果在使用Three.js时遇到"A WebGL context could not be created. Reason: Web page caused context loss and was blocked"的错误,可能是由于WebGL上下文丢失导致的。这可能是由于浏览器的安全策略或其他原因引起的。可以尝试重新加载页面或检查浏览器的设置来解决这个问题。 #### 引用[.reference_title] - *1* *2* *3* [threejs坑记录-笔记](https://blog.csdn.net/u010568976/article/details/122562413)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值