1.给模型对象设置纹理贴图
通过TextureLoader加载一张图片后返回一个纹理对象Texture,Texture可以作为模型材质颜色贴图.map属性的值,设置map属性后就不用再设置color属性了
var geometry = new THREE.PlaneGeometry(204, 102);
var textureLoader = new THREE.TextureLoader();
textureLoader.load('Earth.png', function(texture) {
var material = new THREE.MeshLambertMaterial({
map: texture,
});
var mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
function render() {
renderer.render(scene, camera);
render();
通过图片加载器ImageLoader可以加载一张图片,所谓纹理对象Texture简单地说就是,纹理对象Texture的.image属性值是一张图片。
var ImageLoader = new THREE.ImageLoader();
ImageLoader.load('Earth.png', function(img) {
var texture = new THREE.Texture(img);
texture.needsUpdate = true;
var material = new THREE.MeshLambertMaterial({
map: texture,
var mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
2.纹理贴图的平铺,旋转,偏移,动画
1. 平铺
var texture = textureLoader.load('太阳能板.png');
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;
texture.repeat.set(4, 2);
2 .偏移
texture.offset = new THREE.Vector2(0.3, 0.1)
2 .旋转
texture.rotation = Math.PI/4;
texture.center.set(0.5,0.5);
3 .动画
在渲染函数中周期性的改变纹理贴图的属性,重复执行渲染函数就可以实现动画
function render() {
renderer.render(scene, camera);
requestAnimationFrame(render);
texture.offset.x -= 0.06
render();
3.canvas画布、视频作为纹理贴图
4.凹凸贴图和法线贴图
这两种贴图都是为了处理模型顶点过多导致贴图不清晰的问题
var geometry = new THREE.SphereGeometry(100, 25, 25);
var textureLoader = new THREE.TextureLoader();
var texture = textureLoader.load('./Earth.png');
var textureNormal = textureLoader.load('./EarthNormal.png');
var material = new THREE.MeshPhongMaterial({
map: texture,
normalMap: textureNormal,
normalScale: new THREE.Vector2(1.2, 1.2),
});
var textureLoader = new THREE.TextureLoader();
var texture = textureLoader.load('./凹凸贴图/diffuse.jpg');
var textureBump = textureLoader.load('./凹凸贴图/bump.jpg');
var material = new THREE.MeshPhongMaterial({
map: texture,
bumpMap:textureBump,
bumpScale:3,
});
5.光照贴图(给模型添加阴影)
三维模型加载器可以自动设置,不需要程序员通过代码去设置,但还是操作一下
var planeGeometry = new THREE.PlaneGeometry(300, 200);
planeGeometry.faceVertexUvs[1] = planeGeometry.faceVertexUvs[0];
var textureLoader = new THREE.TextureLoader();
var textureLight = textureLoader.load('shadow.png');
var planeMaterial = new THREE.MeshLambertMaterial({
color: 0x999999,
lightMap:textureLight,
var planeMesh = new THREE.Mesh(planeGeometry, planeMaterial);
Geometry属性.faceVertexUvs
一般几何体有两套UV坐标,对于Geometry类型几何体而言
Geometry.faceVertexUvs[0]包含的纹理坐标用于颜色贴图map、法线贴图normalMap等,Geometry.faceVertexUvs[1]包含的第二套纹理贴图用于光照贴图
一般通过Threejs几何体API创建的几何体默认只有一组纹理坐标Geometry.faceVertexUvs[0],所以为了设置光照阴影贴图,需要给另一组纹理坐标赋值Geometry.faceVertexUvs[1] = Geometry.faceVertexUvs[0];
BufferGeometry属性.uv和.uv2
一般通过Threejs加载外部模型,解析三维模型数据得到的几何体类型是缓冲类型几何体BufferGeometry,对于BufferGeometry而言两套纹理坐标分别通过.uv和.uv2属性表示。
geometry.attributes.uv2 = geometry.attributes.uv;
6.高光贴图(设置模型不同区域的亮度值)
设置模型不同区域的亮度值,(高光贴图属性.specularMap和高光属性.specular是对应的,也就是说只有高光网格材质对象MeshPhongMaterial才具备高光贴图属性.specularMap)
var texture = textureLoader.load('earth_diffuse.png');
var textureSpecular = textureLoader.load('earth_specular.png');
var material = new THREE.MeshPhongMaterial({
shininess: 30,
map: texture,
specularMap: textureSpecular,
});
7.环境贴图(给模型的周围环境添加贴图)
首先引入CubeTextureLoader(只有环境贴图用CubeTextureLoader,其他贴图用的是TextureLoader),然后给材质对象设置envMap属性,一般情况下高光网格材质MeshPhongMaterial和物理PBR材质MeshStandardMaterial会使用环境贴图
var geometry = new THREE.BoxGeometry(100, 100, 100);
var loader = new THREE.CubeTextureLoader();
loader.setPath('环境贴图/');
var CubeTexture = loader.load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg']);
var material = new THREE.MeshPhongMaterial({
envMap: CubeTexture,