創(chuàng)建SCNPhysicsBody
+ (instancetype)staticBody;
staticBody
是一個(gè)不受外力或碰撞影響的物體沈堡,不能移動(dòng)覆旭。比如地板策州、墻壁等埠褪。
必須把它附加到SCNNode
的physicsBody
屬性上浓利。附加到節(jié)點(diǎn)上后,會(huì)自動(dòng)為節(jié)點(diǎn)創(chuàng)建物理形狀钞速。
對(duì)于包含自定義幾何的節(jié)點(diǎn)贷掖,SceneKit
出于對(duì)準(zhǔn)確性和性能的折衷,創(chuàng)建的只是一個(gè)近似的物理形狀渴语∑煌基于基本幾何類(SCNBox
, SCNSphere
, SCNPyramid
, SCNCone
, SCNCylinder
, 或者 SCNCapsule
)的節(jié)點(diǎn)體驗(yàn)效果最好。
如果想手動(dòng)創(chuàng)建物理形狀驾凶,使用SCNPhysicsShape
類方法牙甫。
+ (instancetype)dynamicBody;
dynamicBody
是一個(gè)可以受力和碰撞影響的物體。
其余同staticBody
+ (instancetype)kinematicBody;
kinematicBody
是一個(gè)不受外力或碰撞影響的物理實(shí)體调违,但它會(huì)在移動(dòng)時(shí)造成碰撞影響其他物體窟哺。
其余同staticBody
舉一個(gè)簡(jiǎn)單的例子:桌球游戲中,球桌是
staticBody
技肩,球是dynamicBody
且轨,球桿是kinematicBody
。
+ (instancetype)bodyWithType:(SCNPhysicsBodyType)type shape:(nullable SCNPhysicsShape *)shape;
根據(jù)指定類型和形狀創(chuàng)建一個(gè)物理實(shí)體。
如果將nil
傳遞給shape
旋奢,在將它附加到節(jié)點(diǎn)上時(shí)泳挥,會(huì)自動(dòng)根據(jù)節(jié)點(diǎn)創(chuàng)建物理性狀。
其余同staticBody
定義力如何影響物體
@property(nonatomic, retain) SCNPhysicsShape *physicsShape;
在碰撞檢測(cè)中物體的形狀至朗。
在碰撞檢測(cè)時(shí)往往沒(méi)必要用真實(shí)的幾何形狀屉符,用簡(jiǎn)單的形狀可以得到更好的性能。通常我們把physicsShape
設(shè)置為一個(gè)簡(jiǎn)單的形狀爽丹,把真實(shí)的幾何形狀放里面筑煮。
當(dāng)然對(duì)于精準(zhǔn)的碰撞測(cè)試,我們需要使用更詳細(xì)的幾何圖形粤蝎。
創(chuàng)建物理圖形的細(xì)節(jié)參見(jiàn)SCNPhysicsShape
類真仲。
@property(nonatomic) SCNPhysicsBodyType type;
typedef enum SCNPhysicsBodyType : NSInteger {
SCNPhysicsBodyTypeStatic,
SCNPhysicsBodyTypeDynamic,
SCNPhysicsBodyTypeKinematic
} SCNPhysicsBodyType;
物體的類型,枚舉類型初澎,就是上文中的staticBody
秸应、dynamicBody
、kinematicBody
碑宴。
@property(nonatomic) SCNVector3 velocityFactor;
移動(dòng)因子
例如软啼,可以通過(guò)將其速度因子設(shè)置為{1.0,1.0,0.0},從而使物體只能在在兩個(gè)維度中移動(dòng)延柠。
@property(nonatomic) SCNVector3 angularVelocityFactor;
旋轉(zhuǎn)因子
例如祸挪,可以通過(guò)將其旋轉(zhuǎn)因子設(shè)置為{0.0,1.0,0.0},從而使物體只能在一個(gè)軸上旋轉(zhuǎn)贞间。
@property(nonatomic, getter=isAffectedByGravity) BOOL affectedByGravity;
是否受重力影響
這個(gè)屬性默認(rèn)是YES
定義物體的屬性
@property(nonatomic) CGFloat mass;
質(zhì)量贿条,以千克為單位。
質(zhì)量會(huì)影響物體對(duì)力的反應(yīng)增热。dynamicBody
的默認(rèn)質(zhì)量是1整以。staticBody
和kinematicBody
的默認(rèn)質(zhì)量為0,但它們不受質(zhì)量影響峻仇。
物理模擬的影響取決于不同物體的相對(duì)質(zhì)量公黑,而不是絕對(duì)值。所以你不需要對(duì)應(yīng)用程序中的物體進(jìn)行實(shí)際測(cè)量摄咆。
@property(nonatomic) CGFloat charge;
電荷凡蚜,以庫(kù)侖為單位。
當(dāng)受到電場(chǎng)或磁場(chǎng)影響時(shí)吭从,帶有正電荷或負(fù)電荷的物體的行為會(huì)不同朝蜘。三種類型的物體的默認(rèn)電荷均為0,即不會(huì)受電場(chǎng)和磁場(chǎng)的影響影锈。
同樣不需要去做實(shí)際測(cè)量芹务。
@property(nonatomic) CGFloat friction;
滑動(dòng)摩擦力。
當(dāng)兩個(gè)物體接觸并滑動(dòng)時(shí)鸭廷,摩擦力決定它們對(duì)運(yùn)動(dòng)的阻力枣抱。如果兩個(gè)物體的摩擦力都是0,它們會(huì)自由地滑動(dòng)辆床。如果都是1佳晶,就不會(huì)滑動(dòng)。默認(rèn)值為0.5讼载。
@property(nonatomic) CGFloat rollingFriction;
滾動(dòng)摩擦力轿秧。
圓型物體在滾動(dòng)時(shí)的阻力。如果是0咨堤,將持續(xù)滾動(dòng)而不減速菇篡,除非另有動(dòng)作。如果是1一喘,將無(wú)法滾動(dòng)驱还。默認(rèn)值為0。
@property(nonatomic) CGFloat restitution;
可以理解成彈性凸克。
決定了物體在碰撞過(guò)程中會(huì)保留多少動(dòng)能议蟆。比如一個(gè)球掉在地面,如果是0萎战,就不會(huì)反彈咐容。如果是1,就會(huì)彈回原處蚂维。如果大于1戳粒,它會(huì)彈得比原來(lái)更高。默認(rèn)值是0.5鸟雏。
@property(nonatomic) CGFloat damping;
移動(dòng)阻尼享郊。
類似空氣摩擦或水摩擦,就是在移動(dòng)中的阻力孝鹊。與其他的力獨(dú)立并共存炊琉。如果是0,表示沒(méi)有阻力又活,不會(huì)造成速度損失苔咪。如果是1,就會(huì)阻止物體移動(dòng)柳骄。默認(rèn)值是0.1团赏。
@property(nonatomic) CGFloat angularDamping;
旋轉(zhuǎn)阻尼。
同上耐薯,影響物體在旋轉(zhuǎn)中的阻力舔清。默認(rèn)值是0.1丝里。
@property(nonatomic) SCNVector3 momentOfInertia;
慣性矩陣。
比如x<y時(shí)体谒,表示物體在x軸上旋轉(zhuǎn)時(shí)的慣性更小杯聚,就能夠更加自由旋轉(zhuǎn)。
默認(rèn)情況下抒痒,SceneKit會(huì)根據(jù)物體的形狀和質(zhì)量自動(dòng)確定慣性矩陣幌绍。如果要自定義,需要設(shè)置usesDefaultMomentOfInertia
為NO
故响。
@property(nonatomic) BOOL usesDefaultMomentOfInertia;
是否自動(dòng)計(jì)算物體的慣性矩矩形傀广。
YES為自動(dòng)計(jì)算,NO為自定義設(shè)置彩届。
分類
@property(nonatomic) NSUInteger categoryBitMask;
物體的分類伪冰。
每個(gè)分類都是位掩碼的一個(gè)位。我們可以通過(guò)位運(yùn)算給物體設(shè)置一個(gè)或多個(gè)類別樟蠕。
與physicsshape
和contacttestbitmask
一起使用可以定義物體間的相互作用糜值。
dynamicBody
和kinematicBody
的默認(rèn)類別是SCNPhysicsCollisionCategoryDefault
。staticBody
的默認(rèn)類別為SCNPhysicsCollisionCategoryStatic
@property(nonatomic) NSUInteger contactTestBitMask;
定義哪些類別的物體與這個(gè)物體接觸時(shí)會(huì)收到通知坯墨。
當(dāng)物體A與物體B接觸時(shí)寂汇,SceneKit
會(huì)比較A.contactTestBitMask&&B.categoryBitMask
,如果結(jié)果是一個(gè)非零的值捣染,會(huì)創(chuàng)建一個(gè)SCNPhysicsContact
對(duì)象骄瓣,我們可以通過(guò)contactDelegate
來(lái)處理我們需要自定義的一些操作。通常為了獲得最好的性能耍攘,只需為我們感興趣的交互中的物體設(shè)置contactTestBitMask
榕栏。
iOS8或者OS X v10.10的環(huán)境下,當(dāng)且僅當(dāng)碰撞發(fā)生了蕾各,SceneKit
才會(huì)觸發(fā)delegate
扒磁。iOS9或者OS X v10.11以后的版本,這個(gè)值默認(rèn)是0式曲,且不管是碰撞妨托,還是穿過(guò)彼此,都會(huì)觸發(fā)delegate
.
@property(nonatomic) NSUInteger collisionBitMask;
定義哪些分類的物體可以和這個(gè)物體發(fā)生碰撞吝羞。
當(dāng)物體A與物體B接觸時(shí)兰伤,可能會(huì)發(fā)生碰撞。SceneKit
會(huì)比較A.collisionBitMask&&B.categoryBitMask
钧排。如果結(jié)果是一個(gè)非零值敦腔,那么物體會(huì)發(fā)生碰撞。每個(gè)物體可以單獨(dú)選擇想發(fā)生碰撞的物體恨溜。
默認(rèn)值是SCNPhysicsCollisionCategoryAll
符衔,將于所有的類別發(fā)生碰撞找前。
用力
- (void)applyForce:(SCNVector3)direction impulse:(BOOL)impulse;
給物體的質(zhì)心施加一個(gè)力或沖量。
direction:力的大小和方向
impulse:YES判族,施加的是沖量纸厉;NO,施加的是力
物體線性加速度與質(zhì)量成正比五嫂。
impulse
參數(shù)決定了這個(gè)方法如何進(jìn)行物理模擬。(復(fù)習(xí)力學(xué)知識(shí))
如果設(shè)置為YES
肯尺,會(huì)把direction
參數(shù)作為一個(gè)沖量沃缘。單位是牛秒(kgm/s 或 N·s = Huygens Hy),并立即加速物體则吟。比如發(fā)射炮彈等槐臀。
如果設(shè)置為NO
,會(huì)把direction
參數(shù)作為一個(gè)力氓仲。單位是牛頓(N)水慨,SceneKit
會(huì)在每一幀的最后,將所有的力都應(yīng)用到物體上敬扛,從而得到一個(gè)加速度晰洒。
impulse
參數(shù)改變了量值的單位,如果是沖量啥箭,將在每一幀上連續(xù)產(chǎn)生一定的加速度谍珊,如果緊在一幀里應(yīng)用,那么加速度將大大降低急侥。
同樣不需要去做實(shí)際測(cè)量砌滞。
- (void)applyForce:(SCNVector3)direction atPosition:(SCNVector3)position impulse:(BOOL)impulse;
給物體的某個(gè)位置施加一個(gè)力或沖量。
position:物體所在的SCNNode的自身坐標(biāo)系中坏怪,施加力或沖量的點(diǎn)贝润。
其余參數(shù)同上
在物體的質(zhì)心以外的位置上施加一個(gè)力或沖量,可以是線性加速度或角加速度铝宵,這取決于物體在物理世界中的位置打掘,以及作用于它的其他力。
- (void)applyTorque:(SCNVector4)torque impulse:(BOOL)impulse;
給物體施加一個(gè)扭矩(旋轉(zhuǎn)的力)或角動(dòng)量(旋轉(zhuǎn)的沖量)鹏秋。
torque :方向和大小的扭矩(烹事保·米)或角動(dòng)量的變化(在newton-meter-seconds),相對(duì)于場(chǎng)景的世界坐標(biāo)空間拼岳。
impulse :YES枝誊,施加的是角動(dòng)量;NO惜纸,施加的是扭矩
施加扭矩或角動(dòng)量到物體上叶撒,其角速度與物體的質(zhì)量绝骚、形狀有關(guān),此外這并不會(huì)影響到物體的線性加速度祠够。
- (void)clearAllForces;
取消所有持續(xù)的力或扭矩压汪。
管理物體運(yùn)動(dòng)
@property(nonatomic) SCNVector3 velocity;
物體當(dāng)前運(yùn)動(dòng)速度(米/秒)和方向。
在SCNSceneRendererDelegate協(xié)議中的任何方法中調(diào)用古瓤,返回的是物理模擬的當(dāng)前結(jié)果止剖,設(shè)置屬性會(huì)立即應(yīng)用更改。
在其他時(shí)間調(diào)用落君,返回的是最后一次設(shè)置的值穿香,設(shè)置屬性會(huì)在下一次渲染循環(huán)的過(guò)程時(shí)生效。
@property(nonatomic) SCNVector4 angularVelocity;
物體當(dāng)前的旋轉(zhuǎn)軸和旋轉(zhuǎn)速度(弧度/秒)绎速。
從旋轉(zhuǎn)軸指定的方向看皮获,正值代表逆時(shí)針旋轉(zhuǎn)。
其余同上纹冤。
@property(nonatomic, readonly) BOOL isResting;
表示物體是否出于靜止?fàn)顟B(tài)洒宝。
默認(rèn)是NO。但是物體沒(méi)有動(dòng)萌京,并且沒(méi)有收到任何力雁歌。SceneKit
會(huì)自動(dòng)將值變成YES。
@property(nonatomic) BOOL allowsResting;
是否自動(dòng)將物體設(shè)置為“靜止”
物理模擬的物體越少知残,可以提升模擬的性能将宪。
設(shè)為YES,將提高模擬性能橡庞。
設(shè)為NO较坛,將提高準(zhǔn)確性。
這里涉及到了很多編程以外的物理知識(shí)扒最,需要徹底搞懂的話需要惡補(bǔ)物理先丑勤。笑cry。