Three.js学习8:基础贴图

本文介绍了如何在Three.js中使用贴图技术,包括纹理映射、基础代码示例、透明贴图的实现以及环境贴图的应用,通过实例展示了如何为立方体添加纹理、透明度和环境映射效果。
摘要由CSDN通过智能技术生成

-----------------------------华丽的分割线---------------------

相关代码均已上传到 gitee 中:myThree: 学习 Three.js ,努力加油~!

Gitee 静态演示地址:Three JS 演示页面

-----------------------------华丽的分割线---------------------

一、贴图

贴图(Texture Mapping),也翻译为纹理映射,“贴图”这个翻译更直观。

贴图,就是把图片贴在 3D 物体材质的表面,让它具有一定的纹理,来为 3D 物体添加细节的一种方法。这使我们能够添加表面细节,而无需将这些细节建模到我们的3D对象中,从而大大精简3D模型的多边形边数,提高模型渲染性能。

二、准备基础代码

在场景里创建一个立方体

为了方便观察效果,还添加了网格辅助轨道控制器

HTML:

<script type="importmap">
    {
        "imports":{
            "three":"./js/three.module.min.js",
            "addons/":"./js/jsm/"
        }
    }
</script>
<script type="module" src="js/myjs.js"></script>

JS:

import * as THREE from "three";
import { OrbitControls } from "addons/controls/OrbitControls.js";

let winH = window.innerHeight;
let winW = window.innerWidth;
// 场景
const scene = new THREE.Scene();
scene.background = new THREE.Color("#cccccc");

// 物体
const geometry = new THREE.BoxGeometry(1,1,1);
const material = new THREE.MeshBasicMaterial({
    color:"#ff3300"
});
const box = new THREE.Mesh( geometry, material );
box.position.set(0,0,0);
scene.add( box );

// grid
const gridHelper = new THREE.GridHelper(10,10);
scene.add( gridHelper);

// 相机
const camera = new THREE.PerspectiveCamera(50, winW/winH, 1, 1000);
camera.position.set(0,5,5);
camera.lookAt(scene.position);

// 渲染器
const renderer  = new THREE.WebGLRenderer();
renderer.setSize( winW, winH );
document.body.appendChild( renderer.domElement );
renderer.render( scene, camera );

// 轨道控制器
const controls = new OrbitControls( camera, renderer.domElement );
controls.update();

// 动画
function animateFun(){
    controls.update();   // 现在动画里更新控制器
    // 渲染
    renderer.render( scene, camera);
    requestAnimationFrame(animateFun);
}
animateFun();

 

三、纹理贴图示例

纹理贴图用到的是基础材质 THREE.MeshBasicMaterialTHREE.TextureLoader

  • THREE.MeshBasicMaterial :基础材质是不受光照影响,可以直接给物体设置颜色,也可以将图片贴到物体表面。

  • THREE.TextureLoader:纹理加载器。纹理贴图加载器TextureLoaderload() 方法加载一张图片可以返回一个纹理对象Texture纹理对象Texture可以作为模型材质贴图 .map 属性的值。

修订代码,为立方体的材质(meterial)添加纹理贴图

const texture = new THREE.TextureLoader().load("../images/woods2.jpg");
const material = new THREE.MeshBasicMaterial({
    map:texture
});

这里用的纹理图是: 

 

效果:

四、透明贴图示例

如果贴图要透明,可以设置材质的透明属性 transparent:true;

同时,要准备好 alpha 图片,做 alpha贴图的纹理。

alpha 图片,其实就是一个黑白图,跟 PS 蒙版是一个道理:黑色不可见,白色可见,灰色代表半透明。

这里使用两张素材如下:

 

修改 meterial 代码如下:(两张纹理图,都要加载进去)。

const texture = new THREE.TextureLoader().load("../images/head1.jpg");
const textureAlpha = new THREE.TextureLoader().load("../images/head2.jpg");
const material = new THREE.MeshBasicMaterial({
    map:texture,           // 纹理贴图
    alphaMap:textureAlpha,  // alpha 贴图
    transparent:true      // 开启透明属性
});

 

