員在服務(wù)器上測(cè)試單機(jī)游戲等。
[0044] 為了便于探測(cè)碰撞體之間碰撞,在實(shí)時(shí)虛擬場(chǎng)景中,表示玩家控制的虛擬角色和 其他一些移動(dòng)物體(如手雷、攝像機(jī)等)都是Actor類(lèi)及其子類(lèi)的對(duì)象,為此采用軸對(duì)齊進(jìn)行 碰撞探測(cè)。為了改變虛擬角色的碰撞體,修改Actor類(lèi),讓虛擬角色使用圓柱碰撞體,非角色 Actor使用軸對(duì)齊包圍盒進(jìn)行碰撞探測(cè)。在實(shí)時(shí)虛擬場(chǎng)景中,場(chǎng)景對(duì)象主要有兩種,即包括 BSP場(chǎng)景對(duì)象和Component場(chǎng)景對(duì)象。按照不同的場(chǎng)景對(duì)象分類(lèi)存儲(chǔ),即將對(duì)象分為BSP或 Component。在碰撞探測(cè)時(shí),米用碰撞探測(cè)的入口函數(shù)UworId: :MoveActor()按照?qǐng)鼍皩?duì)象 分類(lèi)做粗裁剪,判斷該分類(lèi)哪些對(duì)象可能會(huì)和傳入的Actor對(duì)象碰撞體發(fā)生碰撞,然后再做 精細(xì)碰撞探測(cè)并獲得返回結(jié)果。其中,粗裁剪是指做粗碰撞。精細(xì)碰撞是指按照下面所述的 實(shí)時(shí)虛擬場(chǎng)景中圓柱碰撞體與凸體之間碰撞探測(cè)的方法實(shí)現(xiàn)圓柱碰撞體與凸體(即 Component場(chǎng)景對(duì)象)之間進(jìn)行精細(xì)碰撞探測(cè),碰撞探測(cè)結(jié)束后,采用Check系列函數(shù)將碰撞 探測(cè)結(jié)果匯總給1^〇1'1(1 ::1〇¥64〇1:〇1'(),由其進(jìn)一步匯總后用于后續(xù)計(jì)算,如狀態(tài)改變、傷 害計(jì)算等。在Component場(chǎng)景對(duì)象,以圓柱取代軸對(duì)齊包圍盒作為傳入MoveActor()的碰撞 體。實(shí)時(shí)虛擬場(chǎng)景可包括游戲場(chǎng)景、動(dòng)漫場(chǎng)景等,也可應(yīng)用于實(shí)時(shí)游戲場(chǎng)景中,不限于此。
[0045] 每個(gè)Component場(chǎng)景對(duì)象包含若干Element類(lèi)的對(duì)象,Element有FKBoxElem、 FKSphereElem、FKSphylElem和FKConvexElem,分別表不有向盒、球體、膠囊體和凸多面體, 如圖4所示,Component類(lèi)包含的Element類(lèi)對(duì)象。Element是Component對(duì)象里的碰撞體,都 是凸體,采用分離軸測(cè)試算法(Separating Axis Test)計(jì)算圓柱碰撞體與凸體之間碰撞探 測(cè)的情況。分離軸測(cè)試算法的理論依據(jù)是,若兩個(gè)凸體沒(méi)有相交,則一定可以找出一個(gè)軸, 使得兩個(gè)凸體在這個(gè)軸上的投影也不相交,如圖5所示,兩個(gè)凸體投影在同一軸上且沒(méi)有相 交。
[0046]增加 Actor類(lèi)用來(lái)存儲(chǔ)圓柱碰撞體的成員變量。在這種情況下,假設(shè)Actor的圓柱 碰撞體是(世界坐標(biāo)系的)豎直圓柱,采用Cyl inder類(lèi)表示。圖6為一個(gè)實(shí)施例中圓柱碰撞體 的示意圖。如圖6所示,采用Cylinder類(lèi)表示豎直圓柱,在Cylinder類(lèi)里,采用橫線62表示 Radius(半徑),豎線64表示Height,取值為半高(即圓柱碰撞體高度值的一半)。
[0047]圖7為一個(gè)實(shí)施例中實(shí)時(shí)虛擬場(chǎng)景中圓柱碰撞體與凸體之間碰撞探測(cè)的方法的流 程圖。如圖7所示,一種實(shí)時(shí)虛擬場(chǎng)景中圓柱碰撞體與凸體之間碰撞探測(cè)的方法,運(yùn)行于圖2 中應(yīng)用環(huán)境中,包括以下步驟:
[0048]步驟702,將虛擬場(chǎng)景中虛擬對(duì)象所對(duì)應(yīng)的圓柱碰撞體轉(zhuǎn)化為與圓柱碰撞體同中 心點(diǎn)的預(yù)設(shè)多邊形棱柱。
[0049] 具體地,虛擬對(duì)象可為實(shí)時(shí)虛擬場(chǎng)景中可以動(dòng)態(tài)運(yùn)行的人物或物體等。將虛擬對(duì) 象配置為圓柱碰撞體。碰撞體是用于計(jì)算物體之間是否碰撞的物體,即實(shí)際參與碰撞算法 計(jì)算的物體。
[0050] 將圓柱碰撞體轉(zhuǎn)化為預(yù)設(shè)多邊形棱柱時(shí),預(yù)設(shè)多邊形棱柱與圓柱碰撞體的豎直方 向的中心軸相同。預(yù)設(shè)多邊形棱柱的中心與圓柱碰撞體的中心點(diǎn)相同,且預(yù)設(shè)多邊形棱柱 的上下底面和圓柱碰撞體的上下底面的中心相同。
[0051 ] 預(yù)設(shè)多邊形可為正多邊形。正多邊形邊的條數(shù)可為5、6、7、8、9、16、32等,不限于 此。正多邊形邊的條數(shù)為2的指數(shù)時(shí)便于計(jì)算機(jī)處理,如8邊形、16邊形、32邊形、64邊形等。 [0052]實(shí)時(shí)虛擬場(chǎng)景是指實(shí)時(shí)游戲場(chǎng)景或?qū)崟r(shí)動(dòng)漫場(chǎng)景等。實(shí)時(shí)游戲場(chǎng)景表示正在運(yùn)行 的游戲中的場(chǎng)景。實(shí)時(shí)動(dòng)漫場(chǎng)景表示正在運(yùn)行的動(dòng)漫中的場(chǎng)景。碰撞探測(cè)是指探測(cè)碰撞體 之間是否發(fā)生碰撞。碰撞發(fā)生后產(chǎn)生碰撞響應(yīng),即一碰撞體與另一碰撞體碰撞后無(wú)法沿原 來(lái)的移動(dòng)方向繼續(xù)移動(dòng)調(diào)整一碰撞體的移動(dòng)方向以繞過(guò)另一碰撞體或一碰撞體擊中另一 碰撞體產(chǎn)生擊中響應(yīng)等。本實(shí)施例中,碰撞探測(cè)主要是指一碰撞體避免與另一碰撞體碰撞, 調(diào)整一碰撞體的移動(dòng)方向以繞過(guò)另一碰撞體。
[0053] 碰撞體的大小可根據(jù)虛擬場(chǎng)景中虛擬對(duì)象的大小設(shè)置,例如虛擬對(duì)象為球體,則 虛擬對(duì)象對(duì)應(yīng)的圓柱碰撞體的高可設(shè)置球體的直徑,圓柱體的半徑可設(shè)置略大于球體的半 徑大小。
[0054]圖8為正八棱柱俯視示意圖。如圖8所示,將圓柱碰撞體的圓柱體轉(zhuǎn)化為八邊形棱 柱后,八邊形棱柱的俯視示意圖。外面的矩陣為圓柱碰撞體的AABB(Axis Aligned Bounding Box,軸對(duì)齊包圍盒)。
[0055]步驟704,將該預(yù)設(shè)多邊形棱柱變換到凸體的局部坐標(biāo)系,得到預(yù)設(shè)多邊形棱柱在 凸體的局部坐標(biāo)系下的位置。
[0056]本實(shí)施例中,將圓柱體變換到凸體Element的局部坐標(biāo)系,實(shí)際上市將原有的X、Y、 Ζ三個(gè)軸變換到凸體的局部坐標(biāo)系,同時(shí)也將中心點(diǎn)變換到凸體的局部坐標(biāo)系,再根據(jù)X、Υ、 Ζ三個(gè)軸變換的結(jié)果,重建圓柱碰撞體在凸體的局部坐標(biāo)系下的位置,即預(yù)設(shè)多邊形棱柱變 換到凸體的局部坐標(biāo)系,得到預(yù)設(shè)多邊形棱柱在凸體的局部坐標(biāo)系下的位置。預(yù)設(shè)多邊形 棱柱以十六邊形棱柱為例,則根據(jù)X、Υ、ζ三個(gè)軸、中心點(diǎn)在凸體的局部坐標(biāo)系下的對(duì)應(yīng)向 量,計(jì)算出十六棱柱對(duì)應(yīng)的三十二個(gè)頂點(diǎn)的坐標(biāo),根據(jù)三十二個(gè)頂點(diǎn)組成十八個(gè)面四十八 條邊。
[0057] 通過(guò)六1'13;[1:瓜15^1丨8071;[11(161'類(lèi)處理坐標(biāo)系變換,在41'13;[1:抑15^1丨8071;[11(161'類(lèi)增 加用于變換到凸體Element局部坐標(biāo)系的變換矩陣成員變量,以及變換過(guò)的圓柱碰撞體原 本的X、Y、Z軸單位向量在凸體局部坐標(biāo)系下的向量,用于快速判斷圓柱碰撞體是否經(jīng)過(guò)旋 轉(zhuǎn)、平移、伸縮等變換。在ArbitraryAxisCylinder類(lèi)中,記錄有Radius(半徑),Height,新的 X、Y、Z軸,中心點(diǎn)的位移。通過(guò)三個(gè)軸的變換結(jié)果可以判斷圓柱碰撞體經(jīng)過(guò)了怎樣的變換, 用于加速投影計(jì)算。中心點(diǎn)的位移可以計(jì)算投影的位置。
[0058] 圖9為一個(gè)實(shí)施例中將該預(yù)設(shè)多邊形棱柱變換到凸體的局部坐標(biāo)系,得到預(yù)設(shè)多 邊形棱柱在凸體的局部坐標(biāo)系下的位置步驟的具體流程圖。如圖9所示,將該預(yù)設(shè)多邊形棱 柱變換到凸體的局部坐標(biāo)系,得到預(yù)設(shè)多邊形棱柱在凸體的局部坐標(biāo)系下的位置包括:
[0059] 步驟902,將預(yù)設(shè)多邊形棱柱的X軸、Υ軸、Ζ軸及中心點(diǎn)變換到凸體的局部坐標(biāo)系, 得到預(yù)設(shè)多邊形棱柱的X軸、Υ軸、Ζ軸的單位向量在凸體的局部坐標(biāo)系下對(duì)應(yīng)的向量,并用Ζ 軸在凸體的局部坐標(biāo)系下向量乘以圓柱碰撞體的正負(fù)半高值,得到預(yù)設(shè)多邊形棱柱的上下 兩個(gè)底面的中點(diǎn)坐標(biāo)。
[0060] 具體地,圓柱碰撞體的半高采用Height表示。
[0061 ]步驟904,獲取圓柱碰撞體的半徑,根據(jù)圓柱碰撞體的半徑、X軸、Y軸在凸體的局部 坐標(biāo)系下對(duì)應(yīng)的向量得到預(yù)設(shè)多邊形棱柱的各頂點(diǎn)相對(duì)所在底面的中點(diǎn)的偏移量,將偏移 量與中點(diǎn)坐標(biāo)求和得到對(duì)應(yīng)頂點(diǎn)的坐標(biāo)。
[0062]具體地,圓柱碰撞體的半徑采用R表示。采用三角函數(shù)、圓柱碰撞體的半徑R、X軸、Υ 軸在凸體的局部坐標(biāo)系下對(duì)應(yīng)的向量相乘,得到十六邊形棱柱的上下底面的十六邊形的各 個(gè)頂點(diǎn)相對(duì)于所對(duì)應(yīng)中點(diǎn)坐標(biāo)的偏移量,也就是上底面的十六個(gè)頂點(diǎn)相對(duì)于上底面的中點(diǎn) 坐標(biāo)的偏移量,下底面的十六個(gè)頂點(diǎn)相對(duì)于下底面的中點(diǎn)坐標(biāo)的偏移量。將偏移量加上對(duì) 應(yīng)的中點(diǎn)坐標(biāo)可得到對(duì)應(yīng)的頂點(diǎn)坐標(biāo)。
[0063]圖10為獲取八多邊形棱柱的頂點(diǎn)示意圖。如圖10所示,1002為一個(gè)底面的中心點(diǎn), 1004為該底面的其中一個(gè)頂點(diǎn)。
[0064]步驟906,根據(jù)各個(gè)頂點(diǎn)的坐標(biāo)在凸體的局部坐標(biāo)系下重建預(yù)設(shè)多邊形棱柱。
[0065] 具體地,各個(gè)頂點(diǎn)的坐標(biāo)求出后,上底面的各個(gè)頂點(diǎn)依次相連組成上底面,下底面 的各個(gè)頂點(diǎn)依次相連組成下底面,上底面和下底面中對(duì)應(yīng)的頂點(diǎn)相連形成棱柱的一條棱。 如此,將三十二個(gè)頂點(diǎn)組成了十八個(gè)面四十八條邊。
[0066] 通過(guò)將圓柱碰撞體的X、Υ、Ζ軸變換到凸體的局部坐標(biāo)系下,以及圓柱碰撞體的中 心點(diǎn)變換到凸體的局部坐標(biāo)系下,根據(jù)圓柱碰撞體的X、Υ、Ζ軸在凸體的局部坐標(biāo)系下對(duì)應(yīng) 的向量、中心點(diǎn)坐標(biāo)及圓柱碰撞體的半徑及半高等計(jì)算得出圓柱碰撞體轉(zhuǎn)化的預(yù)設(shè)多邊形 棱柱在凸體的局部坐標(biāo)系下的位置,計(jì)算簡(jiǎn)單,計(jì)算量小,性能高。
[0067]需要說(shuō)明的是,圓柱碰撞體若經(jīng)過(guò)了錯(cuò)切變換,則需要將預(yù)設(shè)多邊形棱柱的所有 頂點(diǎn)在圓柱碰撞體的局部坐標(biāo)系計(jì)算后,用矩陣運(yùn)算變換到凸體的局部坐標(biāo)系。錯(cuò)切變換 是指使圖形產(chǎn)生一個(gè)扭變。
[0068] 步驟706,根據(jù)該預(yù)設(shè)多邊形棱柱在凸體的局部坐標(biāo)系下的位置獲取預(yù)設(shè)多邊形 棱柱各個(gè)面的法向、預(yù)設(shè)多邊形的邊方向和棱柱的棱的邊方向。
[0069] 具體地,面的法向是指垂直于面的法向量。邊方向是指邊的兩端延伸方向,方向可 作為相同。將預(yù)設(shè)多邊形的邊方向和棱柱的棱的邊方向做向量積可得到對(duì)應(yīng)面的法向。
[0070] 圖11為八邊形棱柱的法向獲取示意圖。如圖11所示,根據(jù)得到的頂點(diǎn)1102和頂點(diǎn) 1104的坐標(biāo)可算出對(duì)應(yīng)的邊1106,再獲取邊1106的邊方向,邊方向是指該邊兩端延伸,任意 延伸的方向即為該邊的邊方向。
[0071] 步驟708,獲取該凸體的各個(gè)面的法向和各個(gè)邊方向。
[0072] 具體地,凸