网易首页 > 网易号 > 正文 申请入驻

Niagara链条及蒙皮

0
分享至

【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!

这是侑虎科技第1763篇文章,感谢作者杨超wantnon供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)

作者主页:

https://www.zhihu.com/people/wantnon

(本文使用UE 4.27的版本)

早先看到下面用Niagara实现链条的教程:

Unreal Niagara - Tentacle effect with physics simulation (FULL TUTORIAL)

https://www.youtube.com/watch?v=vYaHl5bf4ww&t=1934s

后来又看到个进一步的,在此基础上加了蒙皮:

Rigging With Niagara - Part 1: Dangling Cable - Direct Interpolation

https://www.youtube.com/watch?v=r7c1s7Mwe9w

自己照着做了一遍,发现这方法有很多问题,于是又想了个改进方案。

一、Niagara链条

首先根据教程(Unreal Niagara - Tentacle effect with physics simulation (FULL TUTORIAL))实现基础的链条效果,其中几个要点:

1. 物理迭代是用P osition Based方法,就是对于链条上每个点,计算其相对于各邻接点的平衡位置偏离了多少,偏离多少就移回多少,如果有多个邻接点,则将分别计算的移回向量相加取平均,作为最终移回量,公式如下:

2. 在这个链条模拟中,我们把起始粒子的前驱认为是自身,即存在linkPos=pos的情况,所以上式分母中+0.0001就十分必要,否则会因除以零而产生NAN。

3. 物理迭代通过添加Simulation Stage实现(只有在GPU Sim下才能用),Simulation Stage中可以设置迭代次数,不同的约束可能需要的迭代次数不同,可以分成多个Stage去做,每个Stage单独设置迭代次数。对于上述长度约束,我试了下需要4次才能效果较好。

4. Calculate Accurate Velocity这一步,若非教程里说了,自己可能想不到。另外Calculate Accurate Velocity可以从迭代次数为4的模拟Stage里移出来,放到后面迭代次数为1的Stage里。

至此,如果是要做锁链之类的效果,只需把粒子替换成圆环模型,就可以了。但我们的目的是想做蒙皮。

二、链条蒙皮

教程(Rigging With Niagara - Part 1: Dangling Cable - Direct Interpolation)讲得比较笼统,但从中还是能大致了解其思路。要点如下:

1. 把模拟出的链条上各粒子坐标写到一个ParticleCount x 1像素的RT上,传给材质。并借助RT的双线性插值实现平滑。

2. MeshRenderer的SourceMode要由Particles改为Emitter,这样就不会为每个粒子挂一个Mesh,而是整个Emitter挂一个Mesh:

3. 沿着绳子建立切空间,则无论绳子怎么弯曲,蒙皮上各点的切空间坐标不变,利用这点计算蒙皮各点的世界坐标,然后WPO。这一步在材质中进行。

其中3存在一个问题,就是“沿着绳子建立切空间”,即使在锁定初始点的切空间的情况下,也有无数种结果。

教程中取的是:

T=normalize(p_nxt-p),

B=normalize(cross(T, (1,0,0) )),

N=cross(B,T)。

但这种算法并不能保证当绳子任意弯曲时,相邻质点的切空间足够接近,或者说相邻质点的法线是渐变的。

在剧烈摆动时会出问题,如下视频所示:

于是针对如何对空间曲线生成法线这个问题,搜了一下,下面这个还算吻合:

opengl es - Vector math, finding coördinates on a planar between 2 vectors - Stack Overflow

https://stackoverflow.com/questions/4504331/vector-math-finding-co%c3%b6rdinates-on-a-planar-between-2-vectors/4505658#4505658

主要就是说明给曲线生成渐变的法线,只考虑局部就不行了,需要考虑整体,他给出的代码是其中最简单的一种方法,就是用上一个粒子的法线去算下一个粒子的法线。

我按这个简单实现试了一下,发现效果仍不理想,原因可能有两点:

