// 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 };