我们还是官网搜索 MeshBasicMaterial

threejs模型贴图图片被镜像了_贴图


然后 是我们的 alphaMap 属性

这里 黑色为完全透明 白色 完全不透明

黑白之间还有灰色 这个灰色的灰值 就是透明度

threejs模型贴图图片被镜像了_贴图_02


这里 我们直接用 alphaMap 上贴图

threejs模型贴图图片被镜像了_前端_03


这样 图形就明显有些透明效果了 但是会上面也说了 他会开始转变为黑白灰色

threejs模型贴图图片被镜像了_3d_04


然后 是我们的光照贴图

threejs模型贴图图片被镜像了_threejs模型贴图图片被镜像了_05

我们这里加一下

threejs模型贴图图片被镜像了_3d_06


然后 我们图片的光照效果 就会在内部微微的显现出我们设置的 public/background.jpg

threejs模型贴图图片被镜像了_前端_07


然后 我们来看环境贴图

这里 我们需要一个HDR图片

如果没有 可以下载我的资源

HDR格式文件 WEB 3D学习工具 这里 我将它 放入项目的 public目录下

threejs模型贴图图片被镜像了_3d_08


那么 我们需要一个hdrl的加载器

import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader.js";

threejs模型贴图图片被镜像了_贴图_09


然后 找一个位置写入代码

let rgbeloader = new RGBELoader();
rgbeloader.load("./public/page.hdr",(texture) =>{
    scene.background = texture;
})

这里 我们函数 向public目录下导入 page.hdr 回调 参数 就是文件对象 然后 赋值给场景的 background属性

threejs模型贴图图片被镜像了_3d_10


运行效果如下

threejs模型贴图图片被镜像了_javascript_11


但是 这样 我们场景是不会动的 就好像是一个离谱的背景图 而我们想要的是 它跟谁我们的拖动 转动我们直接给个属性就好了

threejs模型贴图图片被镜像了_javascript_12


这样 我们拖动场景 他就会随之变化

threejs模型贴图图片被镜像了_前端_13


我们 再往右拖一拖

threejs模型贴图图片被镜像了_贴图_14


我们来回转多可以

threejs模型贴图图片被镜像了_threejs模型贴图图片被镜像了_15


然后 我们可以单独设置 我们中间这块元素的环境贴图

改写代码如下

let rgbeloader = new RGBELoader();
rgbeloader.load("./public/page.hdr",(texture) =>{
    texture.mapping = THREE.EquirectangularReflectionMapping;
    scene.background = texture;
    scene.environment = texture;
    planeMaterial.envMap = texture;
})
let planeGeometry = new THREE.PlaneGeometry(1,1);
let textureLoader = new THREE.TextureLoader();
let planeMaterial = new THREE.MeshBasicMaterial({
    color: 0xffffff,
    side: THREE.DoubleSide,
    transparent: true,
    map: textureLoader.load("./public/logo.png"),
    //lightMap: textureLoader.load("./public/background.jpg")
})

这里 我们先注释掉 lightMap 光照贴图 免得影响视觉体验

environment 设置环境贴图

然后 我们设置 planeMaterial材质的 envMap 环境贴图字段 为我们外面的场景

threejs模型贴图图片被镜像了_threejs模型贴图图片被镜像了_16


这样 我们中间这个材质 就也展现出反光的一个效果了

threejs模型贴图图片被镜像了_贴图_17


然后 我们可以通过材质 reflectivity 属性设置反射强度 值 从 0 到 1

默认值 1

这里 我们来一手 0.5

threejs模型贴图图片被镜像了_javascript_18


运行效果如下

threejs模型贴图图片被镜像了_前端_19


好 接下里 我们设置一下高光贴图

threejs模型贴图图片被镜像了_3d_20

let rgbeloader = new RGBELoader();
rgbeloader.load("./public/page.hdr",(texture) =>{
    texture.mapping = THREE.EquirectangularReflectionMapping;
    scene.background = texture;
    scene.environment = texture;
    planeMaterial.envMap = texture;
})
let planeGeometry = new THREE.PlaneGeometry(1,1);
let textureLoader = new THREE.TextureLoader();
let specularMap = textureLoader .load("./public/background.jpg")
let planeMaterial = new THREE.MeshBasicMaterial({
    color: 0xffffff,
    side: THREE.DoubleSide,
    transparent: true,
    map: textureLoader.load("./public/logo.png"),
    specularMap: specularMap
    //lightMap: textureLoader.load("./public/background.jpg")
})

我们 specularMap 导入的图片依旧是

threejs模型贴图图片被镜像了_贴图_21


光照贴图依旧注释了 也不会有影响然后 我们设置材质的 specularMap 字段

这个起到的作用就是 图片白色部分反色 黑色部分不反射

threejs模型贴图图片被镜像了_贴图_22


当然 这个效果能和材质 reflectivity 反射强多做一个叠加 你要是嫌反射太明显 可以 设置个 0.3 或者再小一些

threejs模型贴图图片被镜像了_3d_23