99国产精品欲av蜜臀,可以直接免费观看的AV网站,gogogo高清免费完整版,啊灬啊灬啊灬免费毛片

網(wǎng)易首頁 > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

Niagara鏈條及蒙皮

0
分享至


【USparkle專欄】如果你深懷絕技,愛“搞點(diǎn)研究”,樂于分享也博采眾長,我們期待你的加入,讓智慧的火花碰撞交織,讓知識(shí)的傳遞生生不息!

這是侑虎科技第1763篇文章,感謝作者楊超wantnon供稿。歡迎轉(zhuǎn)發(fā)分享,未經(jīng)作者授權(quán)請(qǐng)勿轉(zhuǎn)載。如果您有任何獨(dú)到的見解或者發(fā)現(xiàn)也歡迎聯(lián)系我們,一起探討。(QQ群:793972859)

作者主頁:

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

(本文使用UE 4.27的版本)

早先看到下面用Niagara實(shí)現(xiàn)鏈條的教程:

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

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


后來又看到個(gè)進(jìn)一步的,在此基礎(chǔ)上加了蒙皮:

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

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


自己照著做了一遍,發(fā)現(xiàn)這方法有很多問題,于是又想了個(gè)改進(jìn)方案。

一、Niagara鏈條

首先根據(jù)教程(Unreal Niagara - Tentacle effect with physics simulation (FULL TUTORIAL))實(shí)現(xiàn)基礎(chǔ)的鏈條效果,其中幾個(gè)要點(diǎn):

1. 物理迭代是用P osition Based方法,就是對(duì)于鏈條上每個(gè)點(diǎn),計(jì)算其相對(duì)于各鄰接點(diǎn)的平衡位置偏離了多少,偏離多少就移回多少,如果有多個(gè)鄰接點(diǎn),則將分別計(jì)算的移回向量相加取平均,作為最終移回量,公式如下:


2. 在這個(gè)鏈條模擬中,我們把起始粒子的前驅(qū)認(rèn)為是自身,即存在linkPos=pos的情況,所以上式分母中+0.0001就十分必要,否則會(huì)因除以零而產(chǎn)生NAN。

3. 物理迭代通過添加Simulation Stage實(shí)現(xiàn)(只有在GPU Sim下才能用),Simulation Stage中可以設(shè)置迭代次數(shù),不同的約束可能需要的迭代次數(shù)不同,可以分成多個(gè)Stage去做,每個(gè)Stage單獨(dú)設(shè)置迭代次數(shù)。對(duì)于上述長度約束,我試了下需要4次才能效果較好。

4. Calculate Accurate Velocity這一步,若非教程里說了,自己可能想不到。另外Calculate Accurate Velocity可以從迭代次數(shù)為4的模擬Stage里移出來,放到后面迭代次數(shù)為1的Stage里。

至此,如果是要做鎖鏈之類的效果,只需把粒子替換成圓環(huán)模型,就可以了。但我們的目的是想做蒙皮。

二、鏈條蒙皮

教程(Rigging With Niagara - Part 1: Dangling Cable - Direct Interpolation)講得比較籠統(tǒng),但從中還是能大致了解其思路。要點(diǎn)如下:

1. 把模擬出的鏈條上各粒子坐標(biāo)寫到一個(gè)ParticleCount x 1像素的RT上,傳給材質(zhì)。并借助RT的雙線性插值實(shí)現(xiàn)平滑。

2. MeshRenderer的SourceMode要由Particles改為Emitter,這樣就不會(huì)為每個(gè)粒子掛一個(gè)Mesh,而是整個(gè)Emitter掛一個(gè)Mesh:


3. 沿著繩子建立切空間,則無論繩子怎么彎曲,蒙皮上各點(diǎn)的切空間坐標(biāo)不變,利用這點(diǎn)計(jì)算蒙皮各點(diǎn)的世界坐標(biāo),然后WPO。這一步在材質(zhì)中進(jìn)行。


其中3存在一個(gè)問題,就是“沿著繩子建立切空間”,即使在鎖定初始點(diǎn)的切空間的情況下,也有無數(shù)種結(jié)果。

教程中取的是:

T=normalize(p_nxt-p),

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

