基本理論
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