materialManager.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // src/utils/three/materials/materialManager.js
  2. import * as THREE from 'three';
  3. // 基础材质预设
  4. export const materialPresets = {
  5. standard: (params = {}) => new THREE.MeshStandardMaterial({
  6. color: 0xffffff,
  7. roughness: 0.7,
  8. metalness: 0.3,
  9. ...params
  10. }),
  11. phong: (params = {}) => new THREE.MeshPhongMaterial({
  12. color: 0xffffff,
  13. specular: 0x111111,
  14. shininess: 30,
  15. ...params
  16. }),
  17. basic: (params = {}) => new THREE.MeshBasicMaterial({
  18. color: 0xffffff,
  19. ...params
  20. }),
  21. lambert: (params = {}) => new THREE.MeshLambertMaterial({
  22. color: 0xffffff,
  23. ...params
  24. }),
  25. physical: (params = {}) => new THREE.MeshPhysicalMaterial({
  26. color: 0xffffff,
  27. roughness: 0.5,
  28. metalness: 0.5,
  29. clearcoat: 1,
  30. clearcoatRoughness: 0.1,
  31. ...params
  32. })
  33. };
  34. /**
  35. * 创建材质
  36. * @param {string} type - 材质类型 (standard/phong/basic/lambert/physical)
  37. * @param {Object} params - 材质参数
  38. * @returns {THREE.Material} 材质实例
  39. */
  40. export const createMaterial = (type = 'standard', params = {}) => {
  41. const preset = materialPresets[type.toLowerCase()];
  42. if (!preset) {
  43. console.warn(`Unknown material type: ${type}. Falling back to standard`);
  44. return materialPresets.standard(params);
  45. }
  46. return preset(params);
  47. };
  48. /**
  49. * 更新材质
  50. * @param {THREE.Material} material - 要更新的材质
  51. * @param {Object} params - 新参数
  52. */
  53. export const updateMaterial = (material, params) => {
  54. if (!material) return;
  55. Object.keys(params).forEach(key => {
  56. if (material[key] !== undefined) {
  57. // 特殊处理颜色属性
  58. if (key === 'color' && params[key] !== undefined) {
  59. material.color.set(params[key]);
  60. } else {
  61. material[key] = params[key];
  62. }
  63. }
  64. });
  65. material.needsUpdate = true;
  66. };
  67. /**
  68. * 克隆材质
  69. * @param {THREE.Material} material - 要克隆的材质
  70. * @returns {THREE.Material} 新材质实例
  71. */
  72. export const cloneMaterial = (material) => {
  73. return material.clone();
  74. };
  75. /**
  76. * 销毁材质
  77. * @param {THREE.Material} material - 要销毁的材质
  78. */
  79. export const disposeMaterial = (material) => {
  80. if (material) {
  81. material.dispose();
  82. }
  83. };
  84. // 统一导出
  85. export default {
  86. createMaterial,
  87. updateMaterial,
  88. cloneMaterial,
  89. disposeMaterial,
  90. presets: materialPresets
  91. };