Threejs入门之十六:纹理贴图和纹理材质

Texture 用于创建一个纹理贴图,将其应用到一个物体的表面,纹理对象可以通过TextureLoader(纹理加载器)的load()方法来加载一个图片。要使用纹理贴图,首先要创建一个纹理加载器,纹理加载器返回一个Texture 纹理对象,通过纹理加载器加载贴图材质
然后通过设置材质的颜色贴图map属性的值为上面的Texture来调用,下面我们创建一个立方体,并给这个立方体贴上木头材质的贴图,使其变为一个木箱

import * as THREE from 'three'
// 引入轨道控制器扩展库OrbitControls.js
import { OrbitControls } from 'three/addons/controls/OrbitControls.js'
// 场景
const scene = new THREE.Scene() 
// 几何体
const geometry = new THREE.BoxGeometry(200,200,200) 
// 纹理贴图加载器
const textureLoader = new THREE.TextureLoader()
// 使用TextureLoader的.load()方法加载图像,返回一个texture纹理对象
const texture = textureLoader.load('./images/muban.jpg') 
// 材质
const material = new THREE.MeshLambertMaterial({ 
  map:texture 
})
const mesh = new THREE.Mesh(geometry,material)
scene.add(mesh)
// 灯光
const light = new THREE.AmbientLight(0xffffff,1)
scene.add(light)
// 创建点光 
const pointLight = new THREE.PointLight(0xffffff,1)
// 点光源的位置 
pointLight.position.set(100,100,100)
scene.add(pointLight)
// 相机
const camera = new THREE.PerspectiveCamera(75,600 / 400 ,1,600)
camera.position.set(200,200,200)
camera.lookAt(mesh.position) 
// 渲染器
const renderer = new THREE.WebGLRenderer() 
renderer.setSize(600,400) 
document.querySelector('#webgl').appendChild(renderer.domElement) 
const controls = new OrbitControls(camera,renderer.domElement)
function animation() {
  requestAnimationFrame(animation)
  renderer.render(scene,camera)
}
animation()

刷新浏览器看效果
在这里插入图片描述
这里需要注意,如果在材质中使用了map属性进行纹理贴图,同时又使用了color属性,则最终的显示结果是两者共同作用的结果,如把上面的材质添加颜色

const material = new THREE.MeshLambertMaterial({
  color:0x00ffff,
  map:texture
})

刷新浏览器,看到的颜色是两者共同作用的结果
在这里插入图片描述
圆形贴图
如果想实现圆形贴图,我们只需要把几何体设置为CircleGeometry并设置参数即可

const geometry = new THREE.CircleGeometry(60, 100);

在这里插入图片描述
球形贴图

const geometry = new THREE.SphereGeometry(100, 32,16);

在这里插入图片描述
顶点UV坐标
顶点UV坐标是一个取值范围在0~1之间的二维顶点坐标;顶点UV坐标的作用是从纹理贴图上提取像素,并映射到网格模型Mesh的几何体表面上;顶点UV坐标geometry.attributes.uv和顶点位置坐标geometry.attributes.position是一一对应的。
顶点UV坐标的(0,0)点对应贴图的左下角,(1,1)点对应贴图的右上角,(1,0)点对应贴图的右下角,(1,1)点对应贴图的左上角
在这里插入图片描述
通过设置类型数组来定义顶点UV坐标

const uv = new Float32Array([
  0, 0, //图片左下角
  1, 0, //图片右下角
  1, 1, //图片右上角
  0, 1, //图片左上角
])

将上面定义的uv数组作为参数传递给BufferAttribute,并指定几个数据为一组,通常是2个数据为一组,表示一个纹理的顶点坐标,来设置BufferAttribute;
通过设置geometry.attributes.uv的值为上面的BufferAttribute,来设置几何体的UV贴图

geometry.attributes.uv = new THREE.BufferAttribute(uvs, 2); //2个为一组,表示一个顶点的纹理坐标

在这里插入图片描述
如果我们不想将整个图片都贴到物体上,我们只需要左下角的四分之一贴到物体上,我们可以设置顶点UV坐标为0.5来获取四分之一贴图,

const uvs = new Float32Array([
  0, 0, //图片左下角
  0.5, 0, //图片右下角
  0.5, 0.5, //图片右上角
  0, 0.5, //图片左上角
])

在这里插入图片描述
Texture纹理的阵列
Texture纹理有两个属性定义了其在水平和垂直方向上贴图如何显示,
.wrapS : 这个值定义了纹理贴图在水平方向上将如何包裹,在UV映射中对应于U。
默认值是THREE.ClampToEdgeWrapping,即纹理边缘将被推到外部边缘的纹素。
wrapT : 这个值定义了纹理贴图在垂直方向上将如何包裹,在UV映射中对应于V。可以使用与 .wrapS : number相同的选项。
包裹模式

THREE.RepeatWrapping
THREE.ClampToEdgeWrapping
THREE.MirroredRepeatWrapping

RepeatWrapping,纹理将简单地重复到无穷大
ClampToEdgeWrapping是默认值,纹理中的最后一个像素将延伸到网格的边缘。
MirroredRepeatWrapping, 纹理将重复到无穷大,在每次重复时将进行镜像
如设置一个平面平铺上面的木头材质,可以设置贴图的wrapS 和wrapT 为RepeatWrapping,
通过设置texture.repeat.set()来设置UV两个方向纹理的重复数量

// 设置阵列模式
texture.wrapS = THREE.RepeatWrapping
texture.wrapT = THREE.RepeatWrapping
// uv两个方向纹理重复数量
texture.repeat.set(5,5)

在这里插入图片描述
关于纹理贴图和纹理材质就先到这里吧,如果你觉得有用记得点赞关注哦

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

九仞山

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

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

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

打赏作者

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

抵扣说明:

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

余额充值