为什么立方体只有一半?

这是因为,纹理渲染面属性值 side 有四个值 :

  • THREE.FrontSide:默认。只渲染前面。

  • THREE.BackSide:只渲染后面

  • THREE.DoubleSide:前后面都渲染。

  • THREE.TwoPassDoubleSide:将按前后顺序分两次渲染双面透明材料,以减轻透明伪影。

默认 meterial 的“平面”是只渲染前面,因此立方体转向后,背面的图是看不到的。把 side 属性改为 THREE.DoubleSide 即可。

const material = new THREE.MeshBasicMaterial({
    map:texture,
    transparent:true,
    alphaMap:textureAlpha,
    side: THREE.DoubleSide   // 前后面都渲染。
});

 

五、环境贴图示例

环境贴图(environment mapping),顾名思义,就是给材质贴上环境的画面。

这个主要让材质反映出周围的画面。比如,在一个草地上,让一个立方体映出草地周围的画面。

1. 给场景添加立方纹理

修改前面的基础结构代码给场景添加立方纹理,把场景设置为一个公园。

// 场景
const scene = new THREE.Scene();
// 给场景添加立方纹理
const cubeTexture = new THREE.CubeTextureLoader().setPath("../texture3/").load([
    "posx.jpg","negx.jpg",
    "posy.jpg","negy.jpg",
    "posz.jpg","negz.jpg"
]);
scene.background = cubeTexture;

 这里公园用的素材是官方案例 \examples\textures\cube\Park2 里面的素材。

2. 给材质添加环境贴图

const material = new THREE.MeshBasicMaterial({
    envMap: cubeTexture  // 给材质应用环境贴图:此时的环境的贴图就是立方纹理,所以就使用立方纹理。
});

 

也可以同时使用纹理贴图和环境贴图。

const material = new THREE.MeshBasicMaterial({
    map:texture,
    envMap: cubeTexture 
});

 

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
three.js是一个功能强大的JavaScript库,用于创建和渲染3D图形。它提供了各种方法可以对模型进行图片贴图,从而为模型增加纹理。 首先,我们需要为模型加载一个纹理图片。有两种常用的方法来加载纹理图片。一种是使用`THREE.TextureLoader`,它可以从指定的URL加载纹理图片。例如,可以使用以下代码加载一张名为`texture.png`的纹理图片: ```javascript var loader = new THREE.TextureLoader(); loader.load('texture.png', function (texture) { // 在此处使用纹理 }); ``` 另一种方法是直接创建一个纹理对象。我们可以先将图片加载为`Image`对象,然后将其传递给`THREE.Texture`的构造函数。例如,可以使用以下代码创建一个纹理对象: ```javascript var image = new Image(); image.src = 'texture.png'; var texture = new THREE.Texture(image); ``` 无论使用哪种方法,我们都可以将纹理应用于模型的材质。对于模型的每个面,我们可以将纹理设置为材质的`map`属性。例如,可以使用以下代码为一个方块模型贴上纹理: ```javascript var geometry = new THREE.BoxGeometry(); // 创建一个基本的材质,并将纹理应用于材质的map属性 var material = new THREE.MeshBasicMaterial({ map: texture }); var cube = new THREE.Mesh(geometry, material); ``` 当我们将纹理应用于模型后,模型的表面将使用纹理图片进行渲染。我们可以根据需要对纹理进行更多的调整,如旋转、重复等。可以通过设置纹理的`rotation`和`repeat`属性来实现。例如,可以使用以下代码旋转纹理: ```javascript texture.rotation = Math.PI / 4; ``` 总之,通过使用`THREE.TextureLoader`或直接创建纹理对象,我们可以将纹理图片应用于three.js模型。然后,我们可以根据需要对纹理进行进一步的调整,以实现更加逼真和个性化的渲染效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值