N=cross(B,T)。

但這種算法并不能保證當(dāng)繩子任意彎曲時(shí),相鄰質(zhì)點(diǎn)的切空間足夠接近,或者說相鄰質(zhì)點(diǎn)的法線是漸變的。

在劇烈擺動(dòng)時(shí)會(huì)出問題,如下視頻所示:

于是針對(duì)如何對(duì)空間曲線生成法線這個(gè)問題,搜了一下,下面這個(gè)還算吻合:

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


主要就是說明給曲線生成漸變的法線,只考慮局部就不行了,需要考慮整體,他給出的代碼是其中最簡單的一種方法,就是用上一個(gè)粒子的法線去算下一個(gè)粒子的法線。

我按這個(gè)簡單實(shí)現(xiàn)試了一下,發(fā)現(xiàn)效果仍不理想,原因可能有兩點(diǎn):

1. 我的分段太稀疏,導(dǎo)致即使考慮了上一個(gè)粒子的法線影響,仍然會(huì)出現(xiàn)劇烈轉(zhuǎn)折。

2. 此算法嚴(yán)格來講需順序執(zhí)行,而Niagara中GPU粒子的執(zhí)行順序是亂序的。

于是我暫時(shí)放棄了這種基于數(shù)學(xué)的思路,轉(zhuǎn)而考慮基于物理的思路。

就想是不是可以引入扭矩約束,從而避免相鄰粒子朝向差異過大,即避免擰麻花。

三、改進(jìn):防止扭轉(zhuǎn)、翻轉(zhuǎn)

我一開始想的是給粒子添加旋轉(zhuǎn)屬性,然后想著在模擬階段修正位置的同時(shí)對(duì)旋轉(zhuǎn)也作一個(gè)修正,但我不知道依據(jù)什么更新粒子的旋轉(zhuǎn)屬性,于是放棄這個(gè)思路。

然后想到,如果升維,把繩子看成有內(nèi)部結(jié)構(gòu),如圖:


則有可能僅 通過對(duì)距離作約束就同時(shí)起到防止扭轉(zhuǎn)的作用。

繩子截面邊數(shù)自然是越多越好,擺動(dòng)起來各方向物理性質(zhì)更均等,但粒子數(shù)也會(huì)成倍增加,所以我只試了正三角形截面和正方形截面。出于簡單,以下以正三角形截面為例。


如上圖, 如果僅像(a)那樣連接,側(cè)面是平行四邊形,不穩(wěn)定,可能出現(xiàn)壓扁、扭轉(zhuǎn)、翻轉(zhuǎn)三種情況,如圖所示:


為側(cè)面 添加支架,變成(b),就穩(wěn)定多了,壓扁和扭轉(zhuǎn)都能得到限制,但仍會(huì)出現(xiàn)上下翻轉(zhuǎn)問題,如下視頻所示:

之所以出現(xiàn)這種情況,是因?yàn)橐越孛鏋殓R面,上下對(duì)稱的兩個(gè)點(diǎn)的長度一樣,所以從距離約束的角度講,上下兩個(gè)位置都是滿足條件的解。為了避免這個(gè)問題,對(duì)隔一層粒子也添加距離約束,如圖(c)(d)所示,其中(d)在隔層之間作了全約束,而(c)只作了交叉約束,經(jīng)試驗(yàn)發(fā)現(xiàn)(c)就夠用了。

改為(c)后,上下翻轉(zhuǎn)不會(huì)發(fā)生了,但仍存在自穿插翻轉(zhuǎn),如下視頻所示:

要解決自穿插翻轉(zhuǎn),通過距離約束貌似是不行了(我沒想到),但觀察自穿插翻轉(zhuǎn)的特點(diǎn),容易看出當(dāng)發(fā)生自穿插翻轉(zhuǎn)時(shí),三條側(cè)邊一定不再平行。所以想到,如果加一個(gè)每段三棱柱三條側(cè)邊平行的約束,應(yīng)該就可以避免自穿插翻轉(zhuǎn)了。具體算法如下:


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

