本公開(kāi)涉及計(jì)算機(jī),具體而言,涉及動(dòng)態(tài)骨骼模擬方法、動(dòng)態(tài)骨骼模擬裝置、計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)、計(jì)算機(jī)程序產(chǎn)品和電子設(shè)備。
背景技術(shù):
1、隨著計(jì)算機(jī)技術(shù)的發(fā)展,動(dòng)態(tài)骨骼模擬技術(shù)被廣泛應(yīng)用于影視、游戲等領(lǐng)域。動(dòng)態(tài)骨骼模擬指的是在實(shí)際動(dòng)畫(huà)中,對(duì)每根骨骼重新進(jìn)行物理模擬計(jì)算,并且會(huì)考慮場(chǎng)景中的風(fēng)力、重力以及人物身上的碰撞體及環(huán)境碰撞體的碰撞響應(yīng)等,使得物體運(yùn)動(dòng)變得更加豐富且能實(shí)時(shí)交互。
2、相關(guān)技術(shù)中,是基于樹(shù)狀結(jié)構(gòu)進(jìn)行動(dòng)態(tài)骨骼模擬,即在正向動(dòng)力學(xué)中,每根骨骼受其父骨骼驅(qū)動(dòng),在反向動(dòng)力學(xué)中,每個(gè)骨骼受其子骨骼驅(qū)動(dòng)。
3、也就是說(shuō),相關(guān)技術(shù)中某個(gè)骨骼只和兩根骨骼存在約束,即該骨骼的父骨骼和子骨骼,因此骨骼的實(shí)現(xiàn)場(chǎng)景有限,如,由于基于樹(shù)狀結(jié)構(gòu)的模擬中根骨骼和葉子骨骼之間無(wú)法存在約束,所以無(wú)法將葉子骨骼和根骨骼綁定在一起而實(shí)現(xiàn)環(huán)狀結(jié)構(gòu),且骨骼鏈之間也由于無(wú)法進(jìn)行約束而存在因距離過(guò)遠(yuǎn)或過(guò)近導(dǎo)致的明顯拉伸的問(wèn)題,影響動(dòng)畫(huà)的顯示效果。
4、需要說(shuō)明的是,在上述背景技術(shù)部分公開(kāi)的信息僅用于加強(qiáng)對(duì)本公開(kāi)的背景的理解,因此可以包括不構(gòu)成對(duì)本領(lǐng)域普通技術(shù)人員已知的現(xiàn)有技術(shù)的信息。
技術(shù)實(shí)現(xiàn)思路
1、本公開(kāi)的目的在于提供一種動(dòng)態(tài)骨骼模擬方法及裝置、計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)、計(jì)算機(jī)程序產(chǎn)品和電子設(shè)備,進(jìn)而至少在一定程度上提高動(dòng)態(tài)骨骼模擬的模擬效果。
2、本公開(kāi)的其他特性和優(yōu)點(diǎn)將通過(guò)下面的詳細(xì)描述變得顯然,或部分地通過(guò)本公開(kāi)的實(shí)踐而習(xí)得。
3、根據(jù)本公開(kāi)的第一方面,提供了一種動(dòng)態(tài)骨骼模擬方法,包括:從待模擬骨骼鏈的當(dāng)前起始骨骼開(kāi)始,對(duì)待模擬骨骼鏈中的骨骼進(jìn)行正向動(dòng)力學(xué)模擬,所述待模擬骨骼鏈中的至少兩個(gè)骨骼之間存在預(yù)設(shè)約束;在當(dāng)前骨骼存在約束的情況下,對(duì)所述待模擬骨骼鏈暫停正向動(dòng)力學(xué)模擬,并根據(jù)當(dāng)前停留骨骼更新所述當(dāng)前起始骨骼;在每個(gè)待模擬骨骼鏈均暫停模擬的情況下,根據(jù)每個(gè)待模擬骨骼鏈的所有當(dāng)前停留骨骼存在的約束得到當(dāng)前待解算集合,對(duì)所述當(dāng)前待解算集合中的約束進(jìn)行解算;在所述待模擬骨骼鏈的當(dāng)前停留骨骼不存在未解算的約束的情況下,對(duì)所述待模擬骨骼鏈從當(dāng)前更新后的所述當(dāng)前起始骨骼開(kāi)始重復(fù)執(zhí)行上述的正向動(dòng)力學(xué)模擬過(guò)程,直到所述待模擬骨骼鏈中的葉子骨骼完成正向動(dòng)力學(xué)模擬,確定所述待模擬骨骼鏈模擬結(jié)束;其中,在第一次對(duì)待模擬骨骼鏈進(jìn)行正向動(dòng)力學(xué)模擬時(shí),所述當(dāng)前起始骨骼包括所述待模擬骨骼鏈的根骨骼。
4、可選的,所述根據(jù)每個(gè)待模擬骨骼鏈的當(dāng)前停留骨骼存在的約束得到當(dāng)前待解算集合包括:根據(jù)每個(gè)待模擬骨骼鏈的當(dāng)前停留骨骼存在的約束,確定出收集約束集合;從所述收集約束集合中確定出被約束的骨骼均已完成正向動(dòng)力學(xué)模擬的約束,以得到當(dāng)前待解算約束集合。
5、可選的,所述約束包括距離約束,所述距離約束用于限制骨骼之間的距離范圍;所述對(duì)所述當(dāng)前待解算集合中的約束進(jìn)行解算包括:對(duì)當(dāng)前待解算集合中的距離約束進(jìn)行解算,直到解算結(jié)果使得所述當(dāng)前待解算集合中的距離約束所限制的骨骼之間的距離均滿足距離約束指示的距離范圍或達(dá)到預(yù)設(shè)解算次數(shù),確定所述距離約束解算完成。
6、可選的,所述對(duì)當(dāng)前待解算集合中的距離約束進(jìn)行解算包括:根據(jù)預(yù)設(shè)優(yōu)先級(jí)對(duì)當(dāng)前待解算集合中的距離約束進(jìn)行解算。
7、可選的,所述對(duì)當(dāng)前待解算集合中的距離約束進(jìn)行解算包括:在所述距離約束所限制的骨骼之間的實(shí)際距離大于所述距離約束指示的最大距離的情況下,將所述距離約束所限制的骨骼沿著距離減小的方向移動(dòng),使得所述距離約束所限制的骨骼之間的實(shí)際距離等于所述距離約束指示的最大距離;在所述距離約束所限制的骨骼之間的實(shí)際距離小于所述距離約束指示的最小距離的情況下,將所述距離約束所限制的骨骼沿著距離增大的方向移動(dòng),使得所述距離約束所限制的骨骼之間的實(shí)際距離等于所述距離約束指示的最小距離。
8、可選的,移動(dòng)所述距離約束所限制的骨骼的方式包括:根據(jù)骨骼權(quán)重移動(dòng)所述距離約束所限制的骨骼,使得骨骼權(quán)重大的骨骼的移動(dòng)距離大于骨骼權(quán)重小的骨骼的移動(dòng)距離。
9、可選的,所述約束包括碰撞體約束,所述碰撞體約束用于限制約束邊位于碰撞體外部,所述約束邊根據(jù)存在約束的兩個(gè)骨骼之間的連線確定,所述對(duì)所述當(dāng)前待解算集合中的約束進(jìn)行解算包括:在所述距離約束解算完成后,根據(jù)約束邊與碰撞體軸線之間的垂線長(zhǎng)度確定出約束邊是否位于碰撞體內(nèi)部;在所述約束邊位于碰撞體內(nèi)部的情況下,確定出所述約束邊指示的兩個(gè)骨骼的移動(dòng)距離,根據(jù)所述移動(dòng)距離對(duì)所述骨骼進(jìn)行移動(dòng),以將所述約束邊移動(dòng)到所述碰撞體外部。
10、可選的,所述根據(jù)約束邊與碰撞體軸線之間的距離確定出約束邊是否位于碰撞體內(nèi)部包括:在所述約束邊與碰撞體軸線之間的垂線長(zhǎng)度小于所述碰撞體的半徑的情況下,確定所述約束邊位于所述碰撞體內(nèi)部。
11、可選的,所述確定出所述約束邊指示的兩個(gè)骨骼的移動(dòng)距離包括:根據(jù)所述約束邊指示的兩個(gè)骨骼的骨骼權(quán)重,確定出所述約束邊指示的兩個(gè)骨骼的移動(dòng)距離。
12、可選的,所述根據(jù)所述約束邊指示的兩個(gè)骨骼的骨骼權(quán)重,確定出所述約束邊指示的兩個(gè)骨骼的移動(dòng)距離包括:在所述約束邊指示的兩個(gè)骨骼的骨骼權(quán)重相等的情況下,確定出所述約束邊與所述碰撞體軸線之間的垂線長(zhǎng)度;根據(jù)所述碰撞體的半徑與所述垂線長(zhǎng)度之間的差值,確定出所述約束邊指示的兩個(gè)骨骼的移動(dòng)距離。
13、可選的,所述根據(jù)所述約束邊指示的兩個(gè)骨骼的骨骼權(quán)重,確定出所述約束邊指示的兩個(gè)骨骼的移動(dòng)距離包括:在所述約束邊指示的兩個(gè)骨骼的骨骼權(quán)重不相等的情況下,確定出所述約束邊與所述碰撞體軸線之間的垂線長(zhǎng)度;確定所述碰撞體的半徑與所述垂線長(zhǎng)度之間的差值;在大于或等于0且小于或等于所述差值的范圍內(nèi)確定出第一骨骼的第一移動(dòng)距離;根據(jù)所述差值、所述第一移動(dòng)距離、第一骨骼到目標(biāo)點(diǎn)的距離和第二骨骼到目標(biāo)點(diǎn)的距離,確定出所述第二骨骼的第二移動(dòng)距離,所述目標(biāo)點(diǎn)根據(jù)約束邊與碰撞體中心軸的最近點(diǎn)確定;其中,所述第一骨骼為所述約束邊指示的兩個(gè)骨骼中骨骼權(quán)重較小的骨骼,所述第二骨骼為所述約束邊指示的兩個(gè)骨骼中權(quán)重較大的骨骼。
14、可選的,所述約束包括骨骼權(quán)重,所述骨骼權(quán)重用于指示所述骨骼受約束影響的程度,所述在當(dāng)前骨骼存在約束的情況下,對(duì)所述待模擬骨骼鏈暫停正向動(dòng)力學(xué)模擬,并根據(jù)當(dāng)前停留骨骼更新所述當(dāng)前起始骨骼包括:在當(dāng)前骨骼存在約束且骨骼權(quán)重為第一預(yù)設(shè)系數(shù)的情況下,對(duì)所述待模擬骨骼鏈暫停正向動(dòng)力學(xué)模擬,并根據(jù)當(dāng)前停留骨骼更新所述當(dāng)前起始骨骼。
15、可選的,所述在當(dāng)前骨骼存在約束的情況下,對(duì)所述待模擬骨骼鏈暫停正向動(dòng)力學(xué)模擬,并根據(jù)當(dāng)前停留骨骼更新所述當(dāng)前起始骨骼包括:在當(dāng)前骨骼存在約束且骨骼權(quán)重為第二預(yù)設(shè)系數(shù)的情況下,確定所述當(dāng)前骨骼的子骨骼數(shù)量是否大于1;在所述子骨骼數(shù)量大于1的情況下,對(duì)所述待模擬骨骼鏈暫停正向動(dòng)力學(xué)模擬,并根據(jù)所述每一個(gè)子骨骼分別更新所述當(dāng)前起始骨骼。
16、可選的,所述方法還包括:在每個(gè)待模擬骨骼鏈的當(dāng)前停留骨骼均存在未解算的約束的情況下,確定剩余的未解算的約束為無(wú)效約束,并對(duì)每個(gè)待模擬骨骼鏈中未遍歷到的骨骼進(jìn)行正向動(dòng)力學(xué)模擬,直到所述待模擬骨骼鏈中的葉子骨骼完成正向動(dòng)力學(xué)模擬,確定所述待模擬骨骼鏈模擬結(jié)束,其中,所述無(wú)效約束不暫停所述待模擬骨骼鏈的正向動(dòng)力學(xué)模擬;在每個(gè)待模擬骨骼鏈模擬結(jié)束的情況下,確定動(dòng)態(tài)骨骼模擬結(jié)束。
17、可選的,所述約束包括骨骼權(quán)重,在所述約束所限制的兩個(gè)骨骼存在祖先關(guān)系的情況下,所述兩個(gè)骨骼中的祖先骨骼的骨骼權(quán)重被配置為0,所述兩個(gè)骨骼中的子骨骼的骨骼權(quán)重被配置為1,所述骨骼權(quán)重用于指示所述骨骼受約束的影響程度。
18、根據(jù)本公開(kāi)的第二方面,提供了一種動(dòng)態(tài)骨骼模擬方法,包括:響應(yīng)骨骼約束添加操作,針對(duì)所述添加約束的骨骼所在的目標(biāo)骨骼鏈,從所述目標(biāo)骨骼鏈的當(dāng)前起始骨骼開(kāi)始,遍歷所述目標(biāo)骨骼鏈中的骨骼;在當(dāng)前遍歷到的骨骼存在約束的情況下,對(duì)所述目標(biāo)骨骼鏈暫停遍歷,并根據(jù)當(dāng)前暫停骨骼更新所述當(dāng)前起始骨骼,所述當(dāng)前暫停骨骼根據(jù)暫停遍歷時(shí)的骨骼確定;在每個(gè)所述目標(biāo)骨骼鏈均暫停遍歷的情況下,針對(duì)所述當(dāng)前暫停骨骼存在的約束,對(duì)約束所限制的骨骼均已被遍歷過(guò)的約束進(jìn)行標(biāo)記;在所述當(dāng)前暫停骨骼不存在未被標(biāo)記的約束的情況下,對(duì)所述當(dāng)前暫停骨骼對(duì)應(yīng)的目標(biāo)骨骼鏈繼續(xù)進(jìn)行遍歷以重復(fù)執(zhí)行上述過(guò)程;根據(jù)約束的標(biāo)記情況,確定出骨骼約束的添加結(jié)果,以根據(jù)所述添加結(jié)果進(jìn)行動(dòng)態(tài)骨骼模擬。
19、可選的,所述響應(yīng)骨骼約束添加操作,針對(duì)所述添加約束的骨骼所在的目標(biāo)骨骼鏈,從所述目標(biāo)骨骼鏈的當(dāng)前起始骨骼開(kāi)始,遍歷所述目標(biāo)骨骼鏈中的骨骼包括:響應(yīng)骨骼約束添加操作,檢查待添加骨骼約束是否合法;在所述待添加骨骼約束合法的情況下,針對(duì)所述添加約束的骨骼所在的目標(biāo)骨骼鏈,從所述目標(biāo)骨骼鏈的當(dāng)前起始骨骼開(kāi)始,遍歷所述目標(biāo)骨骼鏈中的骨骼。
20、可選的,所述檢查待添加骨骼約束是否合法包括:檢查待添加骨骼約束所限制的骨骼是否為同一個(gè)骨骼;和/或檢查待添加骨骼約束所限制的骨骼是否存在父子關(guān)系。
21、可選的,所述在所述待添加骨骼約束合法的情況下,針對(duì)所述添加約束的骨骼所在的目標(biāo)骨骼鏈,從所述目標(biāo)骨骼鏈的當(dāng)前起始骨骼開(kāi)始,遍歷所述目標(biāo)骨骼鏈中的骨骼包括:在所述待添加骨骼約束合法的情況下,檢查待添加骨骼約束所限制的骨骼是否屬于同一骨骼鏈;在待添加骨骼約束所限制的骨骼不屬于同一骨骼鏈的情況下,針對(duì)所述添加約束的骨骼所在的目標(biāo)骨骼鏈,從所述目標(biāo)骨骼鏈的當(dāng)前起始骨骼開(kāi)始,遍歷所述目標(biāo)骨骼鏈中的骨骼。
22、可選的,所述方法還包括:在待添加骨骼約束所限制的骨骼屬于同一骨骼鏈的情況下,將所限制的骨骼中的祖先骨骼的骨骼權(quán)重配置為1,將所限制的骨骼中的子骨骼的骨骼權(quán)重配置為0,所述骨骼權(quán)重用于指示所述骨骼受約束的影響程度。
23、可選的,所述根據(jù)約束的標(biāo)記情況,確定出骨骼約束的添加結(jié)果,以根據(jù)所述添加結(jié)果進(jìn)行動(dòng)態(tài)骨骼模擬包括:將被標(biāo)記的約束添加為有效骨骼約束,未被標(biāo)記的約束添加為無(wú)效骨骼約束,以根據(jù)所述有效骨骼約束進(jìn)行動(dòng)態(tài)骨骼模擬。
24、可選的,所述方法還包括:生成所述無(wú)效骨骼約束的提示信息,以在骨骼約束添加界面顯示所述無(wú)效骨骼約束的提示信息。
25、根據(jù)本公開(kāi)的第三方面,提供了一種動(dòng)態(tài)骨骼模擬裝置,包括:正向動(dòng)力學(xué)模擬模塊,被配置為從待模擬骨骼鏈的當(dāng)前起始骨骼開(kāi)始,對(duì)待模擬骨骼鏈中的骨骼進(jìn)行正向動(dòng)力學(xué)模擬,所述待模擬骨骼鏈中的至少兩個(gè)骨骼之間存在預(yù)設(shè)約束;第一更新模塊,被配置為在當(dāng)前骨骼存在約束的情況下,對(duì)所述待模擬骨骼鏈暫停正向動(dòng)力學(xué)模擬,并根據(jù)當(dāng)前停留骨骼更新所述當(dāng)前起始骨骼;待解算集合確定模塊,被配置為在每個(gè)待模擬骨骼鏈均暫停模擬的情況下,根據(jù)每個(gè)待模擬骨骼鏈的當(dāng)前停留骨骼存在的約束得到當(dāng)前待解算集合,對(duì)所述當(dāng)前待解算集合中的約束進(jìn)行解算;第一重復(fù)模塊,被配置為在所述待模擬骨骼鏈的當(dāng)前停留骨骼不存在未解算的約束的情況下,對(duì)所述待模擬骨骼鏈從更新后的所述當(dāng)前起始骨骼開(kāi)始重復(fù)執(zhí)行上述模塊中的操作,直到所述待模擬骨骼鏈中的葉子骨骼完成正向動(dòng)力學(xué)模擬,確定所述待模擬骨骼鏈模擬結(jié)束;其中,在第一次對(duì)待模擬骨骼鏈進(jìn)行正向動(dòng)力學(xué)模擬時(shí),所述當(dāng)前起始骨骼包括所述待模擬骨骼鏈的根骨骼。
26、根據(jù)本公開(kāi)的第四方面,提供了一種動(dòng)態(tài)骨骼模擬裝置,包括:遍歷模塊,被配置為響應(yīng)骨骼約束添加操作,針對(duì)所述添加約束的骨骼所在的目標(biāo)骨骼鏈,從所述目標(biāo)骨骼鏈的當(dāng)前起始骨骼開(kāi)始,遍歷所述目標(biāo)骨骼鏈中的骨骼;第二更新模塊,被配置為在當(dāng)前遍歷到的骨骼存在約束的情況下,對(duì)所述目標(biāo)骨骼鏈暫停遍歷,并根據(jù)當(dāng)前暫停骨骼更新所述當(dāng)前起始骨骼,所述當(dāng)前暫停骨骼根據(jù)暫停遍歷時(shí)的骨骼確定;標(biāo)記模塊,被配置為在每個(gè)所述目標(biāo)骨骼鏈均暫停遍歷的情況下,針對(duì)所述當(dāng)前暫停骨骼存在的約束,對(duì)約束所限制的骨骼均已被遍歷過(guò)的約束進(jìn)行標(biāo)記;第二重復(fù)模塊,被配置為在所述當(dāng)前暫停骨骼不存在未被標(biāo)記的約束的情況下,對(duì)所述當(dāng)前暫停骨骼對(duì)應(yīng)的目標(biāo)骨骼鏈繼續(xù)進(jìn)行遍歷以重復(fù)執(zhí)行上述模塊中的操作;約束添加模塊,被配置為根據(jù)約束的標(biāo)記情況,確定出骨骼約束的添加結(jié)果,以根據(jù)所述添加結(jié)果進(jìn)行動(dòng)態(tài)骨骼模擬。
27、根據(jù)本公開(kāi)的第五方面,提供了一種包含指令的計(jì)算機(jī)程序產(chǎn)品,當(dāng)其在計(jì)算機(jī)上運(yùn)行時(shí),使得計(jì)算機(jī)執(zhí)行如第一方面所述的動(dòng)態(tài)骨骼模擬方法和/或第二方面所述的動(dòng)態(tài)骨骼模擬方法中的步驟。
28、根據(jù)本公開(kāi)的第六方面,提供了一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其上存儲(chǔ)有計(jì)算機(jī)程序,所述計(jì)算機(jī)程序被處理器執(zhí)行時(shí)實(shí)現(xiàn)如上述實(shí)施例中第一方面所述的動(dòng)態(tài)骨骼模擬方法和/或第二方面所述的動(dòng)態(tài)骨骼模擬方法。
29、根據(jù)本公開(kāi)實(shí)施例的第七方面,提供了一種電子設(shè)備,包括:處理器;以及,存儲(chǔ)裝置,用于存儲(chǔ)一個(gè)或多個(gè)程序,當(dāng)所述一個(gè)或多個(gè)程序被所述一個(gè)或多個(gè)處理器執(zhí)行時(shí),使得所述一個(gè)或多個(gè)處理器實(shí)現(xiàn)如上述實(shí)施例中第一方面所述的動(dòng)態(tài)骨骼模擬方法和/或第二方面所述的動(dòng)態(tài)骨骼模擬方法。
30、由上述技術(shù)方案可知,本公開(kāi)示例性實(shí)施例中的動(dòng)態(tài)骨骼模擬方法、動(dòng)態(tài)骨骼模擬裝置,以及實(shí)現(xiàn)所述動(dòng)態(tài)骨骼模擬方法的計(jì)算機(jī)程序產(chǎn)品、計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)及電子設(shè)備,至少具備以下優(yōu)點(diǎn)和積極效果:
31、在本公開(kāi)的一些實(shí)施例所提供的技術(shù)方案中,首先,從待模擬骨骼鏈的當(dāng)前起始骨骼開(kāi)始,對(duì)待模擬骨骼鏈中的骨骼進(jìn)行正向動(dòng)力學(xué)模擬,然后,在當(dāng)前骨骼存在約束的情況下,暫停正向動(dòng)力學(xué)模擬,并根據(jù)當(dāng)前停留骨骼更新當(dāng)前起始骨骼,在每個(gè)待模擬骨骼鏈均暫停模擬的情況下,確定出當(dāng)前待解算集合,最后,根據(jù)當(dāng)前停留骨骼存在的約束的解算情況,對(duì)待模擬骨骼鏈進(jìn)行正向動(dòng)力學(xué)模擬,直到待模擬骨骼鏈模擬結(jié)束。一方面,本公開(kāi)中的動(dòng)態(tài)骨骼模擬方法可以在任意骨骼之間添加約束,豐富了動(dòng)態(tài)骨骼模擬的場(chǎng)景,比如,可以讓同一個(gè)骨骼鏈的根骨骼和葉子骨骼存在約束以將其綁定在一起從而實(shí)現(xiàn)環(huán)狀結(jié)構(gòu);另一方面,本公開(kāi)中的動(dòng)態(tài)骨骼模擬方法由于可以在任意骨骼之間添加約束,所以當(dāng)約束存在于不同骨骼鏈的骨骼之間時(shí),可以避免骨骼鏈之間由于過(guò)近或過(guò)遠(yuǎn)而導(dǎo)致的明顯拉伸的問(wèn)題,提高動(dòng)畫(huà)的顯示效果,使得動(dòng)畫(huà)顯示更加逼真。
32、本公開(kāi)應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性和解釋性的,并不能限制本公開(kāi)。