簡體   English   中英

SceneKit:如何檢測沒有碰撞的接觸

[英]SceneKit: How to detect contact without collision

我正在尋找最好的方法(性能方面)來檢測兩個在SceneKit物理世界中不會發生碰撞(不互相反彈)的物體之間的接觸。

我看到SpriteKit有物理實體的contactTestBitMaskcollisionBitMask ,而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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM