# 软体物理和布料模拟插件使用指南

## 简介

软体物理和布料模拟插件为iFlow引擎提供了真实的布料和软体物理模拟功能。该插件基于Bullet物理引擎的软体物理模块，支持多种布料材质和软体类型。

## 功能特性

1. **布料模拟**：
   - 支持多种预定义布料材质（棉布、丝绸、皮革等）
   - 可自定义布料物理参数
   - 支持固定点设置
   - 实时风力影响

2. **软体物理**：
   - 支持多种软体材质（橡胶、果冻、肌肉组织等）
   - 多种形状支持（球体、盒体、绳索等）
   - 可自定义物理参数

3. **调试可视化**：
   - 网格可视化
   - 固定点显示
   - 力和速度向量可视化

## 安装和启用

### 启用插件

在iFlow项目中启用插件：

```python
# 在主程序中启用插件
world = MyWorld()  # 或您的世界对象

# 启用插件系统
world.plugin_manager.enable_plugin_system()

# 加载并启用软体物理和布料模拟插件
cloth_plugin = world.plugin_manager.load_plugin("soft_body_cloth_physics")
if cloth_plugin:
    world.plugin_manager.enable_plugin("soft_body_cloth_physics")
```

## 基本使用

### 创建布料对象

```python
# 获取布料管理器
cloth_manager = world.plugins['soft_body_cloth_physics'].cloth_manager

# 启用布料管理器
cloth_manager.enable()

# 创建布料片
from panda3d.core import NodePath
parent_node = NodePath("cloth_parent")

# 创建一个2x2米的棉布片，分辨率为10x10
cloth_info = cloth_manager.create_cloth_patch(
    parent_node, 
    width=2.0, 
    height=2.0, 
    resolution_x=10, 
    resolution_y=10,
    params={'material': 'cotton'}
)

# 添加固定点（固定四个角）
if cloth_info:
    cloth_manager.add_anchor(cloth_info, 0)  # 左下角
    cloth_manager.add_anchor(cloth_info, 9)  # 右下角
    cloth_manager.add_anchor(cloth_info, 90) # 左上角
    cloth_manager.add_anchor(cloth_info, 99) # 右上角
```

### 创建软体对象

```python
# 获取软体管理器
soft_manager = world.plugins['soft_body_cloth_physics'].soft_body_manager

# 启用软体管理器
soft_manager.enable()

# 创建球形软体
from panda3d.core import Point3
parent_node = NodePath("soft_body_parent")

# 创建一个橡胶球
soft_info = soft_manager.create_soft_body_sphere(
    parent_node,
    radius=0.5,
    resolution=8,
    params={'material': 'rubber'}
)

# 创建绳索软体
rope_info = soft_manager.create_soft_body_rope(
    parent_node,
    point_a=Point3(0, 0, 5),
    point_b=Point3(0, 0, 0),
    resolution=20,
    params={'material': 'rubber'}
)
```

### 使用预定义材质

```python
# 获取材质管理器
from plugins.user.soft_body_cloth_physics.materials.cloth_materials import ClothMaterialManager
material_manager = ClothMaterialManager()

# 获取棉布材质参数
cotton_params = material_manager.get_material("cotton").get_physical_parameters()

# 创建使用特定材质的布料
cloth_info = cloth_manager.create_cloth_patch(
    parent_node, 
    width=2.0, 
    height=2.0, 
    resolution_x=10, 
    resolution_y=10,
    params=cotton_params
)
```

### 调试可视化

```python
# 启用调试可视化
debug_manager = world.plugins['soft_body_cloth_physics'].debug_manager
debug_manager.enable()

# 设置可视化选项
debug_manager.cloth_visualizer.set_visibility_flags(
    mesh=True,      # 显示网格
    anchors=True,   # 显示固定点
    forces=False,   # 不显示力
    velocities=False # 不显示速度
)
```

## 高级功能

### 自定义材质

```python
# 创建自定义布料材质
custom_material = material_manager.create_custom_material(
    "CustomElastic",
    "custom",
    physical_params={
        'density': 0.4,
        'linear_stiffness': 0.9,
        'angular_stiffness': 0.8,
        'volume_stiffness': 0.7,
        'friction': 0.5,
        'restitution': 0.3
    },
    visual_params={
        'color': Vec4(1.0, 0.5, 0.5, 1.0),
        'roughness': 0.6
    }
)

# 注册自定义材质
material_manager.register_material(custom_material)
```

### 实时参数调整

```python
# 动态调整布料参数
if cloth_info:
    cloth_manager.update_cloth_params(cloth_info, {
        'linear_stiffness': 0.9,  # 增加线性刚度
        'friction': 0.8          # 增加摩擦力
    })
```

### 应用外力

```python
# 对软体应用力
from panda3d.core import Vec3
if soft_info:
    soft_manager.apply_force_to_soft_body(
        soft_info['soft_body'], 
        Vec3(0, 0, 100)  # 向上的力
    )
```

## 配置文件

插件的配置存储在 `config/cloth_settings.json` 文件中，可以调整以下参数：

- 物理参数（重力、空气密度等）
- 默认布料和软体参数
- 调试可视化选项

## 性能优化建议

1. **降低分辨率**：对于远距离或不重要的布料，使用较低的分辨率
2. **限制对象数量**：软体物理计算开销较大，避免场景中同时存在过多软体对象
3. **使用LOD**：根据距离动态调整布料分辨率
4. **合理设置参数**：避免过于 stiff 的参数设置，可能导致仿真不稳定

## 故障排除

### 常见问题

1. **布料穿模**：
   - 增加布料的体积保持系数
   - 调整时间步长参数

2. **性能问题**：
   - 降低布料分辨率
   - 减少同时模拟的软体对象数量

3. **对象不响应物理**：
   - 确保插件已正确启用
   - 检查物理世界是否正常工作

### API参考

详细API文档请参考插件源代码中的类和方法注释。