ARKit基礎(chǔ)--sceneKit基礎(chǔ)碰撞檢測

基本理論

2D中的碰撞檢查大家都能能理解学搜,涉及到的數(shù)學(xué)知識并不復(fù)雜娃善。但在3D中碰撞檢測要涉及到更復(fù)雜的數(shù)學(xué)知識了,很多人數(shù)學(xué)功底不好的同學(xué)就犯難了瑞佩,我也是聚磺。幸好SceneKit框架 提供了方便的方法去判斷碰撞檢測。
要想讓SCNNode 模擬碰撞檢測,首先要設(shè)置它的Physics Body炬丸,Physics Body有三種類型:
(1)Dynamic:動態(tài)的物體瘫寝,受力的影響(applyForce)蜒蕾。
(2)Static: 靜態(tài)的物體,不受力的影響焕阿。
(3)Kinemat:這種類型比較特殊咪啡,你可以直接移動,旋轉(zhuǎn)它暮屡,在空間變換中撤摸,會對Dynamic的物體產(chǎn)生力的影響。
其次需要設(shè)置categoryBitMask褒纲,來表示物體的特質(zhì)准夷,比如下面我們定義了一個bottom和cube,這樣碰撞的時候,我們可以通過這個mask來判斷碰撞node的類型莺掠。

typedef NS_OPTIONS(NSUInteger, CollisionCategory) {
  CollisionCategoryBottom  = 1 << 0,
  CollisionCategoryCube    = 1 << 1,
};

Kinemat物體

 SCNNode *bottomNode = [SCNNode nodeWithGeometry:bottomPlane];
  bottomNode.physicsBody = [SCNPhysicsBody
                             bodyWithType:SCNPhysicsBodyTypeKinematic
                            shape: nil];
  bottomNode.physicsBody.categoryBitMask = CollisionCategoryBottom;

這里設(shè)置了一個Kinemat物體冕象,可以吸引其他物體,該物體的標(biāo)示為CollisionCategoryBottom.

Dynamic物體

node.physicsBody = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeDynamic shape:nil];
  node.physicsBody.mass = 2.0;
  node.physicsBody.categoryBitMask = CollisionCategoryCube;

這里設(shè)置了一個Dynamic物體汁蝶,mass為其重量渐扮,會影響其動能,該物體的標(biāo)示為CollisionCategoryCube.

設(shè)置碰撞delegate

@protocol SCNPhysicsContactDelegate <NSObject>
@optional
- (void)physicsWorld:(SCNPhysicsWorld *)world didBeginContact:(SCNPhysicsContact *)contact;
- (void)physicsWorld:(SCNPhysicsWorld *)world didUpdateContact:(SCNPhysicsContact *)contact;
- (void)physicsWorld:(SCNPhysicsWorld *)world didEndContact:(SCNPhysicsContact *)contact;
@end

 self.sceneView.scene.physicsWorld.contactDelegate = self;

一共3個碰撞函數(shù)掖棉,碰撞開始前墓律,碰撞開始中,碰撞開始后幔亥。

- (void)physicsWorld:(SCNPhysicsWorld *)world didBeginContact:(SCNPhysicsContact *)contact {
  if (contact.nodeA.physicsBody.categoryBitMask == CollisionCategoryBottom) {
      //對bottom的SCNNode做處理
    } else {
      //對cube的SCNNode做處理
    }
}

碰撞中耻讽,返回碰撞的nodeA|nodeB,可以通過categoryBitMask來判斷是SCNNode的類型。

具體參看demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帕棉,一起剝皮案震驚了整個濱河市针肥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌香伴,老刑警劉巖慰枕,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異即纲,居然都是意外死亡具帮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門低斋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜂厅,“玉大人,你說我怎么就攤上這事膊畴【蛟常” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵唇跨,是天一觀的道長稠通。 經(jīng)常有香客問我礁遵,道長,這世上最難降的妖魔是什么采记? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任佣耐,我火速辦了婚禮,結(jié)果婚禮上唧龄,老公的妹妹穿的比我還像新娘兼砖。我一直安慰自己,他們只是感情好既棺,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布讽挟。 她就那樣靜靜地躺著,像睡著了一般丸冕。 火紅的嫁衣襯著肌膚如雪耽梅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天胖烛,我揣著相機與錄音眼姐,去河邊找鬼。 笑死佩番,一個胖子當(dāng)著我的面吹牛众旗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趟畏,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼贡歧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赋秀?” 一聲冷哼從身側(cè)響起利朵,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猎莲,沒想到半個月后绍弟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡益眉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年晌柬,在試婚紗的時候發(fā)現(xiàn)自己被綠了姥份。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郭脂。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖澈歉,靈堂內(nèi)的尸體忽然破棺而出展鸡,到底是詐尸還是另有隱情,我是刑警寧澤埃难,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布莹弊,位于F島的核電站涤久,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏忍弛。R本人自食惡果不足惜响迂,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望细疚。 院中可真熱鬧蔗彤,春花似錦、人聲如沸疯兼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吧彪。三九已至待侵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間姨裸,已是汗流浹背秧倾。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留傀缩,地道東北人中狂。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像扑毡,于是被迫代替她去往敵國和親胃榕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

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