注:這里只讓當(dāng)前粒子pos所關(guān)聯(lián)的上游邊pos_P->pos與上游中軸線c_P->c平行,沒有讓pos所關(guān)聯(lián)的下游邊pos->pos_N與下游中軸線c->c_N平行。因?yàn)閷?shí)際試驗(yàn)發(fā)現(xiàn)上下游都處理效果不好,原因可能是當(dāng)扭轉(zhuǎn)發(fā)生時(shí),如果想通過移動(dòng)當(dāng)前粒子緩解,讓上游平行和讓下游平行移動(dòng)方向必定是沖突的,所以不如只考慮上游。

效果:

可見,無論怎么動(dòng),都不會(huì)出問題了。

有了魯棒的三棱柱繩子,就可以算出穩(wěn)定的法線,這里我們是用第一條棱與相應(yīng)的截面中心點(diǎn)作差作為法線,然后就可以在材質(zhì)里構(gòu)建穩(wěn)定的切空間,進(jìn)行蒙皮:


之前 是把Position存到了RT里傳入材質(zhì),現(xiàn)在還要增加一張RT,用來存法線。

蒙皮后效果:

四、正確的蒙皮法線

上面視頻中繩子的明暗是不正確的,因?yàn)闆]有考慮繩子彎曲對(duì)模型頂點(diǎn)法線的影響。

正確的蒙皮法線計(jì)算方法如下:

(1)繩子Tpos切空間基:

T0=(0,0,-1)

N0=(1,0,0)

B0=cross(N0,T0)

(2)vertexNormal在繩子Tpos切空間的坐標(biāo):

vertexNormalProjOnT0=dot(vertexNormal,T0)

vertexNormalProjOnN0=dot(vertexNormal,N0)

vertexNormalProjOnB0=dot(vertexNormal,B0)

(3)繩子Bendpos切空間基:

T=采樣posRT并差分得到

N=采樣normRT得到

B=cross(N,T)

(4)根據(jù)蒙皮法線Bend前后切空間坐標(biāo)不變,計(jì)算Bend后的頂點(diǎn)法線vertexNormalBend:

vertexNormalBendProjOnT=vertexNormalProjOnT0

vertexNormalBendProjOnN=vertexNormalProjOnN0

vertexNormalBendProjOnB=vertexNormalProjOnB0

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

最后還有一個(gè)細(xì)節(jié)問題,就是在沒有Bend發(fā)生時(shí),Bendpos切空間應(yīng)該是與Tpos切空間完全重合的。未Bend時(shí)T由差分求出來是豎直向下,這和T0=(0,0,-1)吻合,沒問題,但未Bend時(shí)normRT采樣出來的N是否也與N0=(1,0,0)重合,就要看一下了。前面說過,我們是用第一條棱與相應(yīng)的截面中心點(diǎn)作差作為法線N,那也就是說我們要保證在不Bend時(shí)第一條棱與截面中心作差指向X軸,所以截面應(yīng)如下構(gòu)建:


修正蒙皮法線后效果:

五、補(bǔ)充

1. Niagara的Custom HLSL中語法注意事項(xiàng):

(1)錯(cuò)誤:int index=index%10;

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

(2)錯(cuò)誤:NiagaraID idList[2]={PID,NID};

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

報(bào)錯(cuò)信息去Output Log窗口看,那里才是詳細(xì)信息。

2. DebugDraw節(jié)點(diǎn)中,不要用drawSphere,其編譯時(shí)間很長,drawLine和drawBox都編譯很快。

3. 如果希望不同鏈條約束強(qiáng)度有差異,或者方便忽略掉一些鏈條(權(quán)重給0),可以用加權(quán)版本公式:


4. Slover模塊連線過多,一堆GetVectorByID+Custom HLSL節(jié)點(diǎn):


可用如下方法簡化:

打開生成的Shader Code:


搜GetVectorByID,可以搜到:

聲明處:


使用處:


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


所以眾GetVectorByID+Custom HLSL可合并成一個(gè)大的CustomHLSL:


需要注意的一點(diǎn)是,需要保留一個(gè)GetVectorByID("Position")節(jié)點(diǎn),以便生成函數(shù)聲明,否則會(huì)報(bào)錯(cuò)。

同理,Setup模塊也可做同樣簡化:



