[SceneKit]碰撞檢測(cè)(六)

進(jìn)行碰撞檢測(cè)的前提是必須是兩個(gè)物體之間才能進(jìn)行碰撞, SceneKit 框架已經(jīng)為我們準(zhǔn)備好了物體引擎, 我們不需要關(guān)心他是怎么進(jìn)行碰撞檢測(cè)的, 只需要關(guān)心, 我們需要什么樣的物理效果, 剩下的就交給物理引擎來(lái)完成.

在場(chǎng)景中, 我們需要的是小球與邊框之間的碰撞, 然后, 當(dāng)小球到達(dá)邊緣之后, 在進(jìn)行反彈, 然后繼續(xù)運(yùn)動(dòng).
默認(rèn)情況下, 添加到場(chǎng)景中的節(jié)點(diǎn)都是不具備物理運(yùn)動(dòng)效果的. 我們需要添加.

ok, 首先我們先給小球添加物理效果, 如下圖所示的內(nèi)容添加

屏幕快照 2017-07-23 下午1.56.50.png

接下來(lái)看下每個(gè)設(shè)置選項(xiàng)的屬性的含義, 以及該如何去設(shè)置

?Physics Body:確定物體的類(lèi)型。將球的類(lèi)型設(shè)置為動(dòng)態(tài)體,這意味著場(chǎng)景套件物理引擎將完全控制球的運(yùn)動(dòng)。在[SceneKit]物理仿真模擬(二)中, 已經(jīng)解釋過(guò)了不同type的含義.
?Settings:允許您微調(diào)物理體的行為。對(duì)于球,將質(zhì)量(Mass)和恢復(fù)原則(Restitution)設(shè)置為1, 清除所有其他物理設(shè)置,并取消選中受重力影響(Affected by gravity)并允許休息(Allows resting)。這將使球彈起自由而不受重力的束縛。
?Velocity:影響物理體的速度和方向。給球(x:5,y:0,z:5)的線速度。一旦場(chǎng)景開(kāi)始運(yùn)行,這將給球一個(gè)初始的力量。將線性因子設(shè)置為(x:1,y:0,z:1),這將使可能施加到y(tǒng)軸上的球的任何物理力消除,從而保持球固定在相同的y位置有什么關(guān)系。

關(guān)與給球(x:5,y:0,z:5)的線速度。一旦場(chǎng)景開(kāi)始運(yùn)行,這將給球一個(gè)初始的力量。的解釋
首先, 我們是按照向量的來(lái)進(jìn)項(xiàng)運(yùn)算的, 小球的初始位置是(0,0,0), 這是一個(gè)三維的向量, 然后我們給小球一個(gè)終點(diǎn)的位置(5,0,5), 這也是一個(gè)向量, 然后兩個(gè)向量相加, (0,0,0)+(5,0,5)=(5,0,5), 求出最后運(yùn)動(dòng)的位置, 此處正式用到了向量相加的物理意義
在物理上的意義:合向量的效果=幾個(gè)分向量效果之合(力、位移、速度、加速度等)

Mass

指定物體以千克為單位的質(zhì)量, 默認(rèn)為1為動(dòng)態(tài)的物體, 默認(rèn)為0為靜態(tài)的物體

Restitution

當(dāng)一個(gè)物體運(yùn)動(dòng)時(shí)與某個(gè)物體發(fā)生碰撞進(jìn)行反彈時(shí), 理論上來(lái)說(shuō)是會(huì)有一部分能量被消失掉的, 當(dāng)他在進(jìn)行反彈時(shí), 速度會(huì)比剛運(yùn)動(dòng)時(shí)的速度小, 以此類(lèi)推, 直到停止, Restitution值設(shè)置為1, 即代表, 每次進(jìn)行反彈時(shí), 其攜帶的能量和剛開(kāi)始的能量是一樣的, 并不會(huì)因?yàn)榉磸椂鴾p少, 這樣小球就能一直無(wú)止境的進(jìn)行運(yùn)動(dòng)反彈下去了.

