Cocos Creator 液体物理完整方案
Cocos Creator 3.8.8 液体物理完整方案(适配你的肉块软体场景)
分三类方案,从低成本流体视觉 → 粒子流体 → 真实物理液体,按需选择,包含滴落、滩涂、沿斜坡流动、和肉块软体交互效果。
环境前提:3.8.8 内置 Ammo 3D物理 / Box2D 2D物理,无原生流体组件,全部靠扩展实现。
一、粒子模拟流体(90%小游戏首选,性能好、能沿斜面流动)
核心原理
大量带物理刚体的小球粒子模拟水滴/液体,重力下落、碰撞凹凸地面后受摩擦力沿坡面滑动、互相碰撞堆叠成水滩;可和之前弹簧质点肉块发生碰撞交互。
1、2D液体实现(Box2D)
粒子预制体
- Node:水滴
- RigidBody2D Dynamic,质量极小0.05
- CircleCollider2D
- 物理材质:摩擦力0.3、弹力0.05(低回弹,水不会乱弹)
- 发射器脚本:定时生成水滴粒子,设置初始速度
液体聚合效果
- 粒子碰撞后叠加局部阻尼,落地后速度快速降低,堆积形成水洼
- ChainCollider2D 凹凸斜坡自动引导粒子顺着边缘流动
销毁规则:停留地面超过5秒自动销毁,避免粒子爆炸卡顿
2、3D液体实现(Ammo)
水滴小球SphereCollider刚体,MeshCollider凹凸地形自动导流;
增加粒子颜色叠加、透明度,大量粒子重叠模拟半透明水体。优缺点
开发快、性能友好、支持和软体肉块碰撞、自动沿斜坡流动
无流体压力、不会扩散摊开成薄水膜,仅点状水滴
简易生成水滴TS代码(3D)
import { _decorator, Component, Node, instantiate, Vec3 } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('LiquidDropEmitter')
export class LiquidDropEmitter extends Component {
@property(Node) dropPrefab!: Node;
@property dropSpeed = 3;
private timer = 0;
update(dt: number) {
this.timer += dt;
if(this.timer > 0.1) {
this.timer = 0;
const drop = instantiate(this.dropPrefab);
drop.setParent(this.node.parent);
drop.setWorldPosition(this.node.worldPosition);
// 随机横向偏移,模拟液体散开
drop.getComponent(RigidBody)!.setLinearVelocity(new Vec3(
(Math.random()-0.5)*this.dropSpeed,
-this.dropSpeed,
0
))
}
}
}二、网格流体(2D 流体变形,滩涂、液体摊开,适合桌面积水)
实现方案: metaball 元球流体(视觉流体)
- 底层逻辑:多个水滴粒子作为元球,Shader叠加融合,视觉连成一整片液体;
- 物理层还是上面的刚体水滴,渲染层用后处理元球Shader融合,实现连续水面;
- 斜坡流动:刚体粒子沿凹凸地面滑动,元球跟随粒子位置实时更新,液体顺着台面边缘流淌;
和肉块交互:液体粒子碰到软体质点刚体产生碰撞,水被肉块挤开。
局限
仅视觉融合,无真实流体压强,无法模拟水压冲击、波浪。
三、SPH 光滑粒子流体动力学(真实物理液体,专业流体)
核心特性(真实水物理)
- 具备密度、压力、粘度;液体挤压会向四周摊开,高处流向低处,斜坡自然流淌;
- 撞击物体产生水花、飞溅;液体能包裹、推开软体肉块;
粘度可调:低粘度清水、高粘度蜂蜜/粘稠酱汁(贴合你肉块软体需求)
Cocos 3.8.8 两种接入方式
- 开源JS SPH库 + Ammo物理联动(Web端)
手写SPH计算循环,每一帧遍历所有液体粒子,计算压力、粘性力,更新粒子速度,再同步给Ammo刚体做碰撞; 外部烘焙方案(性能优化)
Blender烘焙流体动画,VAT顶点动画导入,仅播放固定水流动画,无法实时交互,不能和肉块动态碰撞缺点
SPH每帧计算量大,粒子超过300移动端严重掉帧,仅适合少量液体特效。
四、Ammo 软体模拟粘稠液体(蜂蜜、酱料,软质流体)
承接你之前的肉块弹簧质点方案:
把大量微小质点用极软弹簧约束连接(Frequency=1.5,阻尼0.2),整体表现粘稠流体;
- 低刚度弹簧:质点极易拉伸、摊开,像液体流动
- 高阻尼:流动缓慢,粘稠不飞溅
- 掉落在凹凸表面会顺着轮廓缓慢铺开,可和肉块软体互相挤压形变
五、关键细分需求调参指南
1. 清水(流动快、易散开)
粒子质量0.03,摩擦力0.2,弹力0.05,弹簧刚度极低(SPH粘度0.1)
2. 酱汁/粘稠液体(慢流、挂壁、贴合物体)
粒子质量0.08,摩擦力0.5,SPH粘度0.8;弹簧软体方案阻尼0.7
3. 沿凹凸桌面滑动核心设置
地面必须使用 ChainCollider2D(2D) / MeshCollider(3D)
禁用多个分离方块碰撞体,否则液体容易卡缝隙;刚体开启CCD连续碰撞防止穿模。
4. 液体与肉块软体交互
液体粒子刚体 和 肉块质点刚体 开启互相碰撞;
粘稠液体撞击肉块时,给肉块增加额外冲击力,实现肉块被水冲得晃动。
六、选型快速推荐
- 只需要滴水、水花、沿桌子流淌、和肉块简单碰撞 → 粒子刚体流体(方案一)(首选,低成本)
- 需要一整片积水、液体融合成水面视觉 → 粒子+元球Shader(方案二)
- 追求真实水压、波浪、粘稠酱汁摊开效果 → SPH流体(方案三,性能消耗高)
- 模拟果冻、粘液这类半固半液软物质 → 弹簧质点软体(承接你之前肉块方案)
七、性能优化
- 屏幕外液体粒子直接休眠刚体、停止计算;
- 单场景液体粒子上限控制在200以内;
- 移动端放弃SPH,只用简单粒子流体;
- 积水静态区域,超出5秒未动的粒子合并为静态面片,停止物理计算。
版权属于:Joyber
本文链接:https://blog.qqvbc.com/default/1495.html
转载时须注明出处及本声明