YivanLee:專題概述及目錄?zhuanlan.zhihu.com
最近在晚上我的PhyGX物理引擎,目前我的PhyGX已經有了剛體,軟體,流體等初級功能,下面就來為PhyGX添加物理水面的模擬功能。
我把水面抽象為一層粒子組成的表面,水面粒子因為張力約束,所以它會在一個定點周圍運動。
整個約束結構由四部分組成,T為水面粒子的固定位置,P為水面自由運動的粒子,S為水面粒子和水面粒子固定位置的浮力約束器,L為兩個水面粒子之間的張力約束器。最後可得如下效果:
水面約束結構的構造過程分幾步:
第一步:先構造出自由粒子的位置。
第二步:構造出固定粒子的位置。
第三步:構造橫向張力約束。
第四步:構造縱向張力約束。
第五步:構造浮力約束
完整代碼代碼如下:
void FPhyGXProduceParticleNet::BuildParticleNet_Buoyancy(const FTransform& ActorRootTrans) { BeginBuildNet();
int32 NX = 50; int32 NY = 50; //------- //------- //------- int32 NCXH = (NX - 1); int32 NCXV = NY; //||||||| //||||||| //||||||| int32 NCYH = NX; INT32 NCYV = (NY - 1);
float CellLength = 20.0f; Particles.AddUninitialized(NX * NY * 2); DistanceConstraints.AddUninitialized(NCXH * NCXV + NCYH * NCYV + NX * NY);
for (int32 y = 0; y < NY; y++) { for (int32 x = 0; x < NX; x++) { Particles[x + NX * y].InitVerletParticle(FVector(x * CellLength, y * CellLength, 0), true, false, false, false, 1, 10); } } for (int32 y = 0; y < NY; y++) { for (int32 x = 0; x < NX; x++) { Particles[x + NX * y + NX * NY].InitVerletParticle(FVector(x * CellLength, y * CellLength, 0), false, false, false, false, 1, 10); Particles[x + NX * y + NX * NY].bDrawDebug = false; } }
// for (int32 y = 0; y < NCXV; y++) { for (int32 x = 0; x < NCXH; x++) { DistanceConstraints[x + NCXH * y].InitDistanceConstraint(Particles[y * NX + x], Particles[y * NX + x + 1], CellLength, FVector(1, 1, 1)); } } for (int32 y = 0; y < NCYV; y++) { for (int32 x = 0; x < NCYH; x++) { DistanceConstraints[x + NCYH * y + NCXH * NCXV].InitDistanceConstraint(Particles[y * NCYH + x], Particles[(y + 1) * NCYH + x], CellLength, FVector(1, 1, 1)); } } for (int32 y = 0; y < NY; y++) { for (int32 x = 0; x < NX; x++) { DistanceConstraints[NCXH * NCXV + NCYH * NCYV + x + y * NX].InitDistanceConstraint(Particles[x + y * NX], Particles[x + y * NX + NX * NY], 1, FVector(0.01, 0.01, 0.01)); } } FinishBuildNet(ActorRootTrans); }
最後
其實我的做法還是比較簡單粗暴的,後續還有很多優化空間,比如對固定粒子還可以加入渦流解算來驅動水面粒子進行渦流運動。以上是我的個人思考所得的模擬物理水面的方式,如果有大佬還有更好方法請留言指教。
Enjoy it。
我打算暫停物理篇系列,感覺自己有點走偏了,我畢竟是個美術,還是應該集中更多精力在美術設計深耕上,先這樣吧。