UnrealEngine4HairStrandPlugin开发日志
来源:
未知 |
责任编辑:传说的落叶 |
发布时间: 2019-06-13 08:20 | 浏览量:
这篇文章介绍了HairStrandPlugin的立项和大体思路。
HairStrandPlugin总览
HairStrandPlugin可以用来实现毛发的设计、模拟和渲染。
效果查看:传送门
在目前来说,该插件可以使用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;
1
1
但是使用这种方法所构建的发丝所需要的图元数量太多,消耗不起。
TriangleList
因此最后还是决定了使用TriangleList。但是如果是使用平常的三角面片则还是无法应对多角度的视线,例如当相机与面片相切时,则完全看不到该面片。
所以最终决定将该网格朝向摄像机展开,使面片时刻朝向摄像机:
这样达到的效果我个人还是非常满意的。
后续开发
后续的开发将会着重几个方面:
Interpolation,在发丝间进行插值,减少样条曲线的运算量。
GPU Simulation,准备将Verlet Integration和Constraint Solve放到GPU上进行运算,应该回更快一些。
多线程加速,不同的发丝应该可以放到其他的线程中去达成线程加速。
后记
HairStrandPlugin只由我一个人开发,从最初的什么都没有到现在能够或多或少看出海飞丝的效果,这样的成果我个人其实已经很满意。
开发过程中再次感觉到数学对于游戏程序员实在是太重要了,在阅读论文的过程中几乎把所有的大学时代学到的数学都过了一遍。日后看来还是要好好过一遍数学了。
相关文章
网友评论
全部评论:0条
推荐
热门