溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

DynamicBone是什么

發(fā)布時(shí)間:2021-12-27 10:49:12 來(lái)源:億速云 閱讀:119 作者:小新 欄目:大數(shù)據(jù)

這篇文章給大家分享的是有關(guān)DynamicBone是什么的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

DynamicBone是一個(gè)簡(jiǎn)單的基于模擬彈簧振子的算法實(shí)現(xiàn)樹(shù)狀柔體的物理模擬插件。雖然基于模擬彈簧振子運(yùn)動(dòng)的算法實(shí)現(xiàn),但是DynamicBone各節(jié)點(diǎn)之間的距離實(shí)際上不會(huì)發(fā)生變化。比起彈簧,父子節(jié)點(diǎn)之間的相對(duì)運(yùn)動(dòng)更接近串聯(lián)的單擺

DynamicBone是什么  
整體流程簡(jiǎn)圖

DynamicBone模擬出的柔體特性體現(xiàn)在物體運(yùn)動(dòng)之后發(fā)生的彈性形變上。所以它的模擬自然發(fā)生在物體運(yùn)動(dòng)之后,再根據(jù)物體運(yùn)動(dòng)的結(jié)果去模擬各個(gè)節(jié)點(diǎn)彈性運(yùn)動(dòng)的過(guò)程。

下面得到的DynamicBone的整體流程非常簡(jiǎn)單,當(dāng)物體原本移動(dòng)完成后,首先根據(jù)運(yùn)動(dòng)的當(dāng)前結(jié)果模擬彈性運(yùn)動(dòng),再根據(jù)模擬結(jié)果修正各節(jié)點(diǎn)的旋轉(zhuǎn)并且將模擬結(jié)果同步到實(shí)際節(jié)點(diǎn)上。

這其中,我們稱圖中(2)的物體各節(jié)點(diǎn)的原本移動(dòng)結(jié)果為理想位置,因?yàn)橛袕椥缘奈矬w雖然會(huì)發(fā)生形變,但是其最終會(huì)嘗試還原到原本的形狀。而模擬運(yùn)動(dòng)的結(jié)果則稱之為實(shí)際位置。因?yàn)檫@是計(jì)算得到的結(jié)果,并且最終也會(huì)同步到附屬的節(jié)點(diǎn)上。

DynamicBone是什么  
整體流程圖

為了便于區(qū)分,這里我們稱DynamicBone的節(jié)點(diǎn)為節(jié)點(diǎn),而實(shí)際的物體節(jié)點(diǎn)為附屬節(jié)點(diǎn)

籃框部分考慮了力的影響使用了韋爾萊積分法,紅框部分整體就是彈簧運(yùn)動(dòng)的模擬計(jì)算部分

預(yù)處理:附加全局位移

?在彈簧運(yùn)動(dòng)模擬計(jì)算開(kāi)始前,DynamicBone首先會(huì)將現(xiàn)在所在的物體的位移乘上慣性(Inert)參數(shù)之后附加給所有節(jié)點(diǎn)。這段位移是不會(huì)參與到后續(xù)的運(yùn)動(dòng)模擬計(jì)算過(guò)程的,會(huì)直接改變當(dāng)前幀和前一幀的實(shí)際位置,所以這段位移在后續(xù)計(jì)算中不會(huì)被算入速度。即

DynamicBone是什么

彈簧運(yùn)動(dòng)模擬部分1:慣性運(yùn)動(dòng)&受力運(yùn)動(dòng)

彈簧運(yùn)動(dòng)模擬計(jì)算的第一部分是慣性運(yùn)動(dòng)模擬,這部分非常好理解,就是讓節(jié)點(diǎn)保持速度繼續(xù)運(yùn)動(dòng),而速度的值就是一次模擬內(nèi)節(jié)點(diǎn)的實(shí)際位置的變化差值減去阻尼(damping)值,即

DynamicBone是什么

彈簧運(yùn)動(dòng)模擬計(jì)算的第二部分是受力運(yùn)動(dòng)模擬,DynamicBone中考慮了兩種力對(duì)節(jié)點(diǎn)運(yùn)動(dòng)的印象,分別是重力(Gravity)和常駐力(Force),這兩種力對(duì)運(yùn)動(dòng)過(guò)程的影響方式不一樣。這里常駐力很好理解,是無(wú)條件發(fā)揮作用的力,會(huì)直接附加到計(jì)算結(jié)果。而重力的機(jī)制比較特殊,重力本身不發(fā)揮作用,只有運(yùn)動(dòng)發(fā)生后的重力分量會(huì)影響運(yùn)動(dòng)過(guò)程。即

