[英]SceneKit: How to detect contact without collision
我正在尋找最好的方法(性能方面)來檢測兩個在SceneKit物理世界中不會發生碰撞(不互相反彈)的物體之間的接觸。
我看到SpriteKit有物理實體的contactTestBitMask
和collisionBitMask
,而SceneKit只有后者。 因此,當對象在SceneKit中有聯系時,必須有另一種首選方式來獲得通知。 我想在每個對象的每個幀中調用contactTestBetweenBody:andBody:options:
不是最好的方法嗎?
更新在iOS 9.0中,Apple已將contactTestBitMask
添加到SCNPhysicsBody
。 所以這個問題很快就會過時。
這個問題值得一個完整的教程。 簡而言之,每個物理主體都有一個categoryBitMask和collisionBitMask。
categoryBitMask這是表示正文的位。
collisionBitMask這是表示哪些實體與之碰撞的位。
默認情況下(當指定了physicsBody時),所有實體都會與kinematicBody異常碰撞,后者表現特殊。 物體不會與它發生碰撞。 但是不要混淆,它可以在手動移動時與其他物體碰撞(例如用手指拖動)。
如何處理!!!
分配您的身體,無論是靜態還是動態。 分配類別和碰撞掩碼。 如果面具匹配則會發生碰撞。 一個例子怎么樣!
這些身體相互碰撞
bodyA.physicsBody.categoryBitMask = 4;
bodyB.physicsBody.categoryBitMask = 8;
bodyA.physicsBody.collisionBitMask = 8;
bodyB.physicsBody.collisionBitMask = 4;
這些不會發生碰撞
bodyA.physicsBody.categoryBitMask = 4;
bodyB.physicsBody.categoryBitMask = 8;
bodyA.physicsBody.collisionBitMask = 0;
bodyB.physicsBody.collisionBitMask = 0;
注意到我使用2的冪類別。 這是因為contactDelegate使用按位AND進行比較。 如果您不理解,請按位閱讀。 這真的會有所幫助。
這些物體沒有物理碰撞
例子:你有一個穿過鬼魂的英雄,你想要知道它發生在沒有任何一個受影響的情況下。 比如互相反彈。
bodyA.physicsBody.categoryBitMask = 4;
bodyB.physicsBody.categoryBitMask = 8;
bodyA.physicsBody.collisionBitMask = 0;
bodyB.physicsBody.collisionBitMask = 0;
因此,下面的代碼被設計為bodyA(你的英雄)穿過bodyB(ghost)。
bodyB.physicsField.categoryBitMask = 4
注意到上面是physicsField.catagoryBitMask。 它被賦予一個4,以便它與bodyA匹配。
let collisionField = SCNPhysicsField.customFieldWithEvaluationBlock(){
(_, _, _, _, _) in
WHAT U WANT TO DO ON CONTACT
}
bodyB.physicsField = collisionField
不幸的是,physicsField不是幾何體的形狀。 如果將physicsField屬性usesEllipsoidalExtent設置為“true / yes”,則默認為其邊界框或球體/橢圓的形狀
可以使用physicsFields halfExtent屬性更改效果區域,如此...
bodyB.physicsField.halfExtent = SCNVector3Make(.5, .5, .5)
以上將把(2,2,2)大小的盒子的范圍擴展到(2.5,2.5,2.5)。
編輯 :如果他們仍然發生碰撞,請嘗試從bodyB中刪除物理體(這將從節點中刪除所有物理模擬)。 只要正確分配了類別和碰撞位掩碼,我認為這不會是一個問題。
這是我能找到的最好的方法。 在Apple文檔的支持下,所有編碼都來自我的腦海,所以可能不完全正確,但我希望這會有所幫助!
我發現最好的方法是將質量設置在一個運動體上,使另一個物體通過它。
sensorBox.physicsBody.mass = 0.00000000001; //超微小質量使其成為“傳感器”
不要忘記你的場景的物理世界可以稱之為“contactTestBetweenBody:andBody:withOptions ...這很有效。
[myScene.physicsWorld contactTestBetweenBody:(SCNPhysicsBody *) andBody:(SCNPhysicsBody *) options:(NSDictionary *)];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.