1. 我的分段太稀疏,导致即使考虑了上一个粒子的法线影响,仍然会出现剧烈转折。

2. 此算法严格来讲需顺序执行,而Niagara中GPU粒子的执行顺序是乱序的。

于是我暂时放弃了这种基于数学的思路,转而考虑基于物理的思路。

就想是不是可以引入扭矩约束,从而避免相邻粒子朝向差异过大,即避免拧麻花。

三、改进:防止扭转、翻转

我一开始想的是给粒子添加旋转属性,然后想着在模拟阶段修正位置的同时对旋转也作一个修正,但我不知道依据什么更新粒子的旋转属性,于是放弃这个思路。

然后想到,如果升维,把绳子看成有内部结构,如图:

则有可能仅 通过对距离作约束就同时起到防止扭转的作用。

绳子截面边数自然是越多越好,摆动起来各方向物理性质更均等,但粒子数也会成倍增加,所以我只试了正三角形截面和正方形截面。出于简单,以下以正三角形截面为例。

如上图, 如果仅像(a)那样连接,侧面是平行四边形,不稳定,可能出现压扁、扭转、翻转三种情况,如图所示:

为侧面 添加支架,变成(b),就稳定多了,压扁和扭转都能得到限制,但仍会出现上下翻转问题,如下视频所示:

之所以出现这种情况,是因为以截面为镜面,上下对称的两个点的长度一样,所以从距离约束的角度讲,上下两个位置都是满足条件的解。为了避免这个问题,对隔一层粒子也添加距离约束,如图(c)(d)所示,其中(d)在隔层之间作了全约束,而(c)只作了交叉约束,经试验发现(c)就够用了。

改为(c)后,上下翻转不会发生了,但仍存在自穿插翻转,如下视频所示:

要解决自穿插翻转,通过距离约束貌似是不行了(我没想到),但观察自穿插翻转的特点,容易看出当发生自穿插翻转时,三条侧边一定不再平行。所以想到,如果加一个每段三棱柱三条侧边平行的约束,应该就可以避免自穿插翻转了。具体算法如下:

pos_new=pos_P +safeNormalize(c-c_P)*distance(pos-pos_P)

注:这里只让当前粒子pos所关联的上游边pos_P->pos与上游中轴线c_P->c平行,没有让pos所关联的下游边pos->pos_N与下游中轴线c->c_N平行。因为实际试验发现上下游都处理效果不好,原因可能是当扭转发生时,如果想通过移动当前粒子缓解,让上游平行和让下游平行移动方向必定是冲突的,所以不如只考虑上游。

效果:

可见,无论怎么动,都不会出问题了。

有了鲁棒的三棱柱绳子,就可以算出稳定的法线,这里我们是用第一条棱与相应的截面中心点作差作为法线,然后就可以在材质里构建稳定的切空间,进行蒙皮:

之前 是把Position存到了RT里传入材质,现在还要增加一张RT,用来存法线。

蒙皮后效果:

四、正确的蒙皮法线

上面视频中绳子的明暗是不正确的,因为没有考虑绳子弯曲对模型顶点法线的影响。

正确的蒙皮法线计算方法如下:

(1)绳子Tpos切空间基:

T0=(0,0,-1)

N0=(1,0,0)

B0=cross(N0,T0)

(2)vertexNormal在绳子Tpos切空间的坐标:

vertexNormalProjOnT0=dot(vertexNormal,T0)

vertexNormalProjOnN0=dot(vertexNormal,N0)

vertexNormalProjOnB0=dot(vertexNormal,B0)

(3)绳子Bendpos切空间基:

T=采样posRT并差分得到

N=采样normRT得到

B=cross(N,T)

(4)根据蒙皮法线Bend前后切空间坐标不变,计算Bend后的顶点法线vertexNormalBend:

vertexNormalBendProjOnT=vertexNormalProjOnT0

vertexNormalBendProjOnN=vertexNormalProjOnN0

