Unreal Engine 4 —— Marching Cube算法的实现与思考

这篇博客介绍了我在Unreal Engine 4中通过Marching Cube算法来构建隐式曲面模型的过程,以及我的一些思考。


背景

前面的博客游戏《孢子》的思考 —— Marching Cube算法提到了Marching Cube的大致思路,剩下的就是如何在UE4中将其实现了。因此花了一天的时间将其在UE4中实现了一下。

效果图

以下效果图中,蓝色部分是使用Debug Draw方法绘制的三角形边。

这是球形曲面方程x2+y2+z2100=0的效果图(细分程度为10):

Unreal Engine 4 —— Marching Cube算法的实现与思考

这是曲面方程4x2+y2+z2100=0的效果图(细分程度为10):

Unreal Engine 4 —— Marching Cube算法的实现与思考

这是曲面方程x24+y24z=0效果图(细分程度为10):

Unreal Engine 4 —— Marching Cube算法的实现与思考

这是细分程度为20的图:

Unreal Engine 4 —— Marching Cube算法的实现与思考

依然存在的问题

以什么方式绘制顶点?

目前的做法是在Gameplay逻辑中运行Marching Cube算法,然后将得到的Density,Normal,Position信息传递到SceneProxy里面,然后在SceneProxy里面创建顶点并且绘制。

但是应该有更加高效的做法……

UV怎么处理?

一个很蛋疼的问题在于UV —— 该怎样生成一个比较合适的UV,从而获得一个比较好的效果?

在GPU Gems 3里面提到过类似的情况,不过是用于做地形的,并不普适。

在Stackoverflow上面有人提到过直接使用Enviroment mapping,就是在获得了Normal之后,直接通过(x/2+0.5, y/2+0.5)来作为uv。目前还没尝试过,不过可以试试看。

切线空间怎么构建?

因为UE4的渲染管线无法自定义,因此想要实现Gouraud Shading还是比较难的,这也就是上面的模型的光影看起来很奇怪的原因。

工具链怎么适配?

我原本想使用BlueprintNativeEvent作为曲面方程的函数,默认为一个圆曲面,用户可以重写对应的曲面方程。但是这种做法只针对于那些可以由BP继承的Component有效。由于这里继承自Mesh Component,因此无法进行由蓝图继承。

按这么说……看来只能使用Blueprint Interface来进行操作了?

Wireframe为啥显示不出来?

这条划掉,切线空间建立后就显示出来了……
很奇怪的,在Lit Mode与Unlit Mode下都可以显示,但是切换到Wireframe模式下,就显示不出来了……这一步需要进一步研究……

<全文完>