文末,再次感謝 楊超wantnon 的分享, 作者主頁: https://www.zhihu.com/people/wantnon, 如果您有任何獨(dú)到的見解或者發(fā)現(xiàn)也歡迎聯(lián)系我們,一起探討。(QQ群: 793972859 )。

近期精彩回顧

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

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.

相關(guān)推薦
熱點(diǎn)推薦
伊朗要造個(gè)大新聞

伊朗要造個(gè)大新聞

美第奇效應(yīng)
2025-06-18 17:47:52
調(diào)查人員:印度空難失事航班起飛時(shí)“雙發(fā)動(dòng)機(jī)失效”,可能當(dāng)時(shí)正在使用應(yīng)急電源供電

調(diào)查人員:印度空難失事航班起飛時(shí)“雙發(fā)動(dòng)機(jī)失效”,可能當(dāng)時(shí)正在使用應(yīng)急電源供電

可樂談情感
2025-06-18 22:07:11
這樣弄,男人直接腿軟

這樣弄,男人直接腿軟

五月的書房
2025-06-18 01:01:24
“與中國劃清界限”,越南通報(bào)全球,給美送上三份“重禮”

“與中國劃清界限”,越南通報(bào)全球,給美送上三份“重禮”

一個(gè)有靈魂的作者
2025-06-18 14:49:22
中年女人“默許發(fā)生關(guān)系”時(shí),會(huì)出現(xiàn)這4類“操作”

中年女人“默許發(fā)生關(guān)系”時(shí),會(huì)出現(xiàn)這4類“操作”

特約前排觀眾
2025-06-19 02:40:27
伊媒爆料:消失5天的哈梅內(nèi)伊移交手中關(guān)鍵權(quán)力!不給總統(tǒng) 給他們

伊媒爆料:消失5天的哈梅內(nèi)伊移交手中關(guān)鍵權(quán)力!不給總統(tǒng) 給他們

野山歷史
2025-06-18 16:19:51
日媒對(duì)張子宇的身高耿耿于懷:比姚明高,打比賽就是帶著作弊器

日媒對(duì)張子宇的身高耿耿于懷:比姚明高,打比賽就是帶著作弊器

體育哲人
2025-06-18 18:47:54
伊朗擊落三架F-35,為什么全世界都不相信?

伊朗擊落三架F-35,為什么全世界都不相信?

牲產(chǎn)隊(duì)2024
2025-06-15 21:12:58
特朗普騎虎難下,美若對(duì)伊朗動(dòng)武,或?qū)橹袊峁┬乱惠啈?zhàn)略機(jī)遇

特朗普騎虎難下,美若對(duì)伊朗動(dòng)武,或?qū)橹袊峁┬乱惠啈?zhàn)略機(jī)遇

博覽歷史
2025-06-17 11:35:30
為什么古人說“夫妻不同房,陰陽兩相傷”?大師道破背后因果關(guān)系

為什么古人說“夫妻不同房,陰陽兩相傷”?大師道破背后因果關(guān)系

一根香煙的少婦
2025-06-17 09:52:06
女子和上司開房后,想和丈夫各玩各的,2019年丈夫求她不要離婚

女子和上司開房后,想和丈夫各玩各的,2019年丈夫求她不要離婚

漢史趣聞
2025-06-17 20:16:42
美國“尼米茲”號(hào)航母正駛往中東地區(qū) 途中關(guān)閉了應(yīng)答器并停止傳輸位置信息

美國“尼米茲”號(hào)航母正駛往中東地區(qū) 途中關(guān)閉了應(yīng)答器并停止傳輸位置信息

財(cái)聯(lián)社
2025-06-18 19:44:08
泡泡瑪特“暴雷”!投資者套現(xiàn)、股價(jià)暴跌,真應(yīng)了郭麒麟的那句話

泡泡瑪特“暴雷”!投資者套現(xiàn)、股價(jià)暴跌,真應(yīng)了郭麒麟的那句話

葡萄說娛
2025-06-18 14:19:25
南京一退休阿姨感染艾滋病,查明原因,醫(yī)生:這個(gè)細(xì)節(jié)被忽視了

南京一退休阿姨感染艾滋病,查明原因,醫(yī)生:這個(gè)細(xì)節(jié)被忽視了

