为什么原神中角色头发制作不能“更上一层楼”?

发布时间:
2024-07-13 01:03
阅读量:
69

您见过一个十几秒的动力学缓存文件总体积能达到1T以上的吗?

是的,您没看错,我也没写错

1T

1024G

首先您需要知道,无论是三维动画,还是游戏,里面的动态都可以通过手动K帧去实现

但比较复杂的动态,例如角色激烈的打斗动作

或者基于现实物理碰撞的动态,例如大量物体的撞击与破碎

用手动去K帧就极其不现实了,且不说像不像的问题,光是工程量就能让人望而却步

比如一个角色随便跳了一小段舞,先别管这舞尬不尬,就得一个角色动画师几个小时甚至几天去K这段动作

比如一块大玻璃,摔碎成玻璃渣,手动K帧试试?想想都觉得夸张

所以,这个时候

前者就得用到动作捕捉系统

而后者,得用动力学系统去进行模拟

而动力学有很多种

例如刚体动力学,流体动力学,粒子动力学等等诸如此类

而模拟的时候是需要消耗算力的,无论是CPU或者GPU

而这个算力的消耗随着模拟过程的复杂度是可能出现指数效应的

比如一个巨石下落,在撞击之下碎成一片碎石

下落过程里的模拟会很快,因为还没有任何撞击,计算量很少

但从撞击的那一刻起,计算量开始迅速提升,而随着撞碎的过程中碎块越来越多,碎块与碎块之间也开始出现碰撞和进一步破碎

所需要的算力会进一步飙升

而每一帧之间都会有计算时间的间隔,所以,为了能流畅的看到模拟效果

每算一帧就得缓存一帧的数据

而一个复杂的场景里,比如有大面积的固体,液体,破碎,碰撞等等诸如此类

最后,一段十几秒的缓存数据给膨胀到了1T以上也是不稀奇的

上面说的是刚体或者流体之类的碰撞

那么头发的动力学是如何计算的呢?

简单说就是,一根头发上面会有几个到十几个甚至几十个点,这些点自身会形成一个约束,来进行一根头发的动态模拟

而一百根头发,那就是几百个,甚至上千个,甚至几千个点,这些点在进行自身那一根头发约束的同时,还得计算和其他头发约束点的碰撞

而一百根头发,在写实级别的场景里,根本不够看,您得知道,正常人有十万根头发

算一算,这十万跟头发要进行真实的动态模拟,那需要一个什么级别的算力?

所以即使是电影特效里面,也几乎不可能用十万根头发去进行动态模拟,而是采用一种代理

也就是一根头发的动态,可以影响附近几根或者十几根乃至几十根头发的动态

或者头发密集的地方降低模拟精度,少的地方,例如部分长发末端飘逸的发丝,采用高精度模拟

所以

发丝级别的实时模拟实时渲染,别说游戏了,电影特效都不可能这么干

所以,即使在一些3A游戏里,那些看起来足够飘逸的头发动态

也是先进行动态模拟,然后进行缓存,最后在游戏里实时播放缓存

但是问题来了

前面说过了,精度越高,数据量越大,数据量越大,缓存越大,相应的游戏体积就越大

而游戏体积用来放头发动态的缓存,您觉得有多少性价比呢?

当然,可以优化,可以低精度模拟,例如将每根头发上的约束点从几十个变成几个,然后原本一根头发动态约束影响周围十根,增加到一根头发动态能影响周围几百根头发

但是,精度这么减下去,只要过了那个临界点,您会发现,头发变成了一簇一簇的动,没有任何亮点了,而且依然需要缓存,增加游戏体积占用空间

所以,最后往往被采用的是两种方式

一种是强忍着缓存体积,尽可能的让头发的动态还能有点亮点

另一种,则是现在很多游戏通用的方式,直接手动K帧,用打骨骼绑控制器的方式去给头发K帧,一个控制器就能手动K帧约束一片头发范围,这样相对于高精度的动力学模拟而言能将缓存数据降低到近乎于可以忽略的地步

所以,现在基本就两种情况

一种是那些偏写实风的,咬牙切齿扛着缓存数据也得用动力学模拟一下头发的动态

另一种就是通过打骨骼绑控制器一次性约束一大片,然后手动K帧

而中间状态的,很多都是高不成低不就,既占用了资源,又无法获得同等资源的性价比

尤其是非写实风的游戏,搞成中间这种不高不低,又占资源又不出彩的状态是非常的难受且没有必要的

换言之,不是技术不能实现,也不是不能解决

而是在无数的探索过程中,形成了现在这两种为了契合各自的需求和目的,而相对更有性价比的方式

END