vertexNormalBendProjOnB=vertexNormalProjOnB0

vertexNormalBend=mul(vertexNormalBendProjOnT,T)+mul(vertexNormalBendProjOnN,N)+mul(vertexNormalBendProjOnB,B)

最后还有一个细节问题,就是在没有Bend发生时,Bendpos切空间应该是与Tpos切空间完全重合的。未Bend时T由差分求出来是竖直向下,这和T0=(0,0,-1)吻合,没问题,但未Bend时normRT采样出来的N是否也与N0=(1,0,0)重合,就要看一下了。前面说过,我们是用第一条棱与相应的截面中心点作差作为法线N,那也就是说我们要保证在不Bend时第一条棱与截面中心作差指向X轴,所以截面应如下构建:

修正蒙皮法线后效果:

五、补充

1. Niagara的Custom HLSL中语法注意事项:

(1)错误:int index=index%10;

正确:int index=index %10;//%前要有空格。

(2)错误:NiagaraID idList[2]={PID,NID};

正确:NiagaraID idList[2]={ PID,NID };// { 后和 } 前要有空格

报错信息去Output Log窗口看,那里才是详细信息。

2. DebugDraw节点中,不要用drawSphere,其编译时间很长,drawLine和drawBox都编译很快。

3. 如果希望不同链条约束强度有差异,或者方便忽略掉一些链条(权重给0),可以用加权版本公式:

4. Slover模块连线过多,一堆GetVectorByID+Custom HLSL节点:

可用如下方法简化:

打开生成的Shader Code:

搜GetVectorByID,可以搜到:

声明处:

使用处:

所以GetVectorByID可以写到Custom HLSL里面:

所以众GetVectorByID+Custom HLSL可合并成一个大的CustomHLSL:

需要注意的一点是,需要保留一个GetVectorByID("Position")节点,以便生成函数声明,否则会报错。

同理,Setup模块也可做同样简化:

文末,再次感谢 杨超wantnon 的分享, 作者主页: https://www.zhihu.com/people/wantnon, 如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群: 793972859 )。

近期精彩回顾

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
紫苏是“纯阳草”,但遇上黑豆才是绝配!入伏前每天喝一碗

紫苏是“纯阳草”,但遇上黑豆才是绝配!入伏前每天喝一碗

白米饭怎么吃
2026-07-03 19:23:42
84岁高明现状:痛失独子后,在北京定居生活,儿媳一举动让人泪目

84岁高明现状:痛失独子后,在北京定居生活,儿媳一举动让人泪目

白面书誏
2026-07-14 19:13:29
毛泽东时代经济是崩溃的?从对越反击战的军费支出,便可揭晓一切

毛泽东时代经济是崩溃的?从对越反击战的军费支出,便可揭晓一切

大运河时空
2026-07-15 14:25:03
图赫尔:阿根廷没明显短板;我确实想过对梅西采用人盯人防守

图赫尔:阿根廷没明显短板;我确实想过对梅西采用人盯人防守

懂球帝
2026-07-15 10:01:26
A股:收盘后,传来一个信息,明天,周四或要这样走!

A股:收盘后,传来一个信息,明天,周四或要这样走!

明心
2026-07-15 16:32:48
随着西班牙2-0淘汰法国,世界杯还剩3队争冠!最新夺冠排行如下

随着西班牙2-0淘汰法国,世界杯还剩3队争冠!最新夺冠排行如下

小火箭爱体育
2026-07-15 05:25:57
通报停职还没完!霸占车位彭某接连受挫,遴选成绩引发网友热议

通报停职还没完!霸占车位彭某接连受挫,遴选成绩引发网友热议

社会日日鲜
2026-07-15 11:11:59
突发!克莱愿意重返勇士!水花兄弟再合体!哈登确定新续约合同

突发!克莱愿意重返勇士!水花兄弟再合体!哈登确定新续约合同