黃家湖的憂傷
2025-04-15 17:27:13
人民日?qǐng)?bào)痛批“既要又要還要”,基層太難,銀行該反省了

人民日?qǐng)?bào)痛批“既要又要還要”,基層太難,銀行該反省了

振華觀史
2025-06-18 08:20:44
巴基斯坦宣布關(guān)閉多個(gè)與伊朗接壤邊境口岸

巴基斯坦宣布關(guān)閉多個(gè)與伊朗接壤邊境口岸

界面新聞
2025-06-17 07:02:35
伊朗國營電視臺(tái)警告:今晚將有大事發(fā)生,世界將銘記幾個(gè)世紀(jì)!伊朗最高領(lǐng)袖哈梅內(nèi)伊:戰(zhàn)斗開始了,須強(qiáng)力回應(yīng)恐怖猶太復(fù)國主義政權(quán),絕不手下留情

伊朗國營電視臺(tái)警告:今晚將有大事發(fā)生,世界將銘記幾個(gè)世紀(jì)!伊朗最高領(lǐng)袖哈梅內(nèi)伊:戰(zhàn)斗開始了,須強(qiáng)力回應(yīng)恐怖猶太復(fù)國主義政權(quán),絕不手下留情

和訊網(wǎng)
2025-06-18 17:17:42
阿前總統(tǒng)涉腐敗獲批在家服刑 需戴電子監(jiān)控設(shè)備

阿前總統(tǒng)涉腐敗獲批在家服刑 需戴電子監(jiān)控設(shè)備

看看新聞Knews
2025-06-18 21:44:17
伊朗“反美立國”戰(zhàn)略的窮途末路

伊朗“反美立國”戰(zhàn)略的窮途末路

黑噪音
2025-06-18 08:02:41
停滿了!特斯拉庫存積壓嚴(yán)重

停滿了!特斯拉庫存積壓嚴(yán)重

放毒
2025-06-18 16:12:42
2025-06-19 03:20:49
侑虎科技UWA incentive-icons
侑虎科技UWA
游戲/VR性能優(yōu)化平臺(tái)
1455文章數(shù) 984關(guān)注度
往期回顧 全部

科技要聞

別叫我互聯(lián)網(wǎng)公司,京東的野心藏不住了

頭條要聞

男子4S店買法拉利3年提不了車 店方:想退款先幫忙賣車

頭條要聞

男子4S店買法拉利3年提不了車 店方:想退款先幫忙賣車

體育要聞

36歲鄧卓翔率隊(duì)9輪拿17分 從墊底升第9

娛樂要聞

前老板舉報(bào)李雪琴欠190萬轉(zhuǎn)移公司財(cái)產(chǎn)

財(cái)經(jīng)要聞

被爆添加毒原料后相宜本草高管先后出走

汽車要聞

燈光技術(shù)升級(jí)還有插混版本 全新奧迪Q3預(yù)計(jì)明年國產(chǎn)

態(tài)度原創(chuàng)

健康
藝術(shù)
旅游
本地
軍事航空

呼吸科專家破解呼吸道九大謠言!

藝術(shù)要聞

故宮珍藏的墨跡《十七帖》,比拓本更精良,這才是地道的魏晉寫法

旅游要聞

熱聞|清明假期將至,熱門目的地有哪些?

本地新聞

黎錦匠人鄭春榮:經(jīng)緯千年 我在海島織黎錦

軍事要聞

特朗普呼吁伊朗無條件投降

無障礙瀏覽 進(jìn)入關(guān)懷版 主站蜘蛛池模板: 临江市| 佳木斯市| 威宁| 淮安市| 黄陵县| 南溪县| 潮州市| 兴仁县| 兴国县| 固镇县| 宜宾市| 沧源| 孟津县| 扎鲁特旗| 南丰县| 洱源县| 神农架林区| 石屏县| 综艺| 方正县| 龙口市| 赣榆县| 上虞市| 遂川县| 泊头市| 古交市| 三河市| 卓尼县| 新龙县| 永丰县| 元氏县| 泽普县| 梁山县| 进贤县| 收藏| 商河县| 普兰县| 普兰店市| 大同县| 老河口市| 永年县|