Three.js set model material texture map and modify material color, material transparency, material grid

Use of related APIs:

1 traverse (model loop traversal method)

2. THREE.TextureLoader (for loading and processing image textures)

3. THREE.MeshLambertMaterial (for creating materials)

4. getObjectByProperty (obtain material information through the property value of the material)

Add onSetSystemModelMap (method for setting model material) and onSetModelMaterial (method for setting material properties) based on the previous article on Three.js loading external glb, fbx, gltf, obj model files.
First, get all the materials of the current model in the setModel method ( traverse )

setModel({
     
      filePath, fileType, scale,  position }) {
    
    
		return new Promise((resolve, reject) => {
    
    
			const loader = this.fileLoaderMap[fileType]
			loader.load(filePath, (result) => {
    
    
			  //加载不同类型的文件
				switch (fileType) {
    
    
					case 'glb':
						this.model = result.scene		
						break;
					case 'fbx':
						this.model = result
						break;
					case 'gltf':
						this.model = result.scene
						break;
					case 'obj':
						this.model = result
						break;
					default:
						break;
				}
				this.model.traverse((v) => {
    
    
					const {
    
     uuid } = v
					if (v.isMesh &&  v.materia) {
    
    
					  this.modelMaterialList.push(v)
					}
				})
				// 设置模型大小
				if (scale) {
    
    
					this.model.scale.set(scale, scale, scale);
				}
				// 设置模型位置 
				if (position) {
    
    
					const {
    
     x, y, z } = position
					this.model.position.set(x, y, z)
				}
				// 设置相机位置
				this.camera.position.set(0, 2, 6)
				// 设置相机坐标系
				this.camera.lookAt(0, 0, 0)
	             // 将模型添加到场景中去   
				this.scene.add(this.model)
				resolve(true)
			}, () => {
    
    

			}, (err) => {
    
    
				console.log(err)
				reject()
			})
		})
	}

Pass in the uuid through the getObjectByProperty method to get the current material information
and set the model texture

	onSetSystemModelMap({
     
      url }) {
    
    
	   // 当前uuid 
		const uuid = store.state.selectMesh.uuid
		// 通过uuid 获取需要设置的材质
		const mesh = this.scene.getObjectByProperty('uuid', uuid)
		const {
    
     name, color } = mesh.material
		// 获取到贴图 url(图片实际地址)
		const mapTexture = new THREE.TextureLoader().load(url)
		mesh.material = new THREE.MeshLambertMaterial({
    
    
			map: mapTexture,
			transparent: true, // 允许材质可透明
			color,
			name,
		})
	}

Set material properties

	// 设置材质属性
	onSetModelMaterial(config) {
    
    
		const {
    
     color, wireframe, depthWrite, opacity } = config
		const uuid = store.state.selectMesh.uuid
		const mesh = this.scene.getObjectByProperty('uuid', uuid)
		if (mesh && mesh.material) {
    
    
			//设置材质颜色
			mesh.material.color.set(new THREE.Color(color))
			//设置网格
			mesh.material.wireframe = wireframe
			// 设置深度写入
			mesh.material.depthWrite = depthWrite
			//设置透明度
			mesh.material.transparent = true
			mesh.material.opacity = opacity
		}
	}

The complete code can refer to: https://gitee.com/ZHANG_6666/Three.js3D/blob/master/src/views/renderModel.js

Interface effect:
insert image description here
insert image description here

Guess you like

Origin blog.csdn.net/weixin_43835425/article/details/132199740