DynamicBone是什么

彈簧運(yùn)動(dòng)模擬部分2: 重力計(jì)算補(bǔ)充講解

DynamicBone是什么  
重力計(jì)算

在初始狀態(tài)下,重力不起任何作用,但是DynamicBone會(huì)記錄重力在根節(jié)點(diǎn)局部坐標(biāo)系內(nèi)的向量。在每次計(jì)算時(shí),DynamicBone會(huì)計(jì)算變化后的局部重力向量在初始重力向量方向的投影,最后為節(jié)點(diǎn)附加初始重力向量減去這個(gè)投影向量的重力。由于記錄的是根節(jié)點(diǎn)局部坐標(biāo)系內(nèi)的向量,所以只有根節(jié)點(diǎn)發(fā)生了旋轉(zhuǎn)才會(huì)導(dǎo)致重力發(fā)揮作用,而其他的節(jié)點(diǎn)的旋轉(zhuǎn)不會(huì)。還有只有當(dāng)局部重力投影與全局重力方向一致時(shí),全局重力才會(huì)減去投影。如果方向相反(意味著根節(jié)點(diǎn)旋轉(zhuǎn)了超過(guò)180度),全局重力只會(huì)全部發(fā)揮作用,不會(huì)去加上投影長(zhǎng)度。

彈簧運(yùn)動(dòng)模擬部分3:彈性運(yùn)動(dòng)&剛性運(yùn)動(dòng)

彈簧運(yùn)動(dòng)模擬計(jì)算的第三部分是彈性運(yùn)動(dòng)模擬,屬于節(jié)點(diǎn)自主運(yùn)動(dòng),即不受力和速度的影響,并且運(yùn)動(dòng)結(jié)果會(huì)被視作速度(所以本質(zhì)上可以視作一種內(nèi)在力)。彈性運(yùn)動(dòng)的過(guò)程非常簡(jiǎn)單,就是求出節(jié)點(diǎn)當(dāng)前實(shí)際位置與理想位置的差值,并且乘上彈性(Elasticity)參數(shù)附加到實(shí)際位置。即

DynamicBone是什么

彈簧運(yùn)動(dòng)模擬計(jì)算的第四部分是剛性運(yùn)動(dòng)模擬,也屬于節(jié)點(diǎn)自主運(yùn)動(dòng)。要解釋彈性運(yùn)動(dòng)首先要引入理想距離,即父子節(jié)點(diǎn)理想位置間的距離,也就是父子節(jié)點(diǎn)原本距離。剛性模擬會(huì)先根據(jù)剛性(Stiffness)參數(shù)和理想距離求出節(jié)點(diǎn)偏離理想位置的最大距離,并且將節(jié)點(diǎn)限制在距離內(nèi)。即

DynamicBone是什么

彈簧運(yùn)動(dòng)模擬部分3:彈性運(yùn)動(dòng)&剛性運(yùn)動(dòng)

彈簧運(yùn)動(dòng)模擬計(jì)算的第三部分是彈性運(yùn)動(dòng)模擬,屬于節(jié)點(diǎn)自主運(yùn)動(dòng),即不受力和速度的影響,并且運(yùn)動(dòng)結(jié)果會(huì)被視作速度(所以本質(zhì)上可以視作一種內(nèi)在力)。彈性運(yùn)動(dòng)的過(guò)程非常簡(jiǎn)單,就是求出節(jié)點(diǎn)當(dāng)前實(shí)際位置與理想位置的差值,并且乘上彈性(Elasticity)參數(shù)附加到實(shí)際位置。即

DynamicBone是什么

彈簧運(yùn)動(dòng)模擬計(jì)算的第四部分是剛性運(yùn)動(dòng)模擬,也屬于節(jié)點(diǎn)自主運(yùn)動(dòng)。要解釋彈性運(yùn)動(dòng)首先要引入理想距離,即父子節(jié)點(diǎn)理想位置間的距離,也就是父子節(jié)點(diǎn)原本距離。剛性模擬會(huì)先根據(jù)剛性(Stiffness)參數(shù)和理想距離求出節(jié)點(diǎn)偏離理想位置的最大距離,并且將節(jié)點(diǎn)限制在距離內(nèi)。即

DynamicBone是什么

碰撞檢測(cè)與恢復(fù)4

DynamicBone的碰撞檢測(cè)很簡(jiǎn)單,就是將每個(gè)節(jié)點(diǎn)與每個(gè)碰撞體逐個(gè)進(jìn)行碰撞檢測(cè)并且根據(jù)檢測(cè)結(jié)果進(jìn)行恢復(fù)。DynamicBone提供了兩種形狀的碰撞體,球型和膠囊體型。球型的碰撞檢測(cè)非常簡(jiǎn)單,首先求出節(jié)點(diǎn)與球心的距離,然后求出節(jié)點(diǎn)半徑與碰撞體半徑之和。如果距離大于半徑之和(在Inside模式下是小于),就移動(dòng)節(jié)點(diǎn)保證距離等于半徑之和。

膠囊體的碰撞檢測(cè)要稍微復(fù)雜一點(diǎn),首先求出膠囊體兩個(gè)球心之間的向量A,然后求出節(jié)點(diǎn)中心與其中一個(gè)球心的向量B,然后求A在B上的投影,根據(jù)投影結(jié)果在進(jìn)行下一步判斷,即

DynamicBone是什么  
碰撞檢測(cè)與恢復(fù)

然后,當(dāng)投影方向與向量A相反,則節(jié)點(diǎn)相當(dāng)于進(jìn)行與以球心A為球心的球體做碰撞檢測(cè)與恢復(fù);如果方向投影方向與向量A相同但是比向量A長(zhǎng),則節(jié)點(diǎn)相當(dāng)于進(jìn)行與以球心B為球心的球體做碰撞檢測(cè)與恢復(fù)。

如果如果方向投影方向與向量A相同并且比向量A短,則取向量B在與向量A垂直方向上的投影向量長(zhǎng)度,如果該長(zhǎng)度大于半徑之和,就移動(dòng)節(jié)點(diǎn)保證距離等于半徑之和

后處理階段5:維持節(jié)點(diǎn)間距離

在模擬計(jì)算最后,DynamicBone有一個(gè)簡(jiǎn)單的后處理防止父子節(jié)點(diǎn)之間發(fā)生拉伸或者壓縮,維持節(jié)點(diǎn)間理想距離。步驟很簡(jiǎn)單,首先求出當(dāng)前父節(jié)點(diǎn)實(shí)際距離的差向量,然后將其恢復(fù)至理想距離向量。即

DynamicBone是什么

后處理階段6:修正節(jié)點(diǎn)旋轉(zhuǎn)并且同步變換

在最后將計(jì)算得到的節(jié)點(diǎn)變換同步到附屬節(jié)點(diǎn)前,DynamicBone還會(huì)根據(jù)各級(jí)節(jié)點(diǎn)間的相對(duì)變換做一次旋轉(zhuǎn)修正,每對(duì)父子節(jié)點(diǎn)只要父節(jié)點(diǎn)僅有一個(gè)子節(jié)點(diǎn)就都會(huì)讓父節(jié)點(diǎn)旋轉(zhuǎn)至與子節(jié)點(diǎn)的相對(duì)旋轉(zhuǎn)的初始值相同的狀態(tài)。

DynamicBone是什么

缺陷與優(yōu)化

缺陷:

DynamicBone的缺陷主要是不允許節(jié)點(diǎn)間距離發(fā)生變化,這導(dǎo)致DynamicBone不允許實(shí)際的拉伸或者壓縮發(fā)生,DynamicBone的節(jié)點(diǎn)之間實(shí)際上缺乏彈簧的性質(zhì)。因此DynamicBone不能模擬容易發(fā)生拉伸形變的物體。

另外一方面DynamicBone所有計(jì)算都不考慮時(shí)間因素,所以同樣彈簧參數(shù)不同更新頻率參數(shù)下表現(xiàn)會(huì)非常不同,加大了調(diào)參難度。

優(yōu)化:

最常用的LOD降頻方式或者遠(yuǎn)處動(dòng)畫(huà)

代碼C++化,測(cè)試了下相較未IL2CPP下面能快2倍

考慮同場(chǎng)景多個(gè)DynamicBone對(duì)象的計(jì)算情況,合并計(jì)算流程統(tǒng)一管理

對(duì)于差不多位置的DynamicBone進(jìn)行近似計(jì)算,計(jì)算一跟復(fù)用多跟,比如飄帶,裙擺等

進(jìn)行jobSystem化,放在BatchedIKPass之后

Unity中Transform只存儲(chǔ)了Go的local相關(guān)的信息,計(jì)算Gloabl的相關(guān)數(shù)據(jù)時(shí)候會(huì)進(jìn)行各種轉(zhuǎn)換,這個(gè)也是導(dǎo)致耗時(shí)的主要原因

感謝各位的閱讀!關(guān)于“DynamicBone是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI