Crest海洋系统:碰撞形状与浮力物理详解
crest 项目地址: https://gitcode.com/gh_mirrors/cre/crest
概述
Crest海洋系统提供了一套完整的海洋表面交互解决方案,包括精确的碰撞检测和浮力物理模拟。本文将深入解析系统中的碰撞形状计算原理与浮力物理实现机制,帮助开发者更好地理解和使用这些功能。
碰撞形状系统
核心原理
Crest系统通过多种途径计算海洋表面信息,包括高度、位移、流动和表面速度等。这些计算路径通过"Animated Waves Sim Settings"中的"Collision Source"下拉菜单进行配置。
系统支持在不同分辨率下采样碰撞数据。查询函数中的"Min Spatial Length"参数用于指定所需的细节级别——小于该参数值一半的波长将被排除在计算之外。
关键技术:固定点迭代
系统采用了一种称为"固定点迭代"(Fixed Point Iteration)的技术来计算水面高度。这项技术通过迭代逼近的方法,能够高效准确地确定物体与水面的交互位置。
开发提示:Visualise Collision Area调试组件可用于可视化碰撞形状,方便与渲染表面进行对比。它在场景视图中绘制调试线框,直观展示碰撞区域。
碰撞API使用规范
异步查询机制
Crest内置的碰撞提供者采用异步查询方式,将查询任务卸载到GPU或空闲CPU核心进行处理。这种机制带来了几个重要的使用注意事项:
- 唯一标识符:每个查询需要注册一个全局唯一的ID,通常通过调用对象/组件的GetHashCode()方法获取
- 单次查询原则:每个所有者每帧只能进行一次查询,使用相同ID的第二次查询会覆盖前一次
- 持续轮询:即使是单次高度查询,也应每帧调用查询函数,直到返回成功结果
计算形状查询(GPU)
这是默认且推荐的查询方式,适用于有GPU的环境。系统将查询位置上传到计算着色器,着色器采样海洋数据后返回结果。这种查询方式能精确跟踪表面高度,包含所有波浪分量、深度缓存等Crest特性。
CPU备选方案
预烘焙FFT数据
针对无GPU环境(如无头服务器),系统提供了CPU方案:
- 在生成波浪的Shape FFT组件上启用"Enable Baked Collision"
- 配置参数:
- 时间分辨率:烘焙数据的帧率,值越大碰撞跟踪越精确,但数据量也越大
- 最小所需波长:碰撞中需要的最小波长
- 时间循环长度:FFT波浪循环的周期(秒)
重要限制:
- 仅支持单一组波浪
- 不支持深度缓存组件
- 不支持变化的水位(如河流梯度或不同海拔的湖泊)
Gerstner波浪CPU(已弃用)
此选项由Shape Gerstner Batched组件提供支持,直接对所有波浪进行求和计算位移、法线、速度等。虽然水平范围不受限,但存在CPU性能成本高、不支持水深衰减等限制。
浮力物理系统
实现方案对比
Crest提供了两种不同复杂度的浮力实现:
-
SimpleFloatingObject:
- 简单浮力脚本
- 使物体位置和旋转与水面高度和法线匹配
- 适用于不需要精确浮力行为的小型船只或浮动物体
-
BoatProbes:
- 在多个ForcePoints计算浮力
- 对物体施加力和扭矩
- 结果更精确但查询次数更多
专业建议:对于需要高质量物理模拟的船只,建议使用专门的物理解决方案而非内置脚本。Crest的浮力物理主要用于简单场景。
附加组件
BoatAlignNormal是一个基础的船只物理模拟器,为SimpleFloatingObject添加了引擎和舵。虽然功能简单,但对于不需要高质量动画的场景仍可发挥作用。
最佳实践
- 优先使用GPU计算形状查询以获得最佳性能和精度
- 对于简单浮动物体,SimpleFloatingObject通常足够
- 需要更真实物理交互时考虑BoatProbes
- 无GPU环境使用预烘焙FFT数据方案
- 定期检查碰撞可视化以确保预期行为
通过合理配置这些功能,开发者可以在Crest海洋系统中实现从简单到复杂的各种水面交互效果。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考