1909 lines
70 KiB
Python
1909 lines
70 KiB
Python
"""
|
|
布料材质系统
|
|
提供布料材质的定义和管理
|
|
包含完整的物理和视觉属性定义
|
|
"""
|
|
|
|
from panda3d.core import Vec4, Vec3
|
|
from typing import Dict, Any, List, Optional
|
|
import math
|
|
|
|
|
|
class ClothMaterial:
|
|
"""
|
|
布料材质类
|
|
定义布料的物理和视觉属性,包含完整的材料科学参数
|
|
"""
|
|
|
|
# 预定义的布料材质类型
|
|
TYPE_COTTON = "cotton"
|
|
TYPE_SILK = "silk"
|
|
TYPE_LEATHER = "leather"
|
|
TYPE_RUBBER = "rubber"
|
|
TYPE_DENIM = "denim"
|
|
TYPE_LINEN = "linen"
|
|
TYPE_WOOL = "wool"
|
|
TYPE_SYNTHETIC = "synthetic"
|
|
TYPE_MESH = "mesh"
|
|
TYPE_CANVAS = "canvas"
|
|
TYPE_NYLON = "nylon"
|
|
TYPE_POLYESTER = "polyester"
|
|
TYPE_SATIN = "satin"
|
|
TYPE_TERRY = "terry"
|
|
TYPE_FLEECE = "fleece"
|
|
TYPE_NEOPRENE = "neoprene"
|
|
TYPE_SPANDEX = "spandex"
|
|
TYPE_TWEED = "tweed"
|
|
TYPE_TULLE = "tulle"
|
|
TYPE_VELVET = "velvet"
|
|
TYPE_SUEDE = "suede"
|
|
|
|
# 材质行为特性
|
|
BEHAVIOR_DEFAULT = "default"
|
|
BEHAVIOR_STIFF = "stiff"
|
|
BEHAVIOR_FLEXIBLE = "flexible"
|
|
BEHAVIOR_ELASTIC = "elastic"
|
|
BEHAVIOR_HEAVY = "heavy"
|
|
BEHAVIOR_LIGHT = "light"
|
|
|
|
def __init__(self, name: str, material_type: str = TYPE_COTTON,
|
|
physical_params: Dict[str, float] = None,
|
|
visual_params: Dict[str, Any] = None,
|
|
advanced_params: Dict[str, Any] = None):
|
|
"""
|
|
初始化布料材质
|
|
|
|
Args:
|
|
name: 材质名称
|
|
material_type: 材质类型
|
|
physical_params: 物理参数字典
|
|
visual_params: 视觉参数字典
|
|
advanced_params: 高级参数字典
|
|
"""
|
|
self.name = name
|
|
self.material_type = material_type
|
|
self.behavior_mode = self.BEHAVIOR_DEFAULT
|
|
|
|
# 默认物理参数(基础物理属性)
|
|
self.default_physical_params = {
|
|
'density': 0.6, # 密度 (kg/m³)
|
|
'linear_stiffness': 0.7, # 线性刚度
|
|
'angular_stiffness': 0.6, # 角度刚度
|
|
'volume_stiffness': 0.4, # 体积保持刚度
|
|
'friction': 0.6, # 摩擦系数
|
|
'restitution': 0.1, # 恢复系数
|
|
'pressure_coefficient': 0.0, # 压力系数
|
|
'drag_coefficient': 0.02, # 阻力系数
|
|
'lift_coefficient': 0.01, # 升力系数
|
|
'bend_stiffness': 0.5, # 弯曲刚度
|
|
'damping': 0.01, # 阻尼系数
|
|
'plastic_threshold': 0.1, # 塑性阈值
|
|
'plastic_stiffness': 0.5, # 塑性刚度
|
|
'tear_threshold': 100.0, # 撕裂阈值
|
|
'tear_resistance': 50.0, # 撕裂阻力
|
|
'anisotropic_friction': [0.6, 0.6, 0.6], # 各向异性摩擦
|
|
'dynamic_friction': 0.6, # 动态摩擦系数
|
|
'static_friction': 0.7, # 静态摩擦系数
|
|
'rolling_friction': 0.1, # 滚动摩擦系数
|
|
'spinning_friction': 0.05, # 自旋摩擦系数
|
|
'viscosity': 0.01, # 粘度
|
|
'compressibility': 0.1, # 可压缩性
|
|
'shear_modulus': 0.7, # 剪切模量
|
|
'bulk_modulus': 1.2, # 体积模量
|
|
'youngs_modulus': 1.0, # 杨氏模量
|
|
'poisson_ratio': 0.4 # 泊松比
|
|
}
|
|
|
|
# 默认视觉参数
|
|
self.default_visual_params = {
|
|
'color': Vec4(0.8, 0.8, 0.8, 1.0), # 颜色
|
|
'roughness': 0.7, # 粗糙度
|
|
'metallic': 0.0, # 金属度
|
|
'specular': 0.2, # 镜面反射
|
|
'texture_scale': 1.0, # 纹理缩放
|
|
'normal_strength': 1.0, # 法线强度
|
|
'emissive': Vec4(0, 0, 0, 0), # 自发光
|
|
'opacity': 1.0, # 不透明度
|
|
'transmission': 0.0, # 透射
|
|
'anisotropy': 0.0, # 各向异性
|
|
'clearcoat': 0.0, # 清漆层
|
|
'clearcoat_roughness': 0.0, # 清漆粗糙度
|
|
'sheen': 0.0, # 光泽
|
|
'sheen_roughness': 0.0, # 光泽粗糙度
|
|
'subsurface': 0.0, # 次表面散射
|
|
'subsurface_color': Vec4(1, 1, 1, 1), # 次表面颜色
|
|
'thickness': 1.0 # 厚度
|
|
}
|
|
|
|
# 默认高级参数
|
|
self.default_advanced_params = {
|
|
'temperature_sensitivity': 0.0, # 温度敏感性
|
|
'humidity_sensitivity': 0.0, # 湿度敏感性
|
|
'aging_factor': 0.0, # 老化因子
|
|
'stretch_recovery': 0.8, # 拉伸恢复
|
|
'compression_recovery': 0.8, # 压缩恢复
|
|
'fatigue_resistance': 0.9, # 疲劳抗性
|
|
'abrasion_resistance': 0.8, # 耐磨性
|
|
'chemical_resistance': 0.7, # 化学抗性
|
|
'uv_resistance': 0.6, # 紫外线抗性
|
|
'flame_resistance': 0.5, # 阻燃性
|
|
'water_absorption': 0.1, # 吸水性
|
|
'air_permeability': 0.5, # 透气性
|
|
'thermal_conductivity': 0.1, # 热导率
|
|
'electrical_conductivity': 0.0, # 电导率
|
|
'magnetic_permeability': 1.0, # 磁导率
|
|
'radiation_absorption': 0.1, # 辐射吸收
|
|
'biodegradability': 0.3, # 生物降解性
|
|
'recyclability': 0.8 # 可回收性
|
|
}
|
|
|
|
# 合并参数
|
|
self.physical_params = self.default_physical_params.copy()
|
|
if physical_params:
|
|
self.physical_params.update(physical_params)
|
|
|
|
self.visual_params = self.default_visual_params.copy()
|
|
if visual_params:
|
|
self.visual_params.update(visual_params)
|
|
|
|
self.advanced_params = self.default_advanced_params.copy()
|
|
if advanced_params:
|
|
self.advanced_params.update(advanced_params)
|
|
|
|
# 材质状态
|
|
self.temperature = 20.0 # 摄氏度
|
|
self.humidity = 50.0 # 相对湿度百分比
|
|
self.age = 0.0 # 使用年限
|
|
self.wear_level = 0.0 # 磨损程度 (0-1)
|
|
|
|
def get_physical_parameters(self) -> Dict[str, float]:
|
|
"""
|
|
获取物理参数(考虑环境和老化影响)
|
|
|
|
Returns:
|
|
物理参数字典
|
|
"""
|
|
# 应用环境和老化效应
|
|
adjusted_params = self.physical_params.copy()
|
|
|
|
# 温度影响
|
|
temp_sensitivity = self.advanced_params.get('temperature_sensitivity', 0.0)
|
|
temp_factor = 1.0 + (self.temperature - 20.0) * temp_sensitivity * 0.01
|
|
adjusted_params['linear_stiffness'] *= temp_factor
|
|
adjusted_params['angular_stiffness'] *= temp_factor
|
|
|
|
# 湿度影响
|
|
humidity_sensitivity = self.advanced_params.get('humidity_sensitivity', 0.0)
|
|
humidity_factor = 1.0 + (self.humidity - 50.0) * humidity_sensitivity * 0.01
|
|
adjusted_params['density'] *= humidity_factor
|
|
|
|
# 老化影响
|
|
aging_factor = self.advanced_params.get('aging_factor', 0.0)
|
|
aging_multiplier = 1.0 - self.age * aging_factor * 0.01
|
|
adjusted_params['linear_stiffness'] *= aging_multiplier
|
|
adjusted_params['restitution'] *= aging_multiplier
|
|
|
|
# 磨损影响
|
|
adjusted_params['friction'] *= (1.0 - self.wear_level * 0.2)
|
|
adjusted_params['tear_resistance'] *= (1.0 - self.wear_level * 0.5)
|
|
|
|
return adjusted_params
|
|
|
|
def get_visual_parameters(self) -> Dict[str, Any]:
|
|
"""
|
|
获取视觉参数(考虑磨损和老化影响)
|
|
|
|
Returns:
|
|
视觉参数字典
|
|
"""
|
|
adjusted_params = self.visual_params.copy()
|
|
|
|
# 磨损影响颜色和粗糙度
|
|
if self.wear_level > 0:
|
|
# 颜色变暗
|
|
color = adjusted_params['color']
|
|
darkening = 1.0 - self.wear_level * 0.2
|
|
adjusted_params['color'] = Vec4(
|
|
color[0] * darkening,
|
|
color[1] * darkening,
|
|
color[2] * darkening,
|
|
color[3]
|
|
)
|
|
|
|
# 增加粗糙度
|
|
adjusted_params['roughness'] = min(1.0,
|
|
adjusted_params['roughness'] + self.wear_level * 0.3)
|
|
|
|
# 老化影响
|
|
aging_darkening = self.age * 0.05
|
|
if aging_darkening > 0:
|
|
color = adjusted_params['color']
|
|
adjusted_params['color'] = Vec4(
|
|
max(0.0, color[0] - aging_darkening),
|
|
max(0.0, color[1] - aging_darkening),
|
|
max(0.0, color[2] - aging_darkening),
|
|
color[3]
|
|
)
|
|
|
|
return adjusted_params
|
|
|
|
def get_advanced_parameters(self) -> Dict[str, Any]:
|
|
"""
|
|
获取高级参数
|
|
|
|
Returns:
|
|
高级参数字典
|
|
"""
|
|
return self.advanced_params.copy()
|
|
|
|
def update_physical_parameter(self, param_name: str, value: float) -> bool:
|
|
"""
|
|
更新物理参数
|
|
|
|
Args:
|
|
param_name: 参数名称
|
|
value: 参数值
|
|
|
|
Returns:
|
|
是否更新成功
|
|
"""
|
|
if param_name in self.physical_params:
|
|
self.physical_params[param_name] = value
|
|
return True
|
|
return False
|
|
|
|
def update_visual_parameter(self, param_name: str, value) -> bool:
|
|
"""
|
|
更新视觉参数
|
|
|
|
Args:
|
|
param_name: 参数名称
|
|
value: 参数值
|
|
|
|
Returns:
|
|
是否更新成功
|
|
"""
|
|
if param_name in self.visual_params:
|
|
self.visual_params[param_name] = value
|
|
return True
|
|
return False
|
|
|
|
def update_advanced_parameter(self, param_name: str, value) -> bool:
|
|
"""
|
|
更新高级参数
|
|
|
|
Args:
|
|
param_name: 参数名称
|
|
value: 参数值
|
|
|
|
Returns:
|
|
是否更新成功
|
|
"""
|
|
if param_name in self.advanced_params:
|
|
self.advanced_params[param_name] = value
|
|
return True
|
|
return False
|
|
|
|
def set_environment_conditions(self, temperature: float = None,
|
|
humidity: float = None):
|
|
"""
|
|
设置环境条件
|
|
|
|
Args:
|
|
temperature: 温度 (摄氏度)
|
|
humidity: 湿度 (相对湿度百分比)
|
|
"""
|
|
if temperature is not None:
|
|
self.temperature = temperature
|
|
if humidity is not None:
|
|
self.humidity = max(0.0, min(100.0, humidity))
|
|
|
|
def simulate_aging(self, years: float):
|
|
"""
|
|
模拟材料老化
|
|
|
|
Args:
|
|
years: 老化年数
|
|
"""
|
|
self.age += years
|
|
self.age = max(0.0, self.age)
|
|
|
|
def simulate_wear(self, wear_amount: float):
|
|
"""
|
|
模拟材料磨损
|
|
|
|
Args:
|
|
wear_amount: 磨损量 (0-1)
|
|
"""
|
|
self.wear_level += wear_amount
|
|
self.wear_level = max(0.0, min(1.0, self.wear_level))
|
|
|
|
def set_behavior_mode(self, behavior_mode: str):
|
|
"""
|
|
设置行为模式
|
|
|
|
Args:
|
|
behavior_mode: 行为模式
|
|
"""
|
|
self.behavior_mode = behavior_mode
|
|
|
|
def get_material_properties_summary(self) -> Dict[str, Any]:
|
|
"""
|
|
获取材料属性摘要
|
|
|
|
Returns:
|
|
属性摘要字典
|
|
"""
|
|
return {
|
|
'name': self.name,
|
|
'type': self.material_type,
|
|
'behavior_mode': self.behavior_mode,
|
|
'environment': {
|
|
'temperature': self.temperature,
|
|
'humidity': self.humidity
|
|
},
|
|
'condition': {
|
|
'age': self.age,
|
|
'wear_level': self.wear_level
|
|
},
|
|
'physical_properties': {
|
|
'density': self.physical_params['density'],
|
|
'stiffness': self.physical_params['linear_stiffness'],
|
|
'elasticity': self.physical_params['youngs_modulus'],
|
|
'friction': self.physical_params['friction'],
|
|
'tear_resistance': self.physical_params['tear_resistance']
|
|
},
|
|
'visual_properties': {
|
|
'color': self.visual_params['color'],
|
|
'roughness': self.visual_params['roughness'],
|
|
'metallic': self.visual_params['metallic']
|
|
},
|
|
'advanced_properties': {
|
|
'durability': self.advanced_params['fatigue_resistance'],
|
|
'chemical_resistance': self.advanced_params['chemical_resistance'],
|
|
'uv_resistance': self.advanced_params['uv_resistance']
|
|
}
|
|
}
|
|
|
|
|
|
class ClothMaterialManager:
|
|
"""
|
|
布料材质管理器
|
|
管理和提供预定义的布料材质,支持材质混合和自定义
|
|
"""
|
|
|
|
def __init__(self):
|
|
self.materials: Dict[str, ClothMaterial] = {}
|
|
self.material_combinations: Dict[str, Dict[str, Any]] = {}
|
|
self._init_default_materials()
|
|
|
|
def _init_default_materials(self):
|
|
"""
|
|
初始化默认布料材质
|
|
"""
|
|
# 棉布 - 天然纤维,透气性好
|
|
cotton = ClothMaterial(
|
|
"Cotton",
|
|
ClothMaterial.TYPE_COTTON,
|
|
{
|
|
'density': 0.6,
|
|
'linear_stiffness': 0.7,
|
|
'angular_stiffness': 0.6,
|
|
'volume_stiffness': 0.4,
|
|
'friction': 0.6,
|
|
'restitution': 0.1,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.02,
|
|
'lift_coefficient': 0.01,
|
|
'bend_stiffness': 0.5,
|
|
'damping': 0.01,
|
|
'plastic_threshold': 0.1,
|
|
'plastic_stiffness': 0.5,
|
|
'tear_threshold': 100.0,
|
|
'tear_resistance': 50.0,
|
|
'anisotropic_friction': [0.6, 0.6, 0.6],
|
|
'dynamic_friction': 0.6,
|
|
'static_friction': 0.7,
|
|
'rolling_friction': 0.1,
|
|
'spinning_friction': 0.05,
|
|
'viscosity': 0.01,
|
|
'compressibility': 0.1,
|
|
'shear_modulus': 0.7,
|
|
'bulk_modulus': 1.2,
|
|
'youngs_modulus': 1.0,
|
|
'poisson_ratio': 0.4
|
|
},
|
|
{
|
|
'color': Vec4(0.9, 0.9, 0.85, 1.0),
|
|
'roughness': 0.8,
|
|
'metallic': 0.0,
|
|
'specular': 0.1,
|
|
'texture_scale': 1.0,
|
|
'normal_strength': 0.8
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.1,
|
|
'humidity_sensitivity': 0.3,
|
|
'aging_factor': 0.2,
|
|
'stretch_recovery': 0.8,
|
|
'compression_recovery': 0.8,
|
|
'fatigue_resistance': 0.7,
|
|
'abrasion_resistance': 0.6,
|
|
'chemical_resistance': 0.5,
|
|
'uv_resistance': 0.4,
|
|
'flame_resistance': 0.6,
|
|
'water_absorption': 0.8,
|
|
'air_permeability': 0.9,
|
|
'thermal_conductivity': 0.1,
|
|
'biodegradability': 0.9,
|
|
'recyclability': 0.8
|
|
}
|
|
)
|
|
|
|
# 丝绸 - 光滑、柔软、有光泽
|
|
silk = ClothMaterial(
|
|
"Silk",
|
|
ClothMaterial.TYPE_SILK,
|
|
{
|
|
'density': 0.3,
|
|
'linear_stiffness': 0.5,
|
|
'angular_stiffness': 0.4,
|
|
'volume_stiffness': 0.2,
|
|
'friction': 0.2,
|
|
'restitution': 0.3,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.05,
|
|
'lift_coefficient': 0.03,
|
|
'bend_stiffness': 0.3,
|
|
'damping': 0.005,
|
|
'plastic_threshold': 0.05,
|
|
'plastic_stiffness': 0.3,
|
|
'tear_threshold': 80.0,
|
|
'tear_resistance': 30.0,
|
|
'anisotropic_friction': [0.2, 0.2, 0.2],
|
|
'dynamic_friction': 0.2,
|
|
'static_friction': 0.3,
|
|
'rolling_friction': 0.05,
|
|
'spinning_friction': 0.02,
|
|
'viscosity': 0.005,
|
|
'compressibility': 0.05,
|
|
'shear_modulus': 0.4,
|
|
'bulk_modulus': 0.9,
|
|
'youngs_modulus': 0.6,
|
|
'poisson_ratio': 0.35
|
|
},
|
|
{
|
|
'color': Vec4(0.95, 0.95, 0.9, 1.0),
|
|
'roughness': 0.3,
|
|
'metallic': 0.1,
|
|
'specular': 0.4,
|
|
'texture_scale': 0.5,
|
|
'normal_strength': 0.5,
|
|
'sheen': 0.8,
|
|
'sheen_roughness': 0.2
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.05,
|
|
'humidity_sensitivity': 0.2,
|
|
'aging_factor': 0.1,
|
|
'stretch_recovery': 0.9,
|
|
'compression_recovery': 0.9,
|
|
'fatigue_resistance': 0.6,
|
|
'abrasion_resistance': 0.4,
|
|
'chemical_resistance': 0.3,
|
|
'uv_resistance': 0.2,
|
|
'flame_resistance': 0.7,
|
|
'water_absorption': 0.6,
|
|
'air_permeability': 0.7,
|
|
'thermal_conductivity': 0.05,
|
|
'biodegradability': 0.8,
|
|
'recyclability': 0.7
|
|
}
|
|
)
|
|
|
|
# 皮革 - 坚韧、耐用
|
|
leather = ClothMaterial(
|
|
"Leather",
|
|
ClothMaterial.TYPE_LEATHER,
|
|
{
|
|
'density': 0.8,
|
|
'linear_stiffness': 0.9,
|
|
'angular_stiffness': 0.8,
|
|
'volume_stiffness': 0.6,
|
|
'friction': 0.7,
|
|
'restitution': 0.1,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.01,
|
|
'lift_coefficient': 0.005,
|
|
'bend_stiffness': 0.8,
|
|
'damping': 0.015,
|
|
'plastic_threshold': 0.2,
|
|
'plastic_stiffness': 0.7,
|
|
'tear_threshold': 150.0,
|
|
'tear_resistance': 80.0,
|
|
'anisotropic_friction': [0.7, 0.7, 0.7],
|
|
'dynamic_friction': 0.7,
|
|
'static_friction': 0.8,
|
|
'rolling_friction': 0.15,
|
|
'spinning_friction': 0.08,
|
|
'viscosity': 0.015,
|
|
'compressibility': 0.15,
|
|
'shear_modulus': 0.8,
|
|
'bulk_modulus': 1.1,
|
|
'youngs_modulus': 0.85,
|
|
'poisson_ratio': 0.42
|
|
},
|
|
{
|
|
'color': Vec4(0.8, 0.6, 0.4, 1.0),
|
|
'roughness': 0.6,
|
|
'metallic': 0.0,
|
|
'specular': 0.2,
|
|
'texture_scale': 2.0,
|
|
'normal_strength': 1.2
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.02,
|
|
'humidity_sensitivity': 0.1,
|
|
'aging_factor': 0.05,
|
|
'stretch_recovery': 0.7,
|
|
'compression_recovery': 0.7,
|
|
'fatigue_resistance': 0.9,
|
|
'abrasion_resistance': 0.9,
|
|
'chemical_resistance': 0.8,
|
|
'uv_resistance': 0.7,
|
|
'flame_resistance': 0.8,
|
|
'water_absorption': 0.3,
|
|
'air_permeability': 0.2,
|
|
'thermal_conductivity': 0.15,
|
|
'biodegradability': 0.4,
|
|
'recyclability': 0.6
|
|
}
|
|
)
|
|
|
|
# 橡胶 - 弹性、防水
|
|
rubber = ClothMaterial(
|
|
"Rubber",
|
|
ClothMaterial.TYPE_RUBBER,
|
|
{
|
|
'density': 1.2,
|
|
'linear_stiffness': 0.95,
|
|
'angular_stiffness': 0.9,
|
|
'volume_stiffness': 0.8,
|
|
'friction': 0.8,
|
|
'restitution': 0.4,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.005,
|
|
'lift_coefficient': 0.002,
|
|
'bend_stiffness': 0.9,
|
|
'damping': 0.02,
|
|
'plastic_threshold': 0.3,
|
|
'plastic_stiffness': 0.8,
|
|
'tear_threshold': 200.0,
|
|
'tear_resistance': 100.0,
|
|
'anisotropic_friction': [0.8, 0.8, 0.8],
|
|
'dynamic_friction': 0.8,
|
|
'static_friction': 0.9,
|
|
'rolling_friction': 0.2,
|
|
'spinning_friction': 0.1,
|
|
'viscosity': 0.02,
|
|
'compressibility': 0.2,
|
|
'shear_modulus': 0.9,
|
|
'bulk_modulus': 1.5,
|
|
'youngs_modulus': 1.2,
|
|
'poisson_ratio': 0.45
|
|
},
|
|
{
|
|
'color': Vec4(0.3, 0.3, 0.3, 1.0),
|
|
'roughness': 0.9,
|
|
'metallic': 0.0,
|
|
'specular': 0.1,
|
|
'texture_scale': 0.3,
|
|
'normal_strength': 0.3
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.15,
|
|
'humidity_sensitivity': 0.05,
|
|
'aging_factor': 0.3,
|
|
'stretch_recovery': 0.95,
|
|
'compression_recovery': 0.95,
|
|
'fatigue_resistance': 0.8,
|
|
'abrasion_resistance': 0.7,
|
|
'chemical_resistance': 0.9,
|
|
'uv_resistance': 0.6,
|
|
'flame_resistance': 0.9,
|
|
'water_absorption': 0.1,
|
|
'air_permeability': 0.0,
|
|
'thermal_conductivity': 0.2,
|
|
'biodegradability': 0.2,
|
|
'recyclability': 0.5
|
|
}
|
|
)
|
|
|
|
# 牛仔布 - 坚韧、耐磨
|
|
denim = ClothMaterial(
|
|
"Denim",
|
|
ClothMaterial.TYPE_DENIM,
|
|
{
|
|
'density': 0.7,
|
|
'linear_stiffness': 0.8,
|
|
'angular_stiffness': 0.7,
|
|
'volume_stiffness': 0.5,
|
|
'friction': 0.65,
|
|
'restitution': 0.15,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.015,
|
|
'lift_coefficient': 0.008,
|
|
'bend_stiffness': 0.6,
|
|
'damping': 0.012,
|
|
'plastic_threshold': 0.15,
|
|
'plastic_stiffness': 0.6,
|
|
'tear_threshold': 120.0,
|
|
'tear_resistance': 60.0,
|
|
'anisotropic_friction': [0.65, 0.65, 0.65],
|
|
'dynamic_friction': 0.65,
|
|
'static_friction': 0.75,
|
|
'rolling_friction': 0.12,
|
|
'spinning_friction': 0.06,
|
|
'viscosity': 0.012,
|
|
'compressibility': 0.12,
|
|
'shear_modulus': 0.65,
|
|
'bulk_modulus': 1.0,
|
|
'youngs_modulus': 0.75,
|
|
'poisson_ratio': 0.38
|
|
},
|
|
{
|
|
'color': Vec4(0.4, 0.5, 0.7, 1.0),
|
|
'roughness': 0.7,
|
|
'metallic': 0.0,
|
|
'specular': 0.15,
|
|
'texture_scale': 1.5,
|
|
'normal_strength': 1.0
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.08,
|
|
'humidity_sensitivity': 0.15,
|
|
'aging_factor': 0.1,
|
|
'stretch_recovery': 0.75,
|
|
'compression_recovery': 0.75,
|
|
'fatigue_resistance': 0.8,
|
|
'abrasion_resistance': 0.8,
|
|
'chemical_resistance': 0.6,
|
|
'uv_resistance': 0.5,
|
|
'flame_resistance': 0.7,
|
|
'water_absorption': 0.4,
|
|
'air_permeability': 0.6,
|
|
'thermal_conductivity': 0.12,
|
|
'biodegradability': 0.6,
|
|
'recyclability': 0.7
|
|
}
|
|
)
|
|
|
|
# 亚麻 - 天然、透气
|
|
linen = ClothMaterial(
|
|
"Linen",
|
|
ClothMaterial.TYPE_LINEN,
|
|
{
|
|
'density': 0.5,
|
|
'linear_stiffness': 0.6,
|
|
'angular_stiffness': 0.5,
|
|
'volume_stiffness': 0.3,
|
|
'friction': 0.55,
|
|
'restitution': 0.12,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.025,
|
|
'lift_coefficient': 0.012,
|
|
'bend_stiffness': 0.4,
|
|
'damping': 0.008,
|
|
'plastic_threshold': 0.12,
|
|
'plastic_stiffness': 0.4,
|
|
'tear_threshold': 90.0,
|
|
'tear_resistance': 40.0,
|
|
'anisotropic_friction': [0.55, 0.55, 0.55],
|
|
'dynamic_friction': 0.55,
|
|
'static_friction': 0.65,
|
|
'rolling_friction': 0.08,
|
|
'spinning_friction': 0.04,
|
|
'viscosity': 0.008,
|
|
'compressibility': 0.08,
|
|
'shear_modulus': 0.5,
|
|
'bulk_modulus': 0.8,
|
|
'youngs_modulus': 0.6,
|
|
'poisson_ratio': 0.35
|
|
},
|
|
{
|
|
'color': Vec4(0.9, 0.85, 0.75, 1.0),
|
|
'roughness': 0.85,
|
|
'metallic': 0.0,
|
|
'specular': 0.12,
|
|
'texture_scale': 1.2,
|
|
'normal_strength': 0.9
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.12,
|
|
'humidity_sensitivity': 0.25,
|
|
'aging_factor': 0.15,
|
|
'stretch_recovery': 0.7,
|
|
'compression_recovery': 0.7,
|
|
'fatigue_resistance': 0.6,
|
|
'abrasion_resistance': 0.5,
|
|
'chemical_resistance': 0.4,
|
|
'uv_resistance': 0.3,
|
|
'flame_resistance': 0.8,
|
|
'water_absorption': 0.7,
|
|
'air_permeability': 0.95,
|
|
'thermal_conductivity': 0.08,
|
|
'biodegradability': 0.95,
|
|
'recyclability': 0.85
|
|
}
|
|
)
|
|
|
|
# 羊毛 - 保暖、柔软
|
|
wool = ClothMaterial(
|
|
"Wool",
|
|
ClothMaterial.TYPE_WOOL,
|
|
{
|
|
'density': 0.65,
|
|
'linear_stiffness': 0.65,
|
|
'angular_stiffness': 0.55,
|
|
'volume_stiffness': 0.35,
|
|
'friction': 0.6,
|
|
'restitution': 0.13,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.018,
|
|
'lift_coefficient': 0.009,
|
|
'bend_stiffness': 0.45,
|
|
'damping': 0.01,
|
|
'plastic_threshold': 0.13,
|
|
'plastic_stiffness': 0.45,
|
|
'tear_threshold': 100.0,
|
|
'tear_resistance': 50.0,
|
|
'anisotropic_friction': [0.6, 0.6, 0.6],
|
|
'dynamic_friction': 0.6,
|
|
'static_friction': 0.7,
|
|
'rolling_friction': 0.1,
|
|
'spinning_friction': 0.05,
|
|
'viscosity': 0.01,
|
|
'compressibility': 0.18,
|
|
'shear_modulus': 0.55,
|
|
'bulk_modulus': 0.9,
|
|
'youngs_modulus': 0.65,
|
|
'poisson_ratio': 0.37
|
|
},
|
|
{
|
|
'color': Vec4(0.85, 0.8, 0.7, 1.0),
|
|
'roughness': 0.75,
|
|
'metallic': 0.0,
|
|
'specular': 0.13,
|
|
'texture_scale': 1.8,
|
|
'normal_strength': 1.1,
|
|
'subsurface': 0.3,
|
|
'subsurface_color': Vec4(0.9, 0.8, 0.7, 1.0)
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.05,
|
|
'humidity_sensitivity': 0.4,
|
|
'aging_factor': 0.12,
|
|
'stretch_recovery': 0.8,
|
|
'compression_recovery': 0.8,
|
|
'fatigue_resistance': 0.7,
|
|
'abrasion_resistance': 0.6,
|
|
'chemical_resistance': 0.5,
|
|
'uv_resistance': 0.4,
|
|
'flame_resistance': 0.9,
|
|
'water_absorption': 0.6,
|
|
'air_permeability': 0.7,
|
|
'thermal_conductivity': 0.05,
|
|
'biodegradability': 0.85,
|
|
'recyclability': 0.75
|
|
}
|
|
)
|
|
|
|
# 合成纤维 - 多功能性
|
|
synthetic = ClothMaterial(
|
|
"Synthetic",
|
|
ClothMaterial.TYPE_SYNTHETIC,
|
|
{
|
|
'density': 0.4,
|
|
'linear_stiffness': 0.75,
|
|
'angular_stiffness': 0.65,
|
|
'volume_stiffness': 0.45,
|
|
'friction': 0.5,
|
|
'restitution': 0.2,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.012,
|
|
'lift_coefficient': 0.007,
|
|
'bend_stiffness': 0.55,
|
|
'damping': 0.006,
|
|
'plastic_threshold': 0.18,
|
|
'plastic_stiffness': 0.55,
|
|
'tear_threshold': 110.0,
|
|
'tear_resistance': 55.0,
|
|
'anisotropic_friction': [0.5, 0.5, 0.5],
|
|
'dynamic_friction': 0.5,
|
|
'static_friction': 0.6,
|
|
'rolling_friction': 0.07,
|
|
'spinning_friction': 0.03,
|
|
'viscosity': 0.006,
|
|
'compressibility': 0.1,
|
|
'shear_modulus': 0.55,
|
|
'bulk_modulus': 0.95,
|
|
'youngs_modulus': 0.7,
|
|
'poisson_ratio': 0.39
|
|
},
|
|
{
|
|
'color': Vec4(0.7, 0.7, 0.7, 1.0),
|
|
'roughness': 0.5,
|
|
'metallic': 0.05,
|
|
'specular': 0.25,
|
|
'texture_scale': 1.0,
|
|
'normal_strength': 0.7
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.08,
|
|
'humidity_sensitivity': 0.1,
|
|
'aging_factor': 0.08,
|
|
'stretch_recovery': 0.85,
|
|
'compression_recovery': 0.85,
|
|
'fatigue_resistance': 0.85,
|
|
'abrasion_resistance': 0.75,
|
|
'chemical_resistance': 0.85,
|
|
'uv_resistance': 0.75,
|
|
'flame_resistance': 0.6,
|
|
'water_absorption': 0.2,
|
|
'air_permeability': 0.6,
|
|
'thermal_conductivity': 0.15,
|
|
'biodegradability': 0.3,
|
|
'recyclability': 0.9
|
|
}
|
|
)
|
|
|
|
# 网眼布 - 透气、轻质
|
|
mesh = ClothMaterial(
|
|
"Mesh",
|
|
ClothMaterial.TYPE_MESH,
|
|
{
|
|
'density': 0.2,
|
|
'linear_stiffness': 0.4,
|
|
'angular_stiffness': 0.3,
|
|
'volume_stiffness': 0.1,
|
|
'friction': 0.3,
|
|
'restitution': 0.05,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.04,
|
|
'lift_coefficient': 0.02,
|
|
'bend_stiffness': 0.2,
|
|
'damping': 0.003,
|
|
'plastic_threshold': 0.08,
|
|
'plastic_stiffness': 0.2,
|
|
'tear_threshold': 70.0,
|
|
'tear_resistance': 25.0,
|
|
'anisotropic_friction': [0.3, 0.3, 0.3],
|
|
'dynamic_friction': 0.3,
|
|
'static_friction': 0.4,
|
|
'rolling_friction': 0.03,
|
|
'spinning_friction': 0.01,
|
|
'viscosity': 0.003,
|
|
'compressibility': 0.05,
|
|
'shear_modulus': 0.2,
|
|
'bulk_modulus': 0.5,
|
|
'youngs_modulus': 0.3,
|
|
'poisson_ratio': 0.3
|
|
},
|
|
{
|
|
'color': Vec4(0.6, 0.6, 0.6, 0.7),
|
|
'roughness': 0.6,
|
|
'metallic': 0.1,
|
|
'specular': 0.2,
|
|
'texture_scale': 3.0,
|
|
'normal_strength': 0.4,
|
|
'opacity': 0.7
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.03,
|
|
'humidity_sensitivity': 0.05,
|
|
'aging_factor': 0.03,
|
|
'stretch_recovery': 0.9,
|
|
'compression_recovery': 0.9,
|
|
'fatigue_resistance': 0.5,
|
|
'abrasion_resistance': 0.3,
|
|
'chemical_resistance': 0.7,
|
|
'uv_resistance': 0.6,
|
|
'flame_resistance': 0.8,
|
|
'water_absorption': 0.1,
|
|
'air_permeability': 1.0,
|
|
'thermal_conductivity': 0.2,
|
|
'biodegradability': 0.4,
|
|
'recyclability': 0.95
|
|
}
|
|
)
|
|
|
|
# 帆布 - 坚固、耐用
|
|
canvas = ClothMaterial(
|
|
"Canvas",
|
|
ClothMaterial.TYPE_CANVAS,
|
|
{
|
|
'density': 0.75,
|
|
'linear_stiffness': 0.85,
|
|
'angular_stiffness': 0.75,
|
|
'volume_stiffness': 0.55,
|
|
'friction': 0.68,
|
|
'restitution': 0.14,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.013,
|
|
'lift_coefficient': 0.006,
|
|
'bend_stiffness': 0.65,
|
|
'damping': 0.014,
|
|
'plastic_threshold': 0.18,
|
|
'plastic_stiffness': 0.65,
|
|
'tear_threshold': 130.0,
|
|
'tear_resistance': 65.0,
|
|
'anisotropic_friction': [0.68, 0.68, 0.68],
|
|
'dynamic_friction': 0.68,
|
|
'static_friction': 0.78,
|
|
'rolling_friction': 0.14,
|
|
'spinning_friction': 0.07,
|
|
'viscosity': 0.014,
|
|
'compressibility': 0.14,
|
|
'shear_modulus': 0.65,
|
|
'bulk_modulus': 1.05,
|
|
'youngs_modulus': 0.8,
|
|
'poisson_ratio': 0.4
|
|
},
|
|
{
|
|
'color': Vec4(0.8, 0.75, 0.65, 1.0),
|
|
'roughness': 0.78,
|
|
'metallic': 0.0,
|
|
'specular': 0.14,
|
|
'texture_scale': 2.5,
|
|
'normal_strength': 1.3
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.06,
|
|
'humidity_sensitivity': 0.2,
|
|
'aging_factor': 0.08,
|
|
'stretch_recovery': 0.78,
|
|
'compression_recovery': 0.78,
|
|
'fatigue_resistance': 0.85,
|
|
'abrasion_resistance': 0.85,
|
|
'chemical_resistance': 0.7,
|
|
'uv_resistance': 0.6,
|
|
'flame_resistance': 0.75,
|
|
'water_absorption': 0.35,
|
|
'air_permeability': 0.5,
|
|
'thermal_conductivity': 0.13,
|
|
'biodegradability': 0.5,
|
|
'recyclability': 0.7
|
|
}
|
|
)
|
|
|
|
# 尼龙 - 强韧、轻质
|
|
nylon = ClothMaterial(
|
|
"Nylon",
|
|
ClothMaterial.TYPE_NYLON,
|
|
{
|
|
'density': 0.35,
|
|
'linear_stiffness': 0.8,
|
|
'angular_stiffness': 0.7,
|
|
'volume_stiffness': 0.5,
|
|
'friction': 0.4,
|
|
'restitution': 0.25,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.01,
|
|
'lift_coefficient': 0.005,
|
|
'bend_stiffness': 0.6,
|
|
'damping': 0.007,
|
|
'plastic_threshold': 0.15,
|
|
'plastic_stiffness': 0.6,
|
|
'tear_threshold': 140.0,
|
|
'tear_resistance': 70.0,
|
|
'anisotropic_friction': [0.4, 0.4, 0.4],
|
|
'dynamic_friction': 0.4,
|
|
'static_friction': 0.5,
|
|
'rolling_friction': 0.08,
|
|
'spinning_friction': 0.04,
|
|
'viscosity': 0.007,
|
|
'compressibility': 0.08,
|
|
'shear_modulus': 0.6,
|
|
'bulk_modulus': 1.0,
|
|
'youngs_modulus': 0.85,
|
|
'poisson_ratio': 0.4
|
|
},
|
|
{
|
|
'color': Vec4(0.95, 0.95, 0.95, 1.0),
|
|
'roughness': 0.4,
|
|
'metallic': 0.0,
|
|
'specular': 0.3,
|
|
'texture_scale': 1.0,
|
|
'normal_strength': 0.6
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.1,
|
|
'humidity_sensitivity': 0.15,
|
|
'aging_factor': 0.1,
|
|
'stretch_recovery': 0.92,
|
|
'compression_recovery': 0.92,
|
|
'fatigue_resistance': 0.88,
|
|
'abrasion_resistance': 0.8,
|
|
'chemical_resistance': 0.8,
|
|
'uv_resistance': 0.5,
|
|
'flame_resistance': 0.65,
|
|
'water_absorption': 0.25,
|
|
'air_permeability': 0.65,
|
|
'thermal_conductivity': 0.18,
|
|
'biodegradability': 0.25,
|
|
'recyclability': 0.85
|
|
}
|
|
)
|
|
|
|
# 聚酯纤维 - 耐用、抗皱
|
|
polyester = ClothMaterial(
|
|
"Polyester",
|
|
ClothMaterial.TYPE_POLYESTER,
|
|
{
|
|
'density': 0.45,
|
|
'linear_stiffness': 0.7,
|
|
'angular_stiffness': 0.6,
|
|
'volume_stiffness': 0.4,
|
|
'friction': 0.45,
|
|
'restitution': 0.18,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.015,
|
|
'lift_coefficient': 0.008,
|
|
'bend_stiffness': 0.5,
|
|
'damping': 0.009,
|
|
'plastic_threshold': 0.12,
|
|
'plastic_stiffness': 0.5,
|
|
'tear_threshold': 110.0,
|
|
'tear_resistance': 55.0,
|
|
'anisotropic_friction': [0.45, 0.45, 0.45],
|
|
'dynamic_friction': 0.45,
|
|
'static_friction': 0.55,
|
|
'rolling_friction': 0.09,
|
|
'spinning_friction': 0.045,
|
|
'viscosity': 0.009,
|
|
'compressibility': 0.1,
|
|
'shear_modulus': 0.55,
|
|
'bulk_modulus': 0.95,
|
|
'youngs_modulus': 0.75,
|
|
'poisson_ratio': 0.38
|
|
},
|
|
{
|
|
'color': Vec4(0.8, 0.8, 0.8, 1.0),
|
|
'roughness': 0.55,
|
|
'metallic': 0.0,
|
|
'specular': 0.2,
|
|
'texture_scale': 1.0,
|
|
'normal_strength': 0.7
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.07,
|
|
'humidity_sensitivity': 0.08,
|
|
'aging_factor': 0.06,
|
|
'stretch_recovery': 0.88,
|
|
'compression_recovery': 0.88,
|
|
'fatigue_resistance': 0.82,
|
|
'abrasion_resistance': 0.75,
|
|
'chemical_resistance': 0.85,
|
|
'uv_resistance': 0.65,
|
|
'flame_resistance': 0.7,
|
|
'water_absorption': 0.15,
|
|
'air_permeability': 0.55,
|
|
'thermal_conductivity': 0.14,
|
|
'biodegradability': 0.15,
|
|
'recyclability': 0.9
|
|
}
|
|
)
|
|
|
|
# 缎子 - 光滑、有光泽
|
|
satin = ClothMaterial(
|
|
"Satin",
|
|
ClothMaterial.TYPE_SATIN,
|
|
{
|
|
'density': 0.25,
|
|
'linear_stiffness': 0.45,
|
|
'angular_stiffness': 0.35,
|
|
'volume_stiffness': 0.25,
|
|
'friction': 0.15,
|
|
'restitution': 0.28,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.03,
|
|
'lift_coefficient': 0.015,
|
|
'bend_stiffness': 0.3,
|
|
'damping': 0.004,
|
|
'plastic_threshold': 0.08,
|
|
'plastic_stiffness': 0.3,
|
|
'tear_threshold': 75.0,
|
|
'tear_resistance': 35.0,
|
|
'anisotropic_friction': [0.15, 0.15, 0.15],
|
|
'dynamic_friction': 0.15,
|
|
'static_friction': 0.25,
|
|
'rolling_friction': 0.04,
|
|
'spinning_friction': 0.02,
|
|
'viscosity': 0.004,
|
|
'compressibility': 0.06,
|
|
'shear_modulus': 0.35,
|
|
'bulk_modulus': 0.7,
|
|
'youngs_modulus': 0.5,
|
|
'poisson_ratio': 0.33
|
|
},
|
|
{
|
|
'color': Vec4(0.98, 0.98, 0.98, 1.0),
|
|
'roughness': 0.1,
|
|
'metallic': 0.2,
|
|
'specular': 0.6,
|
|
'texture_scale': 0.8,
|
|
'normal_strength': 0.3,
|
|
'sheen': 0.9,
|
|
'sheen_roughness': 0.1
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.04,
|
|
'humidity_sensitivity': 0.12,
|
|
'aging_factor': 0.08,
|
|
'stretch_recovery': 0.85,
|
|
'compression_recovery': 0.85,
|
|
'fatigue_resistance': 0.65,
|
|
'abrasion_resistance': 0.45,
|
|
'chemical_resistance': 0.6,
|
|
'uv_resistance': 0.3,
|
|
'flame_resistance': 0.75,
|
|
'water_absorption': 0.3,
|
|
'air_permeability': 0.4,
|
|
'thermal_conductivity': 0.07,
|
|
'biodegradability': 0.5,
|
|
'recyclability': 0.75
|
|
}
|
|
)
|
|
|
|
# 毛圈织物 - 吸水、柔软
|
|
terry = ClothMaterial(
|
|
"Terry",
|
|
ClothMaterial.TYPE_TERRY,
|
|
{
|
|
'density': 0.55,
|
|
'linear_stiffness': 0.55,
|
|
'angular_stiffness': 0.45,
|
|
'volume_stiffness': 0.3,
|
|
'friction': 0.5,
|
|
'restitution': 0.1,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.02,
|
|
'lift_coefficient': 0.01,
|
|
'bend_stiffness': 0.35,
|
|
'damping': 0.012,
|
|
'plastic_threshold': 0.1,
|
|
'plastic_stiffness': 0.35,
|
|
'tear_threshold': 95.0,
|
|
'tear_resistance': 45.0,
|
|
'anisotropic_friction': [0.5, 0.5, 0.5],
|
|
'dynamic_friction': 0.5,
|
|
'static_friction': 0.6,
|
|
'rolling_friction': 0.1,
|
|
'spinning_friction': 0.05,
|
|
'viscosity': 0.012,
|
|
'compressibility': 0.15,
|
|
'shear_modulus': 0.45,
|
|
'bulk_modulus': 0.85,
|
|
'youngs_modulus': 0.6,
|
|
'poisson_ratio': 0.36
|
|
},
|
|
{
|
|
'color': Vec4(0.92, 0.92, 0.92, 1.0),
|
|
'roughness': 0.8,
|
|
'metallic': 0.0,
|
|
'specular': 0.15,
|
|
'texture_scale': 2.0,
|
|
'normal_strength': 1.5,
|
|
'subsurface': 0.2,
|
|
'subsurface_color': Vec4(0.95, 0.95, 0.95, 1.0)
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.09,
|
|
'humidity_sensitivity': 0.35,
|
|
'aging_factor': 0.13,
|
|
'stretch_recovery': 0.75,
|
|
'compression_recovery': 0.75,
|
|
'fatigue_resistance': 0.65,
|
|
'abrasion_resistance': 0.55,
|
|
'chemical_resistance': 0.5,
|
|
'uv_resistance': 0.45,
|
|
'flame_resistance': 0.8,
|
|
'water_absorption': 0.9,
|
|
'air_permeability': 0.75,
|
|
'thermal_conductivity': 0.1,
|
|
'biodegradability': 0.7,
|
|
'recyclability': 0.8
|
|
}
|
|
)
|
|
|
|
# 抓绒 - 保暖、柔软
|
|
fleece = ClothMaterial(
|
|
"Fleece",
|
|
ClothMaterial.TYPE_FLEECE,
|
|
{
|
|
'density': 0.3,
|
|
'linear_stiffness': 0.4,
|
|
'angular_stiffness': 0.3,
|
|
'volume_stiffness': 0.2,
|
|
'friction': 0.4,
|
|
'restitution': 0.08,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.025,
|
|
'lift_coefficient': 0.012,
|
|
'bend_stiffness': 0.25,
|
|
'damping': 0.008,
|
|
'plastic_threshold': 0.07,
|
|
'plastic_stiffness': 0.25,
|
|
'tear_threshold': 80.0,
|
|
'tear_resistance': 35.0,
|
|
'anisotropic_friction': [0.4, 0.4, 0.4],
|
|
'dynamic_friction': 0.4,
|
|
'static_friction': 0.5,
|
|
'rolling_friction': 0.08,
|
|
'spinning_friction': 0.04,
|
|
'viscosity': 0.008,
|
|
'compressibility': 0.2,
|
|
'shear_modulus': 0.3,
|
|
'bulk_modulus': 0.6,
|
|
'youngs_modulus': 0.4,
|
|
'poisson_ratio': 0.32
|
|
},
|
|
{
|
|
'color': Vec4(0.88, 0.88, 0.88, 1.0),
|
|
'roughness': 0.85,
|
|
'metallic': 0.0,
|
|
'specular': 0.1,
|
|
'texture_scale': 1.5,
|
|
'normal_strength': 1.8,
|
|
'subsurface': 0.4,
|
|
'subsurface_color': Vec4(0.9, 0.9, 0.9, 1.0)
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.06,
|
|
'humidity_sensitivity': 0.25,
|
|
'aging_factor': 0.1,
|
|
'stretch_recovery': 0.8,
|
|
'compression_recovery': 0.8,
|
|
'fatigue_resistance': 0.6,
|
|
'abrasion_resistance': 0.5,
|
|
'chemical_resistance': 0.6,
|
|
'uv_resistance': 0.5,
|
|
'flame_resistance': 0.85,
|
|
'water_absorption': 0.5,
|
|
'air_permeability': 0.65,
|
|
'thermal_conductivity': 0.04,
|
|
'biodegradability': 0.6,
|
|
'recyclability': 0.85
|
|
}
|
|
)
|
|
|
|
# 氯丁橡胶 - 防水、保温
|
|
neoprene = ClothMaterial(
|
|
"Neoprene",
|
|
ClothMaterial.TYPE_NEOPRENE,
|
|
{
|
|
'density': 0.9,
|
|
'linear_stiffness': 0.85,
|
|
'angular_stiffness': 0.75,
|
|
'volume_stiffness': 0.65,
|
|
'friction': 0.6,
|
|
'restitution': 0.22,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.008,
|
|
'lift_coefficient': 0.003,
|
|
'bend_stiffness': 0.7,
|
|
'damping': 0.018,
|
|
'plastic_threshold': 0.25,
|
|
'plastic_stiffness': 0.7,
|
|
'tear_threshold': 160.0,
|
|
'tear_resistance': 85.0,
|
|
'anisotropic_friction': [0.6, 0.6, 0.6],
|
|
'dynamic_friction': 0.6,
|
|
'static_friction': 0.7,
|
|
'rolling_friction': 0.16,
|
|
'spinning_friction': 0.09,
|
|
'viscosity': 0.018,
|
|
'compressibility': 0.18,
|
|
'shear_modulus': 0.75,
|
|
'bulk_modulus': 1.2,
|
|
'youngs_modulus': 0.9,
|
|
'poisson_ratio': 0.43
|
|
},
|
|
{
|
|
'color': Vec4(0.2, 0.2, 0.2, 1.0),
|
|
'roughness': 0.7,
|
|
'metallic': 0.0,
|
|
'specular': 0.25,
|
|
'texture_scale': 0.5,
|
|
'normal_strength': 0.8
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.12,
|
|
'humidity_sensitivity': 0.03,
|
|
'aging_factor': 0.15,
|
|
'stretch_recovery': 0.9,
|
|
'compression_recovery': 0.9,
|
|
'fatigue_resistance': 0.85,
|
|
'abrasion_resistance': 0.75,
|
|
'chemical_resistance': 0.95,
|
|
'uv_resistance': 0.7,
|
|
'flame_resistance': 0.8,
|
|
'water_absorption': 0.05,
|
|
'air_permeability': 0.0,
|
|
'thermal_conductivity': 0.12,
|
|
'biodegradability': 0.1,
|
|
'recyclability': 0.6
|
|
}
|
|
)
|
|
|
|
# 氨纶 - 高弹性
|
|
spandex = ClothMaterial(
|
|
"Spandex",
|
|
ClothMaterial.TYPE_SPANDEX,
|
|
{
|
|
'density': 0.2,
|
|
'linear_stiffness': 0.3,
|
|
'angular_stiffness': 0.25,
|
|
'volume_stiffness': 0.15,
|
|
'friction': 0.35,
|
|
'restitution': 0.35,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.018,
|
|
'lift_coefficient': 0.009,
|
|
'bend_stiffness': 0.2,
|
|
'damping': 0.005,
|
|
'plastic_threshold': 0.05,
|
|
'plastic_stiffness': 0.2,
|
|
'tear_threshold': 60.0,
|
|
'tear_resistance': 20.0,
|
|
'anisotropic_friction': [0.35, 0.35, 0.35],
|
|
'dynamic_friction': 0.35,
|
|
'static_friction': 0.45,
|
|
'rolling_friction': 0.06,
|
|
'spinning_friction': 0.03,
|
|
'viscosity': 0.005,
|
|
'compressibility': 0.07,
|
|
'shear_modulus': 0.25,
|
|
'bulk_modulus': 0.55,
|
|
'youngs_modulus': 0.35,
|
|
'poisson_ratio': 0.31
|
|
},
|
|
{
|
|
'color': Vec4(0.95, 0.95, 0.95, 1.0),
|
|
'roughness': 0.45,
|
|
'metallic': 0.0,
|
|
'specular': 0.35,
|
|
'texture_scale': 0.8,
|
|
'normal_strength': 0.4
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.08,
|
|
'humidity_sensitivity': 0.07,
|
|
'aging_factor': 0.05,
|
|
'stretch_recovery': 0.98,
|
|
'compression_recovery': 0.98,
|
|
'fatigue_resistance': 0.75,
|
|
'abrasion_resistance': 0.4,
|
|
'chemical_resistance': 0.7,
|
|
'uv_resistance': 0.4,
|
|
'flame_resistance': 0.6,
|
|
'water_absorption': 0.1,
|
|
'air_permeability': 0.5,
|
|
'thermal_conductivity': 0.16,
|
|
'biodegradability': 0.2,
|
|
'recyclability': 0.7
|
|
}
|
|
)
|
|
|
|
# 粗花呢 - 厚重、有纹理
|
|
tweed = ClothMaterial(
|
|
"Tweed",
|
|
ClothMaterial.TYPE_TWEED,
|
|
{
|
|
'density': 0.7,
|
|
'linear_stiffness': 0.75,
|
|
'angular_stiffness': 0.65,
|
|
'volume_stiffness': 0.45,
|
|
'friction': 0.62,
|
|
'restitution': 0.12,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.014,
|
|
'lift_coefficient': 0.007,
|
|
'bend_stiffness': 0.55,
|
|
'damping': 0.013,
|
|
'plastic_threshold': 0.14,
|
|
'plastic_stiffness': 0.55,
|
|
'tear_threshold': 115.0,
|
|
'tear_resistance': 58.0,
|
|
'anisotropic_friction': [0.62, 0.62, 0.62],
|
|
'dynamic_friction': 0.62,
|
|
'static_friction': 0.72,
|
|
'rolling_friction': 0.13,
|
|
'spinning_friction': 0.065,
|
|
'viscosity': 0.013,
|
|
'compressibility': 0.13,
|
|
'shear_modulus': 0.58,
|
|
'bulk_modulus': 0.98,
|
|
'youngs_modulus': 0.72,
|
|
'poisson_ratio': 0.39
|
|
},
|
|
{
|
|
'color': Vec4(0.75, 0.7, 0.6, 1.0),
|
|
'roughness': 0.72,
|
|
'metallic': 0.0,
|
|
'specular': 0.16,
|
|
'texture_scale': 3.0,
|
|
'normal_strength': 1.4
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.07,
|
|
'humidity_sensitivity': 0.18,
|
|
'aging_factor': 0.09,
|
|
'stretch_recovery': 0.72,
|
|
'compression_recovery': 0.72,
|
|
'fatigue_resistance': 0.78,
|
|
'abrasion_resistance': 0.72,
|
|
'chemical_resistance': 0.65,
|
|
'uv_resistance': 0.55,
|
|
'flame_resistance': 0.72,
|
|
'water_absorption': 0.32,
|
|
'air_permeability': 0.58,
|
|
'thermal_conductivity': 0.11,
|
|
'biodegradability': 0.55,
|
|
'recyclability': 0.72
|
|
}
|
|
)
|
|
|
|
# 薄纱 - 轻盈、透明
|
|
tulle = ClothMaterial(
|
|
"Tulle",
|
|
ClothMaterial.TYPE_TULLE,
|
|
{
|
|
'density': 0.1,
|
|
'linear_stiffness': 0.25,
|
|
'angular_stiffness': 0.2,
|
|
'volume_stiffness': 0.1,
|
|
'friction': 0.2,
|
|
'restitution': 0.15,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.035,
|
|
'lift_coefficient': 0.018,
|
|
'bend_stiffness': 0.15,
|
|
'damping': 0.003,
|
|
'plastic_threshold': 0.04,
|
|
'plastic_stiffness': 0.15,
|
|
'tear_threshold': 40.0,
|
|
'tear_resistance': 15.0,
|
|
'anisotropic_friction': [0.2, 0.2, 0.2],
|
|
'dynamic_friction': 0.2,
|
|
'static_friction': 0.3,
|
|
'rolling_friction': 0.03,
|
|
'spinning_friction': 0.015,
|
|
'viscosity': 0.003,
|
|
'compressibility': 0.03,
|
|
'shear_modulus': 0.15,
|
|
'bulk_modulus': 0.3,
|
|
'youngs_modulus': 0.2,
|
|
'poisson_ratio': 0.3
|
|
},
|
|
{
|
|
'color': Vec4(1.0, 1.0, 1.0, 0.3),
|
|
'roughness': 0.5,
|
|
'metallic': 0.0,
|
|
'specular': 0.4,
|
|
'texture_scale': 4.0,
|
|
'normal_strength': 0.2,
|
|
'opacity': 0.3
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.02,
|
|
'humidity_sensitivity': 0.04,
|
|
'aging_factor': 0.02,
|
|
'stretch_recovery': 0.95,
|
|
'compression_recovery': 0.95,
|
|
'fatigue_resistance': 0.4,
|
|
'abrasion_resistance': 0.2,
|
|
'chemical_resistance': 0.5,
|
|
'uv_resistance': 0.4,
|
|
'flame_resistance': 0.9,
|
|
'water_absorption': 0.05,
|
|
'air_permeability': 1.0,
|
|
'thermal_conductivity': 0.25,
|
|
'biodegradability': 0.6,
|
|
'recyclability': 0.98
|
|
}
|
|
)
|
|
|
|
# 天鹅绒 - 柔软、有光泽
|
|
velvet = ClothMaterial(
|
|
"Velvet",
|
|
ClothMaterial.TYPE_VELVET,
|
|
{
|
|
'density': 0.6,
|
|
'linear_stiffness': 0.5,
|
|
'angular_stiffness': 0.4,
|
|
'volume_stiffness': 0.3,
|
|
'friction': 0.45,
|
|
'restitution': 0.1,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.022,
|
|
'lift_coefficient': 0.011,
|
|
'bend_stiffness': 0.35,
|
|
'damping': 0.011,
|
|
'plastic_threshold': 0.09,
|
|
'plastic_stiffness': 0.35,
|
|
'tear_threshold': 85.0,
|
|
'tear_resistance': 40.0,
|
|
'anisotropic_friction': [0.45, 0.45, 0.45],
|
|
'dynamic_friction': 0.45,
|
|
'static_friction': 0.55,
|
|
'rolling_friction': 0.09,
|
|
'spinning_friction': 0.045,
|
|
'viscosity': 0.011,
|
|
'compressibility': 0.11,
|
|
'shear_modulus': 0.4,
|
|
'bulk_modulus': 0.75,
|
|
'youngs_modulus': 0.55,
|
|
'poisson_ratio': 0.35
|
|
},
|
|
{
|
|
'color': Vec4(0.85, 0.8, 0.75, 1.0),
|
|
'roughness': 0.2,
|
|
'metallic': 0.3,
|
|
'specular': 0.5,
|
|
'texture_scale': 1.2,
|
|
'normal_strength': 2.0,
|
|
'sheen': 0.7,
|
|
'sheen_roughness': 0.15
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.06,
|
|
'humidity_sensitivity': 0.22,
|
|
'aging_factor': 0.11,
|
|
'stretch_recovery': 0.82,
|
|
'compression_recovery': 0.82,
|
|
'fatigue_resistance': 0.68,
|
|
'abrasion_resistance': 0.52,
|
|
'chemical_resistance': 0.58,
|
|
'uv_resistance': 0.48,
|
|
'flame_resistance': 0.78,
|
|
'water_absorption': 0.42,
|
|
'air_permeability': 0.62,
|
|
'thermal_conductivity': 0.09,
|
|
'biodegradability': 0.62,
|
|
'recyclability': 0.78
|
|
}
|
|
)
|
|
|
|
# 翻毛皮 - 柔软、有质感
|
|
suede = ClothMaterial(
|
|
"Suede",
|
|
ClothMaterial.TYPE_SUEDE,
|
|
{
|
|
'density': 0.75,
|
|
'linear_stiffness': 0.65,
|
|
'angular_stiffness': 0.55,
|
|
'volume_stiffness': 0.4,
|
|
'friction': 0.55,
|
|
'restitution': 0.08,
|
|
'pressure_coefficient': 0.0,
|
|
'drag_coefficient': 0.016,
|
|
'lift_coefficient': 0.008,
|
|
'bend_stiffness': 0.45,
|
|
'damping': 0.015,
|
|
'plastic_threshold': 0.11,
|
|
'plastic_stiffness': 0.45,
|
|
'tear_threshold': 105.0,
|
|
'tear_resistance': 52.0,
|
|
'anisotropic_friction': [0.55, 0.55, 0.55],
|
|
'dynamic_friction': 0.55,
|
|
'static_friction': 0.65,
|
|
'rolling_friction': 0.11,
|
|
'spinning_friction': 0.055,
|
|
'viscosity': 0.015,
|
|
'compressibility': 0.12,
|
|
'shear_modulus': 0.48,
|
|
'bulk_modulus': 0.9,
|
|
'youngs_modulus': 0.68,
|
|
'poisson_ratio': 0.37
|
|
},
|
|
{
|
|
'color': Vec4(0.7, 0.65, 0.6, 1.0),
|
|
'roughness': 0.85,
|
|
'metallic': 0.0,
|
|
'specular': 0.18,
|
|
'texture_scale': 2.2,
|
|
'normal_strength': 1.6
|
|
},
|
|
{
|
|
'temperature_sensitivity': 0.05,
|
|
'humidity_sensitivity': 0.16,
|
|
'aging_factor': 0.07,
|
|
'stretch_recovery': 0.76,
|
|
'compression_recovery': 0.76,
|
|
'fatigue_resistance': 0.72,
|
|
'abrasion_resistance': 0.62,
|
|
'chemical_resistance': 0.68,
|
|
'uv_resistance': 0.58,
|
|
'flame_resistance': 0.76,
|
|
'water_absorption': 0.38,
|
|
'air_permeability': 0.52,
|
|
'thermal_conductivity': 0.13,
|
|
'biodegradability': 0.48,
|
|
'recyclability': 0.68
|
|
}
|
|
)
|
|
|
|
# 添加到材质字典
|
|
self.materials = {
|
|
ClothMaterial.TYPE_COTTON: cotton,
|
|
ClothMaterial.TYPE_SILK: silk,
|
|
ClothMaterial.TYPE_LEATHER: leather,
|
|
ClothMaterial.TYPE_RUBBER: rubber,
|
|
ClothMaterial.TYPE_DENIM: denim,
|
|
ClothMaterial.TYPE_LINEN: linen,
|
|
ClothMaterial.TYPE_WOOL: wool,
|
|
ClothMaterial.TYPE_SYNTHETIC: synthetic,
|
|
ClothMaterial.TYPE_MESH: mesh,
|
|
ClothMaterial.TYPE_CANVAS: canvas,
|
|
ClothMaterial.TYPE_NYLON: nylon,
|
|
ClothMaterial.TYPE_POLYESTER: polyester,
|
|
ClothMaterial.TYPE_SATIN: satin,
|
|
ClothMaterial.TYPE_TERRY: terry,
|
|
ClothMaterial.TYPE_FLEECE: fleece,
|
|
ClothMaterial.TYPE_NEOPRENE: neoprene,
|
|
ClothMaterial.TYPE_SPANDEX: spandex,
|
|
ClothMaterial.TYPE_TWEED: tweed,
|
|
ClothMaterial.TYPE_TULLE: tulle,
|
|
ClothMaterial.TYPE_VELVET: velvet,
|
|
ClothMaterial.TYPE_SUEDE: suede
|
|
}
|
|
|
|
def get_material(self, material_type: str) -> Optional[ClothMaterial]:
|
|
"""
|
|
获取指定类型的布料材质
|
|
|
|
Args:
|
|
material_type: 材质类型
|
|
|
|
Returns:
|
|
布料材质对象或None
|
|
"""
|
|
return self.materials.get(material_type)
|
|
|
|
def get_all_material_types(self) -> List[str]:
|
|
"""
|
|
获取所有材质类型
|
|
|
|
Returns:
|
|
材质类型列表
|
|
"""
|
|
return list(self.materials.keys())
|
|
|
|
def get_material_names(self) -> List[str]:
|
|
"""
|
|
获取所有材质名称
|
|
|
|
Returns:
|
|
材质名称列表
|
|
"""
|
|
return [material.name for material in self.materials.values()]
|
|
|
|
def create_custom_material(self, name: str, material_type: str,
|
|
physical_params: Dict[str, float] = None,
|
|
visual_params: Dict[str, Any] = None,
|
|
advanced_params: Dict[str, Any] = None) -> ClothMaterial:
|
|
"""
|
|
创建自定义布料材质
|
|
|
|
Args:
|
|
name: 材质名称
|
|
material_type: 材质类型
|
|
physical_params: 物理参数
|
|
visual_params: 视觉参数
|
|
advanced_params: 高级参数
|
|
|
|
Returns:
|
|
布料材质对象
|
|
"""
|
|
material = ClothMaterial(name, material_type, physical_params, visual_params, advanced_params)
|
|
return material
|
|
|
|
def register_material(self, material: ClothMaterial) -> bool:
|
|
"""
|
|
注册布料材质
|
|
|
|
Args:
|
|
material: 布料材质对象
|
|
|
|
Returns:
|
|
是否注册成功
|
|
"""
|
|
if material.material_type:
|
|
self.materials[material.material_type] = material
|
|
return True
|
|
return False
|
|
|
|
def create_material_combination(self, name: str, materials: List[str],
|
|
ratios: List[float]) -> ClothMaterial:
|
|
"""
|
|
创建混合材质
|
|
|
|
Args:
|
|
name: 混合材质名称
|
|
materials: 材质类型列表
|
|
ratios: 比例列表
|
|
|
|
Returns:
|
|
混合布料材质对象
|
|
"""
|
|
if len(materials) != len(ratios):
|
|
raise ValueError("材质数量和比例数量必须相同")
|
|
|
|
# 归一化比例
|
|
total_ratio = sum(ratios)
|
|
if total_ratio == 0:
|
|
raise ValueError("比例总和不能为0")
|
|
normalized_ratios = [r / total_ratio for r in ratios]
|
|
|
|
# 获取所有材质
|
|
material_objects = []
|
|
for material_type in materials:
|
|
material_obj = self.get_material(material_type)
|
|
if material_obj is None:
|
|
raise ValueError(f"未知材质类型: {material_type}")
|
|
material_objects.append(material_obj)
|
|
|
|
# 混合物理参数
|
|
combined_physical = {}
|
|
combined_visual = {}
|
|
combined_advanced = {}
|
|
|
|
# 物理参数混合
|
|
for param_name in material_objects[0].physical_params.keys():
|
|
weighted_sum = 0.0
|
|
for i, material_obj in enumerate(material_objects):
|
|
weighted_sum += material_obj.physical_params[param_name] * normalized_ratios[i]
|
|
combined_physical[param_name] = weighted_sum
|
|
|
|
# 视觉参数混合
|
|
for param_name in material_objects[0].visual_params.keys():
|
|
if param_name == 'color':
|
|
# 颜色混合
|
|
mixed_color = Vec4(0, 0, 0, 0)
|
|
for i, material_obj in enumerate(material_objects):
|
|
color = material_obj.visual_params[param_name]
|
|
mixed_color += color * normalized_ratios[i]
|
|
combined_visual[param_name] = mixed_color
|
|
else:
|
|
# 其他视觉参数混合
|
|
weighted_sum = 0.0
|
|
for i, material_obj in enumerate(material_objects):
|
|
weighted_sum += material_obj.visual_params[param_name] * normalized_ratios[i]
|
|
combined_visual[param_name] = weighted_sum
|
|
|
|
# 高级参数混合
|
|
for param_name in material_objects[0].advanced_params.keys():
|
|
weighted_sum = 0.0
|
|
for i, material_obj in enumerate(material_objects):
|
|
weighted_sum += material_obj.advanced_params[param_name] * normalized_ratios[i]
|
|
combined_advanced[param_name] = weighted_sum
|
|
|
|
# 创建混合材质
|
|
combined_material = ClothMaterial(
|
|
name,
|
|
f"combined_{name}",
|
|
combined_physical,
|
|
combined_visual,
|
|
combined_advanced
|
|
)
|
|
|
|
# 保存组合信息
|
|
self.material_combinations[name] = {
|
|
'materials': materials,
|
|
'ratios': normalized_ratios,
|
|
'material_object': combined_material
|
|
}
|
|
|
|
return combined_material
|
|
|
|
def get_material_combination(self, name: str) -> Optional[ClothMaterial]:
|
|
"""
|
|
获取混合材质
|
|
|
|
Args:
|
|
name: 混合材质名称
|
|
|
|
Returns:
|
|
混合布料材质对象或None
|
|
"""
|
|
combination = self.material_combinations.get(name)
|
|
if combination:
|
|
return combination['material_object']
|
|
return None
|
|
|
|
def get_material_properties_database(self) -> Dict[str, Dict[str, Any]]:
|
|
"""
|
|
获取材质属性数据库
|
|
|
|
Returns:
|
|
材质属性字典
|
|
"""
|
|
database = {}
|
|
for material_type, material in self.materials.items():
|
|
database[material_type] = material.get_material_properties_summary()
|
|
return database
|
|
|
|
def find_similar_materials(self, reference_material: ClothMaterial,
|
|
max_results: int = 5) -> List[Tuple[str, float]]:
|
|
"""
|
|
查找相似材质
|
|
|
|
Args:
|
|
reference_material: 参考材质
|
|
max_results: 最大结果数量
|
|
|
|
Returns:
|
|
相似材质列表 (材质类型, 相似度)
|
|
"""
|
|
reference_props = reference_material.get_material_properties_summary()
|
|
similarities = []
|
|
|
|
for material_type, material in self.materials.items():
|
|
if material_type == reference_material.material_type:
|
|
continue # 跳过自身
|
|
|
|
material_props = material.get_material_properties_summary()
|
|
|
|
# 计算相似度 (简化版本)
|
|
similarity = 0.0
|
|
total_weight = 0.0
|
|
|
|
# 物理属性相似度
|
|
ref_phys = reference_props['physical_properties']
|
|
mat_phys = material_props['physical_properties']
|
|
|
|
for key in ref_phys.keys():
|
|
if key in mat_phys:
|
|
ref_val = ref_phys[key]
|
|
mat_val = mat_phys[key]
|
|
# 归一化差异 (假设值在合理范围内)
|
|
diff = abs(ref_val - mat_val) / max(1.0, ref_val + mat_val)
|
|
similarity += (1.0 - diff) * 0.4
|
|
total_weight += 0.4
|
|
|
|
# 视觉属性相似度
|
|
ref_vis = reference_props['visual_properties']
|
|
mat_vis = material_props['visual_properties']
|
|
|
|
# 颜色相似度
|
|
if 'color' in ref_vis and 'color' in mat_vis:
|
|
ref_color = ref_vis['color']
|
|
mat_color = mat_vis['color']
|
|
color_diff = (
|
|
(ref_color[0] - mat_color[0]) ** 2 +
|
|
(ref_color[1] - mat_color[1]) ** 2 +
|
|
(ref_color[2] - mat_color[2]) ** 2
|
|
) ** 0.5
|
|
similarity += (1.0 - color_diff) * 0.3
|
|
total_weight += 0.3
|
|
|
|
# 粗糙度相似度
|
|
if 'roughness' in ref_vis and 'roughness' in mat_vis:
|
|
roughness_diff = abs(ref_vis['roughness'] - mat_vis['roughness'])
|
|
similarity += (1.0 - roughness_diff) * 0.2
|
|
total_weight += 0.2
|
|
|
|
# 金属度相似度
|
|
if 'metallic' in ref_vis and 'metallic' in mat_vis:
|
|
metallic_diff = abs(ref_vis['metallic'] - mat_vis['metallic'])
|
|
similarity += (1.0 - metallic_diff) * 0.1
|
|
total_weight += 0.1
|
|
|
|
if total_weight > 0:
|
|
normalized_similarity = similarity / total_weight
|
|
similarities.append((material_type, normalized_similarity))
|
|
|
|
# 按相似度排序
|
|
similarities.sort(key=lambda x: x[1], reverse=True)
|
|
return similarities[:max_results] |