123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- // src/utils/three/materials/materialManager.js
- import * as THREE from 'three';
- // 基础材质预设
- export const materialPresets = {
- standard: (params = {}) => new THREE.MeshStandardMaterial({
- color: 0xffffff,
- roughness: 0.7,
- metalness: 0.3,
- ...params
- }),
- phong: (params = {}) => new THREE.MeshPhongMaterial({
- color: 0xffffff,
- specular: 0x111111,
- shininess: 30,
- ...params
- }),
- basic: (params = {}) => new THREE.MeshBasicMaterial({
- color: 0xffffff,
- ...params
- }),
- lambert: (params = {}) => new THREE.MeshLambertMaterial({
- color: 0xffffff,
- ...params
- }),
- physical: (params = {}) => new THREE.MeshPhysicalMaterial({
- color: 0xffffff,
- roughness: 0.5,
- metalness: 0.5,
- clearcoat: 1,
- clearcoatRoughness: 0.1,
- ...params
- })
- };
- /**
- * 创建材质
- * @param {string} type - 材质类型 (standard/phong/basic/lambert/physical)
- * @param {Object} params - 材质参数
- * @returns {THREE.Material} 材质实例
- */
- export const createMaterial = (type = 'standard', params = {}) => {
- const preset = materialPresets[type.toLowerCase()];
- if (!preset) {
- console.warn(`Unknown material type: ${type}. Falling back to standard`);
- return materialPresets.standard(params);
- }
- return preset(params);
- };
- /**
- * 更新材质
- * @param {THREE.Material} material - 要更新的材质
- * @param {Object} params - 新参数
- */
- export const updateMaterial = (material, params) => {
- if (!material) return;
-
- Object.keys(params).forEach(key => {
- if (material[key] !== undefined) {
- // 特殊处理颜色属性
- if (key === 'color' && params[key] !== undefined) {
- material.color.set(params[key]);
- } else {
- material[key] = params[key];
- }
- }
- });
-
- material.needsUpdate = true;
- };
- /**
- * 克隆材质
- * @param {THREE.Material} material - 要克隆的材质
- * @returns {THREE.Material} 新材质实例
- */
- export const cloneMaterial = (material) => {
- return material.clone();
- };
- /**
- * 销毁材质
- * @param {THREE.Material} material - 要销毁的材质
- */
- export const disposeMaterial = (material) => {
- if (material) {
- material.dispose();
- }
- };
- // 统一导出
- export default {
- createMaterial,
- updateMaterial,
- cloneMaterial,
- disposeMaterial,
- presets: materialPresets
- };
|