?Bit masks:用于稍后設(shè)置沖突。將“類(lèi)別”掩碼設(shè)置為1.它將一個(gè)位掩碼值分配給球。此掩碼用于創(chuàng)建沖突組并唯一標(biāo)識(shí)某些節(jié)點(diǎn)。然后,物理引擎使用這些信息,然后根據(jù)這些掩碼應(yīng)用碰撞計(jì)算,以確定哪些對(duì)象相沖突,哪些對(duì)象不相關(guān)。
?物理形狀:定義碰撞檢測(cè)期間使用的物理實(shí)體的實(shí)際形狀。將Shape設(shè)置為Sphere。

位掩碼

一、碰撞掩碼分為以下三種:

  1. CategoryBitmask:該掩碼會(huì)與另一個(gè)物體的另外兩個(gè)掩碼ContactTestBitmask、CollisionBitmask按位與,來(lái)確定是否可以碰撞
  1. ContactTestBitmask:確定兩個(gè)物體碰撞時(shí)是否調(diào)用碰撞檢測(cè)的代理方法
  2. CollisionBitmask:確定兩個(gè)物體是否允許碰撞

如果希望A和B允許碰撞,則
A的CategoryBitmask與B的CollisionBitmask與運(yùn)算結(jié)果為0
B的CategoryBitmask與A的CollisionBitmask與運(yùn)算結(jié)果為0
否則A和B就不允許碰撞,接觸后直接彈開(kāi)

如果希望A和B發(fā)生碰撞檢測(cè),即調(diào)用onContactBegin,則
A的CategoryBitmask與B的ContactTestBitmask與運(yùn)算結(jié)果不為0
B的CategoryBitmask與A的ContactTestBitmask與運(yùn)算結(jié)果不為0

OK, 小球的物體引擎效果添加完畢, 下面添加邊框的物理引擎

首先全選Barriers, 此時(shí)選中的物理幾何體都被標(biāo)記成了黃色的框框

屏幕快照 2017-07-23 下午2.17.46.png

如下設(shè)置Barriers

屏幕快照 2017-07-23 下午2.18.21.png

?Physical Body:對(duì)于類(lèi)型,將其設(shè)置為靜態(tài)主體,以便障礙物不會(huì)移動(dòng),也不會(huì)隨動(dòng)作移動(dòng)。
?Setting:清除所有設(shè)置并將恢復(fù)設(shè)置為1,使其在碰撞發(fā)生時(shí)不會(huì)損失能量。取消選中這兩個(gè)復(fù)選框,以便障礙物也不受重力的影響。
?Bit masks:將類(lèi)別掩碼設(shè)置為2,將碰撞掩碼設(shè)置為1.這樣可以將類(lèi)別位掩碼設(shè)置為2,并將其設(shè)置為與類(lèi)別位掩碼為1的對(duì)象相沖突 - 與您給出的相同類(lèi)別位掩碼。
?Physics Shape:Shape設(shè)置為Default shape, Type為Bounding Box。因?yàn)閮蓚?cè)障礙是帶有子節(jié)點(diǎn)的節(jié)點(diǎn),所以該選項(xiàng)更為合適,因?yàn)檫吔缈驀@該組內(nèi)的所有子節(jié)點(diǎn)創(chuàng)建邊界。如果你看場(chǎng)景編輯器,你會(huì)發(fā)現(xiàn)有一個(gè)紅色的線框,它顯示了當(dāng)您運(yùn)行游戲時(shí)物理機(jī)構(gòu)的外觀。

此時(shí)點(diǎn)擊預(yù)覽效果的按鈕

屏幕快照 2017-07-23 下午2.42.12.png

你將會(huì)看到小球在運(yùn)動(dòng)

Jietu20170723-144920.gif

關(guān)與各個(gè)屬性是什么意思, 我也沒(méi)全部搞清楚, 也沒(méi)找到具體的文檔, 資料比較少, 蘋(píng)果官方的文檔寫(xiě)的并不是很清楚.

具體代碼
SceneEditor是一個(gè)添加好物體控件, 未添加物理引擎的工程
SceneEditor_Collision_Detection是一個(gè)添加了碰撞檢測(cè)的工程工程
https://github.com/JasonSparrow/SceneKit

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容