我是靠谱客的博主 殷勤毛衣,这篇文章主要介绍虚幻4渲染编程(物理模拟篇)【第四卷:基于粒子的物理水面】,现在分享给大家,希望可以做个参考。

MY BLOG DIRECTORY:

YivanLee:专题概述及目录

INTRODUCTION:

最近在晚上我的PhyGX物理引擎,目前我的PhyGX已经有了刚体,软体,流体等初级功能,下面就来为PhyGX添加物理水面的模拟功能。

我把水面抽象为一层粒子组成的表面,水面粒子因为张力约束,所以它会在一个定点周围运动。

v2-e288a0281bb7becb84da8ba84ebc7ad7_b.jpg

整个约束结构由四部分组成,T为水面粒子的固定位置,P为水面自由运动的粒子,S为水面粒子和水面粒子固定位置的浮力约束器,L为两个水面粒子之间的张力约束器。最后可得如下效果:

v2-d0da97af5fceb97d8cc42f59db81d4ea_b.gif

MAIN CONTENT:

水面约束结构的构造过程分几步:

第一步:先构造出自由粒子的位置。

v2-ef5f5de7dce2bdb6ae9199c4d9d52260_b.jpg

第二步:构造出固定粒子的位置。

v2-abdbb03aca74d94af54a09f2d66af154_b.jpg

第三步:构造横向张力约束。

v2-1be24361f7f7caead068145726a6a85b_b.jpg

第四步:构造纵向张力约束。

v2-870b5c163357623d038273fa573d3019_b.jpg

第五步:构造浮力约束

v2-a078f05aa6d61048a513b3a50fb0c399_b.jpg

完整代码代码如下:

        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);
}
      

最后

v2-49ca12d0b516140e693149601091c333_b.gif

SUMMARY AND OUTLOOK:

其实我的做法还是比较简单粗暴的,后续还有很多优化空间,比如对固定粒子还可以加入涡流解算来驱动水面粒子进行涡流运动。以上是我的个人思考所得的模拟物理水面的方式,如果有大佬还有更好方法请留言指教。

Enjoy it。


NEXT:

我打算暂停物理篇系列,感觉自己有点走偏了,我毕竟是个美术,还是应该集中更多精力在美术设计深耕上,先这样吧。

最后

以上就是殷勤毛衣最近收集整理的关于虚幻4渲染编程(物理模拟篇)【第四卷:基于粒子的物理水面】的全部内容,更多相关虚幻4渲染编程(物理模拟篇)【第四卷:基于粒子内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部