Tracy的篮球博物馆
2026-07-15 10:26:45
国家统计局副局长毛盛勇:房地产是大家都高度关注的领域,市场出现了一些积极变化

国家统计局副局长毛盛勇:房地产是大家都高度关注的领域,市场出现了一些积极变化

政知新媒体
2026-07-15 13:15:16
两头不讨好?巅峰已过被队友嫌弃的张本兄妹,终替父母选择买了单

两头不讨好?巅峰已过被队友嫌弃的张本兄妹,终替父母选择买了单

有范又有料
2026-07-15 21:34:09
美军宣布对伊朗开始新一波打击

美军宣布对伊朗开始新一波打击

界面新闻
2026-07-15 18:36:01
54岁齐达内近况,成顶级教头,执掌法国,身价过亿,4儿子都踢球

54岁齐达内近况,成顶级教头,执掌法国,身价过亿,4儿子都踢球

大西体育
2026-07-15 17:06:47
紧急通知一声,大家做好准备!今天 7月15日9点56分正式进入头伏

紧急通知一声,大家做好准备!今天 7月15日9点56分正式进入头伏

普陀动物世界
2026-07-15 09:56:55
1937年,他下令活埋2609名红军,12年后被认出:你化成灰我也认得

1937年,他下令活埋2609名红军,12年后被认出:你化成灰我也认得

磊子讲史
2026-07-02 15:30:38
人口大迁徙基本定了,未来超一半中国人,或将流入这些地方

人口大迁徙基本定了,未来超一半中国人,或将流入这些地方

蜉蝣说
2026-07-12 11:57:41
比亚迪澄清唐电机脱落事件:底盘磕碰所致,非质量问题

比亚迪澄清唐电机脱落事件:底盘磕碰所致,非质量问题

TechWeb
2026-07-14 21:47:03
爱与不爱真的很明显!汪小菲就是从这时候开始不爱大S的,细思极恐

爱与不爱真的很明显!汪小菲就是从这时候开始不爱大S的,细思极恐

扒星人
2026-07-15 09:05:27
悲催!一组殡仪馆出灵、火化公示表格刷屏,“不要灰”成舆论焦点

悲催!一组殡仪馆出灵、火化公示表格刷屏,“不要灰”成舆论焦点

火山詩话
2026-07-14 12:52:02
票房破7亿!新京报痛批《功夫女足》过时,观众:好看爱看必须看

票房破7亿!新京报痛批《功夫女足》过时,观众:好看爱看必须看

胡一舸南游y
2026-07-15 14:19:29
7月15号,人社部财政部2026年调整退休人员养老金的通知有公布吗?

7月15号,人社部财政部2026年调整退休人员养老金的通知有公布吗?

小谈食刻美食
2026-07-15 08:33:45
2026-07-15 22:08:49
侑虎科技UWA incentive-icons
侑虎科技UWA
游戏/VR性能优化平台
1598文章数 987关注度
往期回顾 全部

科技要闻

国行大突破!“Apple智能”已备案

头条要闻

法国队完败出局将迎季军赛 法媒:角逐屎上雕花的奖牌

头条要闻

法国队完败出局将迎季军赛 法媒:角逐屎上雕花的奖牌

体育要闻

世界杯两大巨星,加一起22岁

娱乐要闻

大S遗嘱曝光!S家拒不承认

财经要闻

梁文锋身家2400亿登顶全球AI首富

汽车要闻

爱玩会玩 小鹏MONA L03这次来势凶猛

态度原创

教育
房产
家居
艺术
时尚

教育要闻

拆解《马斯克原理》:普通阿斯孩子,能从马斯克身上学到什么?

房产要闻

海南买房,开始大规模返现了!

家居要闻

2026建博会(广州) 公装联探展交流活动

艺术要闻

河北放弃450米“第一高楼”,或许选对了路

时尚圈新置顶的“colorfit”,到底怎么穿

无障碍浏览 进入关怀版