您的位置:首页 > 大数据 > 人工智能

Unreal Engine 4 —— HairStrandPlugin开发日志

2016-09-03 19:27 323 查看
这篇博客介绍了我的个人项目 —— HairStrandPlugin的立项和大体思路。

HairStrandPlugin总览

HairStrandPlugin是我的私人项目,可以用来实现毛发的设计、模拟和渲染。目前的效果(2016-09-03之前)为可以在我个人的笔记本(GTX850M 游戏开发者居然还用着这么差的笔记本,求路过的土豪打赏……)上顺滑模拟超过2500根样条发丝。

效果查看:传送门



在目前来说,该插件可以使用Maya进行发型的设计,将发型导入UE4后便可以直接进行发丝的模拟和渲染了。

使用教程:传送门

墙内用户请访问:传送门

目前工具链的适配方面还有一些小问题,但是总体上不影响使用。

HairStrandPlugin的立项

HairStrandPlugin在一个月前立项。在练手插件GhostMeshPlugin完成后,我便开始了HairStrandPlugin的开发,将代码托管于coding.net平台之上。

小厂商的情怀

针对于发丝的模拟,各大游戏厂商都已经做的不错,例如爱丽丝疯狂回归中爱丽丝的发丝,古墓丽影中劳拉的发丝和最终幻想15中的发丝等均为高质量的发丝表现。

但是可惜除古墓丽影的TressFX已经开源外,我们这些小厂商也无法窥探到发丝技术的奥秘。又因为我当前所参与开发的项目隐龙传:影踪里主角陆天源也是长发造型,因此我便开始了这个项目,希望能够让没有太多背景的游戏开发者也可以在UE4上实现发丝的渲染。

Nvidia Hairworks

实际上,Nvidia也已经推出了Hairworks,专门用于毛发的渲染,而且效果相当不错。但是以来Hairworks采用的是基于DirectX 11 的Tessellation技术,换句话说,无法在移动平台和Play Station平台上使用。

另一方面,由于Nvidia Hairworks只公开了PC版本的库,因此针对于其他系统,Hairworks无法适配。

Apex Cloth

Apex Cloth是Nvidia推出的可以用于布料的模拟的工具,并且已经集成在UE4里面了。实际上在该插件还未完全实装的情况下,时至今日隐龙传:影踪也是正在使用Apex Cloth进行发丝的模拟。可是Apex Cloth在模拟发丝上还是有一些短板:

不支持移动平台,换句话说在Android平台上无法正常工作。

布料与发丝还是有差别,例如在Apex Cloth上的布料不会回弹。因此使用Apex Cloth模拟的发丝在表现发型上略不适应。

Apex Cloth与UE4中的Skeletal Mesh完全绑定,换句话说一个Skeletal Mesh只能绑定一个类型的布料,该布料的信息无法在runtime进行调整。假如角色从陆地进入水中,布料阻尼damp无法进行调整,因此在水中的表现将会很怪异。

开发过程

到目前为止的开发过程大致可以分为两块:Particle Simulation和Strand Mesh Build。

初期针对于发束粒子进行Physical Simulation、Collision Detection和Constraint Solve。

然后利用结算得来的粒子进行样条插值,从而将发丝构建出来。

Particle Simulation

针对发束粒子来说,整体的模拟分成力场模拟、碰撞检测和约束迭代。

重力&风力模拟

在HairStrandPlugin中,我采用的是带有阻尼的Verlet Integration来进行模拟:

x(t+Δt)=x(t)+(x(t)−x(t−Δt))∗damp+aΔt2

在上面的公式中,damp为阻尼系数,阻力越大则该值越小。而a则是该粒子在该处的加速度,重力、风力或者水流等都可能影响这个值。



关于Verlet Integration,我在之前的一篇博客Unreal Engine 4 —— 可交互绳索的构建也提到过。

碰撞检测

目前的发束例子只进行了球形的检测,检测方法很简单:检测发束粒子与球心的距离,若距离小于半径r,则将改粒子推到球面即可。

约束迭代

针对于约束,目前来讲分为Global Constraint Solve和Local Constraint Solve。Global Constraint Solve用于保持发型,Local Constraint Solve用于处理两个过远的粒子。

总体来讲还是不难。

Strand Mesh Build

Strand Mesh的构建经历了一些风波。

LineMesh

最开始的时候我打算使用
LineMesh
来进行发丝的模拟:

Mesh.Type = PT_LineList;


但是使用这种方法所构建的发丝所需要的图元数量太多,消耗不起。

TriangleList

因此最后还是决定了使用
TriangleList
。但是如果是使用平常的三角面片则还是无法应对多角度的视线,例如当相机与面片相切时,则完全看不到该面片。

所以最终决定将该网格朝向摄像机展开,使面片时刻朝向摄像机:



这样达到的效果我个人还是非常满意的。

后续开发

后续的开发将会着重几个方面:

Interpolation,在发丝间进行插值,减少样条曲线的运算量。

GPU Simulation,准备将Verlet Integration和Constraint Solve放到GPU上进行运算,应该回更快一些。

多线程加速,不同的发丝应该可以放到其他的线程中去达成线程加速。

后记

HairStrandPlugin只由我一个人开发,从最初的什么都没有到现在能够或多或少看出海飞丝的效果,这样的成果我个人其实已经很满意。

开发过程中再次感觉到数学对于游戏程序员实在是太重要了,在阅读论文的过程中几乎把所有的大学时代学到的数学都过了一遍。日后看来还是要好好过一遍数学了。

<全文完>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息