EG/plugins/user/rigid_body_physics/README.md
2025-10-30 11:46:41 +08:00

613 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 刚体动力学插件使用文档
## 简介
刚体动力学插件是一个完整的物理模拟系统基于Bullet物理引擎提供了丰富的物理功能包括刚体动力学、约束系统、车辆模拟、粒子系统等。
## 功能特性
### 1. 物理世界管理
- 重力设置和控制
- 时间步长和子步长模拟
- 性能监控和优化
- 多线程支持
- 空间分区优化
### 2. 刚体系统
- 静态、动态、运动学刚体
- 多种碰撞形状(盒体、球体、胶囊体、圆锥体、圆柱体、凸包、网格、复合形状)
- 质量、摩擦、弹性等物理属性
- 连续碰撞检测(CCD)
- 力和扭矩应用
- 速度和加速度控制
- 能量计算(动能、势能)
- 碰撞历史记录
### 3. 材质系统
- 预定义常用材质(混凝土、木材、金属、橡胶、冰、沙、水、玻璃、肉体等)
- 自定义材质属性
- 基础物理属性(摩擦、弹性、密度等)
- 热力学属性(热导率、比热容等)
- 电学属性(电导率、介电常数等)
- 流体属性(粘度、表面张力等)
- 视觉属性(颜色、粗糙度等)
- 环境属性(耐候性、腐蚀率等)
- 特殊属性(易燃性、毒性、放射性)
- 高级材质功能
- 热膨胀和相变模拟
- 环境老化效应(雨水、紫外线、风力等)
- 疲劳累积和损伤分析
- 化学反应和腐蚀模拟
- 流体动力学效应(阻力、升力、浮力)
- 能量吸收和耗散
- 失效准则和结构完整性评估
- 动态摩擦和恢复系数计算
- 材质交互矩阵
- 材质状态管理(温度、湿度、磨损、疲劳、污染等)
- 材质历史记录和统计分析
- 材质保存和加载
### 4. 约束和关节
- 点对点约束
- 铰链约束
- 滑动约束
- 锥形扭转约束
- 6自由度约束
- 6自由度弹簧约束
- 齿轮约束
- 固定约束
- 约束组和标签管理
- 约束马达和弹簧控制
- 约束限制设置
- 约束状态监控
### 5. 车辆系统
- 底盘和车轮物理
- 悬挂系统
- 引擎和刹车控制
- 转向系统
- 差速器类型支持
- 齿轮系统
- 发动机扭矩曲线
- 防抱死刹车(ABS)
- 牵引力控制(TC)
- 车身稳定控制(ESP)
- 空气动力学效应
- 防倾杆系统
- 车辆损伤系统
- 燃料系统
- 性能统计
### 6. 粒子系统
- 大量粒子模拟
- 多种粒子类型(烟雾、火焰、水、碎片、爆炸、火花、气泡、叶子、雪、雨等)
- 发射器控制
- 粒子生命周期管理
- 环境影响(风力、温度等)
- 特殊效果(涡流等)
- 粒子子发射器
- 粒子轨迹和淡出效果
- 粒子碰撞和死亡回调
- 爆炸和火焰特效
### 7. 调试和可视化
- 碰撞体可视化
- 约束可视化
- 接触点可视化
- 法线可视化
- 速度和力可视化
- 坐标轴可视化
- 质心可视化
- 休眠状态可视化
- 粒子轨迹可视化
- 性能监控面板
- 调试文本显示
- 可视化选项控制
### 8. 实用工具
- 物理计算工具(质量计算、冲量应用、扭矩计算等)
- 配置管理器
- 碰撞组定义
- 物理常量库
## 安装和配置
### 目录结构
```
rigid_body_physics/
├── __init__.py
├── plugin_manager.py
├── README.md
├── core/
│ ├── physics_world.py
│ ├── rigid_body.py
│ └── material.py
├── constraints/
│ └── constraint_manager.py
├── vehicles/
│ └── vehicle_system.py
├── particles/
│ └── particle_system.py
├── debug/
│ └── debug_tools.py
├── utils/
│ └── physics_utils.py
└── config/
└── physics_config.json
```
## 快速开始
### 1. 初始化插件
```python
from plugins.user.rigid_body_physics.plugin_manager import RigidBodyPhysicsPlugin
# 创建物理插件实例
physics_plugin = RigidBodyPhysicsPlugin(world_node=render)
```
### 2. 创建刚体
```python
# 创建一个盒子形状的动态刚体
box_body = physics_plugin.create_rigid_body(
node_path=box_node,
shape_type='box',
mass=1.0,
body_type=RigidBody.DYNAMIC
)
# 设置物理属性
box_body.set_friction(0.5)
box_body.set_restitution(0.3)
# 应用力和扭矩
box_body.apply_force(Vec3(0, 0, 100)) # 向上施加力
box_body.apply_torque(Vec3(0, 10, 0)) # 绕Y轴施加扭矩
```
### 3. 创建约束
```python
# 创建铰链约束
hinge_constraint = physics_plugin.create_constraint(
constraint_type='hinge',
body_a=body_a,
body_b=body_b,
pivot_a=Point3(0, 0, 0),
pivot_b=Point3(0, 0, 0),
axis_a=Vec3(0, 0, 1),
axis_b=Vec3(0, 0, 1)
)
```
### 4. 创建车辆
```python
# 定义车轮配置
wheel_configs = [
{
'connection_point': Point3(-1, 1, 0),
'wheel_direction': Vec3(0, 0, -1),
'wheel_axle': Vec3(1, 0, 0),
'wheel_radius': 0.3
},
# ... 其他车轮配置
]
# 创建车辆
vehicle = physics_plugin.create_vehicle(chassis_body, wheel_configs)
# 控制车辆
vehicle.set_steering(0.5) # 转向
vehicle.set_engine_force(1.0) # 加油
vehicle.set_brake_force(0.3) # 刹车
```
### 5. 创建粒子系统
```python
# 创建粒子系统
particle_system = physics_plugin.create_particle_system(max_particles=500)
# 设置发射器属性
particle_system.set_emitter_properties(
position=Point3(0, 0, 5),
velocity=Vec3(0, 0, 10),
spread=0.5
)
# 创建爆炸效果
particle_system.create_explosion(
position=Point3(0, 0, 0),
particle_count=100,
explosion_force=50.0
)
```
### 6. 主循环更新
```python
def update(task):
dt = globalClock.getDt()
physics_plugin.update(dt)
# 更新车辆
for vehicle in physics_plugin.vehicles:
vehicle.update(dt)
return task.cont
taskMgr.add(update, "physics_update")
```
## 高级功能
### 材质系统
```python
# 使用预定义材质
concrete_material = physics_plugin.get_predefined_material('concrete')
# 创建自定义材质
custom_material = physics_plugin.create_custom_material(
'my_material',
{
'friction': 0.8,
'restitution': 0.2,
'density': 2000.0,
'thermal_conductivity': 2.0,
'color': Vec4(0.8, 0.6, 0.4, 1.0)
}
)
# 设置材质交互
custom_material.set_interaction_coefficient('metal', 1.2)
# 更新材质状态
custom_material.update_state(
temperature=50.0,
wear=0.1,
stress=100.0
)
```
### 调试可视化
```python
# 启用调试可视化
physics_plugin.enable_debug_visualization(True)
# 设置调试选项
physics_plugin.set_debug_options(
show_constraints=True,
show_aabbs=True,
show_velocities=True,
show_forces=True
)
# 性能分析
profiler = physics_plugin.profiler
performance_report = profiler.get_performance_report()
print(f"平均FPS: {performance_report['average_fps']}")
```
### 性能监控
```python
# 获取性能统计
stats = physics_plugin.get_performance_stats()
print(f"平均更新时间: {stats['avg_update_time']}")
print(f"刚体数量: {stats['objects']['rigid_bodies']}")
# 获取详细性能分析
analysis = physics_plugin.profiler.get_performance_analysis()
print(f"性能等级: {analysis['performance_grade']}")
print(f"瓶颈: {analysis['bottlenecks']}")
print(f"建议: {analysis['recommendations']}")
```
## 配置文件
插件支持通过JSON配置文件进行配置
```json
{
"physics": {
"gravity": [0, 0, -9.81],
"time_step": 0.016667,
"solver_iterations": 10,
"solver_tolerance": 0.001
},
"materials": {
"concrete": {
"friction": 0.7,
"restitution": 0.1,
"density": 2400.0
}
},
"vehicle": {
"max_engine_force": 3000.0,
"max_brake_force": 100.0,
"max_steering": 0.7854
}
}
```
## API参考
### RigidBodyPhysicsPlugin类
#### 构造函数
```python
RigidBodyPhysicsPlugin(world_node=None, config_file=None)
```
#### 主要方法
- `create_rigid_body(node_path, shape_type, mass, body_type, material)`: 创建刚体
- `create_constraint(constraint_type, body_a, body_b, **kwargs)`: 创建约束
- `create_vehicle(chassis_body, wheel_configurations)`: 创建车辆
- `create_particle_system(max_particles)`: 创建粒子系统
- `update(dt)`: 更新物理系统
- `ray_test(from_pos, to_pos)`: 射线检测
- `get_performance_stats()`: 获取性能统计
- `enable_debug_visualization(enabled)`: 启用调试可视化
- `set_debug_options(**kwargs)`: 设置调试选项
- `get_predefined_material(material_name)`: 获取预定义材质
- `create_custom_material(name, properties)`: 创建自定义材质
- `set_gravity(gravity)`: 设置重力
- `set_time_step(time_step, max_substeps)`: 设置时间步长
- `get_collision_groups()`: 获取碰撞组工具
- `save_config(config_file)`: 保存配置
- `load_config(config_file)`: 加载配置
- `clear_all()`: 清除所有物理对象
- `destroy()`: 销毁物理插件
### RigidBody类
#### 主要方法
- `set_friction(friction, static_friction, dynamic_friction)`: 设置摩擦系数
- `set_restitution(restitution)`: 设置恢复系数
- `set_damping(linear_damping, angular_damping)`: 设置阻尼
- `set_factors(linear_factor, angular_factor)`: 设置线性和角因子
- `set_activation_state(active, always_active)`: 设置激活状态
- `set_sleeping_thresholds(linear_threshold, angular_threshold)`: 设置休眠阈值
- `set_ccd_parameters(motion_threshold, swept_sphere_radius)`: 设置CCD参数
- `apply_force(force, position, duration)`: 应用力
- `apply_torque(torque, duration)`: 应用扭矩
- `apply_impulse(impulse, position, duration)`: 应用冲量
- `apply_torque_impulse(torque_impulse)`: 应用扭矩冲量
- `get_linear_velocity()`: 获取线性速度
- `set_linear_velocity(velocity)`: 设置线性速度
- `get_angular_velocity()`: 获取角速度
- `set_angular_velocity(velocity)`: 设置角速度
- `get_position()`: 获取位置
- `set_position(position)`: 设置位置
- `get_rotation()`: 获取旋转
- `set_rotation(rotation)`: 设置旋转
- `sync_visual_node()`: 同步物理节点和可视化节点
- `get_mass()`: 获取质量
- `set_mass(mass)`: 设置质量
- `get_kinetic_energy()`: 计算动能
- `get_potential_energy(gravity)`: 计算势能
- `get_total_energy(gravity)`: 计算总能量
- `set_custom_data(key, value)`: 设置自定义数据
- `get_custom_data(key, default)`: 获取自定义数据
- `destroy()`: 销毁刚体
### PhysicsMaterial类
#### 主要方法
- `set_property(property_name, value)`: 设置材质属性
- `get_property(property_name)`: 获取材质属性
- `set_friction(friction, static_friction, dynamic_friction)`: 设置摩擦系数
- `set_restitution(restitution)`: 设置恢复系数
- `set_density(density)`: 设置密度
- `set_color(color)`: 设置颜色
- `set_thermal_properties(conductivity, specific_heat, expansion)`: 设置热力学属性
- `set_electrical_properties(conductivity, dielectric, permeability)`: 设置电学属性
- `set_fluid_properties(viscosity, surface_tension, compressibility)`: 设置流体属性
- `set_visual_properties(roughness, metallic, specular, emissive)`: 设置视觉属性
- `set_environmental_properties(weather_resistance, corrosion_rate, aging_rate)`: 设置环境属性
- `set_special_properties(flammability, toxicity, radioactivity)`: 设置特殊属性
- `update_state(temperature, humidity, wear, contamination, stress, fatigue)`: 更新材质状态
- `get_effective_friction(other_material, velocity)`: 获取有效摩擦系数
- `get_effective_restitution(other_material, impact_velocity)`: 获取有效恢复系数
- `set_interaction_coefficient(other_material_name, coefficient)`: 设置交互系数
- `apply_to_rigid_body(rigid_body)`: 应用到刚体
- `to_dict()`: 转换为字典
- `from_dict(data)`: 从字典创建
- `save_to_file(filepath)`: 保存到文件
- `load_from_file(filepath)`: 从文件加载
### ConstraintManager类
#### 支持的约束类型
- `CONSTRAINT_POINT2POINT`: 点对点约束
- `CONSTRAINT_HINGE`: 铰链约束
- `CONSTRAINT_SLIDER`: 滑动约束
- `CONSTRAINT_CONETWIST`: 锥形扭转约束
- `CONSTRAINT_6DOF`: 6自由度约束
- `CONSTRAINT_6DOF_SPRING`: 6自由度弹簧约束
- `CONSTRAINT_GEAR`: 齿轮约束
- `CONSTRAINT_FIXED`: 固定约束
#### 主要方法
- `create_point2point_constraint(body_a, body_b, pivot_a, pivot_b, ...)`: 创建点对点约束
- `create_hinge_constraint(body_a, body_b, pivot_a, pivot_b, axis_a, axis_b, ...)`: 创建铰链约束
- `create_slider_constraint(body_a, body_b, frame_a, frame_b, ...)`: 创建滑动约束
- `create_cone_twist_constraint(body_a, body_b, frame_a, frame_b, ...)`: 创建锥形扭转约束
- `create_6dof_constraint(body_a, body_b, frame_a, frame_b, ...)`: 创建6自由度约束
- `create_6dof_spring_constraint(body_a, body_b, frame_a, frame_b, ...)`: 创建6自由度弹簧约束
- `create_gear_constraint(body_a, body_b, axis_a, axis_b, ratio)`: 创建齿轮约束
- `create_fixed_constraint(body_a, body_b, frame_a, frame_b, ...)`: 创建固定约束
- `set_motor(constraint, axis, target_velocity, max_impulse)`: 设置马达
- `disable_motor(constraint)`: 禁用马达
- `set_spring(constraint, axis, stiffness, damping, equilibrium)`: 设置弹簧
- `disable_spring(constraint, axis)`: 禁用弹簧
- `set_limit(constraint, axis, lower_limit, upper_limit)`: 设置限制
- `add_constraint_to_group(constraint, group_name)`: 添加到组
- `remove_constraint_from_group(constraint, group_name)`: 从组移除
- `add_constraint_tag(constraint, tag)`: 添加标签
- `remove_constraint_tag(constraint, tag)`: 移除标签
- `get_constraints_by_tag(tag)`: 根据标签获取约束
- `get_constraints_by_group(group_name)`: 根据组获取约束
- `get_constraint_state(constraint)`: 获取约束状态
- `get_constraint_statistics()`: 获取约束统计
### VehicleSystem类
#### 主要方法
- `add_wheel(...)`: 添加车轮
- `set_steering(steering)`: 设置转向
- `set_engine_force(force)`: 设置引擎力
- `set_brake_force(force)`: 设置刹车力
- `set_handbrake_force(force)`: 设置手刹力
- `shift_up()`: 升档
- `shift_down()`: 降档
- `set_gear(gear)`: 设置档位
- `update(dt)`: 更新车辆
- `get_current_speed_km_hour()`: 获取当前速度(km/h)
- `get_wheel_info(wheel_index)`: 获取车轮信息
- `get_vehicle_state()`: 获取车辆状态
- `get_engine_torque()`: 获取发动机扭矩
- `get_engine_power()`: 获取发动机功率
- `apply_damage(component, amount)`: 应用损伤
- `repair_component(component, amount)`: 修复组件
- `refuel(amount)`: 加油
- `get_performance_stats()`: 获取性能统计
- `enable_anti_lock_brake(enabled)`: 启用ABS
- `enable_traction_control(enabled)`: 启用牵引力控制
- `enable_stability_control(enabled)`: 启用车身稳定控制
- `destroy()`: 销毁车辆
### ParticleSystem类
#### 主要方法
- `set_emitter_properties(...)`: 设置发射器属性
- `set_particle_properties(...)`: 设置粒子属性
- `set_physics_properties(...)`: 设置物理属性
- `set_collision_properties(...)`: 设置碰撞属性
- `set_environmental_effects(...)`: 设置环境影响
- `set_special_effects(...)`: 设置特殊效果
- `set_lifetime_behaviors(...)`: 设置生命周期行为
- `set_sub_emitter(...)`: 设置子发射器
- `set_performance_options(...)`: 设置性能选项
- `set_emission_rate(rate)`: 设置发射速率
- `set_emission_burst(count, interval)`: 设置爆发发射
- `emit_particle(position, velocity, lifetime, color)`: 发射粒子
- `update(dt)`: 更新粒子系统
- `get_particle_count()`: 获取粒子数量
- `get_statistics()`: 获取统计信息
- `clear_particles()`: 清除粒子
- `pause(paused)`: 暂停/恢复
- `set_time_scale(scale)`: 设置时间缩放
- `create_explosion(position, particle_count, explosion_force, ...)`: 创建爆炸
- `create_fire_effect(position, particle_count, rise_speed, ...)`: 创建火焰
- `destroy()`: 销毁粒子系统
### PhysicsWorld类
#### 主要方法
- `set_gravity(gravity)`: 设置重力
- `set_time_step(time_step, max_substeps)`: 设置时间步长
- `set_solver_parameters(iterations, tolerance)`: 设置求解器参数
- `set_split_impulse(enable, penetration_threshold)`: 设置分离冲量
- `set_ccd_parameters(threshold, radius)`: 设置CCD参数
- `enable_multithreading(enable, thread_count)`: 启用多线程
- `setup_spatial_partitioning(partition_size)`: 设置空间分区
- `update(dt)`: 更新物理世界
- `add_rigid_body(rigid_body)`: 添加刚体
- `remove_rigid_body(rigid_body)`: 移除刚体
- `add_constraint(constraint)`: 添加约束
- `remove_constraint(constraint)`: 移除约束
- `add_vehicle(vehicle)`: 添加车辆
- `remove_vehicle(vehicle)`: 移除车辆
- `add_particle_system(particle_system)`: 添加粒子系统
- `remove_particle_system(particle_system)`: 移除粒子系统
- `ray_test(from_pos, to_pos)`: 射线检测
- `ray_test_all(from_pos, to_pos)`: 射线检测(所有结果)
- `get_performance_stats()`: 获取性能统计
- `pause(paused)`: 暂停/恢复
- `set_time_scale(scale)`: 设置时间缩放
- `clear()`: 清除所有对象
- `reset()`: 重置物理世界
### PhysicsDebug类
#### 主要方法
- `enable_debug(enabled)`: 启用/禁用调试
- `set_debug_options(...)`: 设置调试选项
- `update_debug_visualization()`: 更新调试可视化
- `add_contact_point(position, normal, impulse)`: 添加接触点
- `add_collision_event(body_a, body_b, contact_points)`: 添加碰撞事件
- `set_line_thickness(thickness)`: 设置线条粗细
- `set_axis_length(length)`: 设置坐标轴长度
- `set_velocity_scale(scale)`: 设置速度缩放
- `set_force_scale(scale)`: 设置力缩放
- `set_contact_point_size(size)`: 设置接触点大小
- `set_normal_scale(scale)`: 设置法线缩放
- `enable_debug_text(enabled)`: 启用/禁用调试文本
- `enable_stats_display(enabled)`: 启用/禁用统计显示
- `set_debug_update_frequency(frequency)`: 设置调试更新频率
- `hide_debug_visualization()`: 隐藏调试可视化
- `show_debug_visualization()`: 显示调试可视化
- `destroy()`: 销毁调试工具
### PhysicsProfiler类
#### 主要方法
- `record_frame()`: 记录帧数据
- `get_average_update_time()`: 获取平均更新时间
- `get_max_update_time()`: 获取最大更新时间
- `get_min_update_time()`: 获取最小更新时间
- `get_average_fps()`: 获取平均FPS
- `get_object_counts()`: 获取对象数量
- `get_average_object_counts()`: 获取平均对象数量
- `get_performance_report()`: 获取性能报告
- `get_performance_analysis()`: 获取性能分析
- `reset_statistics()`: 重置统计
- `export_statistics(filepath)`: 导出统计
- `destroy()`: 销毁分析器
## 性能优化建议
1. **合理设置时间步长**: 过小的时间步长会影响性能建议在1/60秒左右
2. **控制刚体数量**: 过多的刚体会影响性能,考虑使用休眠机制和剔除
3. **使用适当的碰撞形状**: 复杂形状比简单形状消耗更多资源,优先使用基本形状
4. **启用休眠机制**: 让静止的物体进入休眠状态以节省计算资源
5. **使用连续碰撞检测**: 对于高速运动的物体启用CCD以避免穿透
6. **合理设置求解器参数**: 迭代次数和容差影响精度和性能的平衡
7. **启用调试可视化仅在开发时**: 调试可视化会消耗额外资源
8. **及时销毁不需要的对象**: 避免内存泄漏
9. **使用对象池**: 对于频繁创建销毁的对象使用对象池
10. **空间分区**: 对于大型场景使用空间分区优化碰撞检测
## 故障排除
### 常见问题
1. **刚体穿透**:
- 检查时间步长是否过小,增加求解器迭代次数
- 对高速物体启用连续碰撞检测(CCD)
- 调整碰撞形状边界
2. **性能问题**:
- 减少刚体和约束数量
- 优化碰撞形状复杂度
- 启用休眠机制
- 使用空间分区
- 调整求解器参数
3. **约束不稳定**:
- 检查约束参数,适当调整限制范围
- 增加求解器迭代次数
- 调整约束的破裂阈值
4. **车辆控制不自然**:
- 调整悬挂参数
- 调整轮胎摩擦系数
- 调整发动机扭矩曲线
- 启用或调整ABS、TC等辅助系统
5. **粒子效果不理想**:
- 调整发射器参数
- 调整粒子生命周期参数
- 调整物理属性(重力、阻力等)
- 调整环境影响参数
### 联系支持
如有问题,请联系插件开发者或查看相关文档。