[英]SceneKit – SCNPhysics Body doesn't match SCNPhysicsShape
我有一個非常簡單的場景:一個帶有動態物理體的立方體和一個帶有靜態物理體的平面。 當立方體掉落並撞到地面時,兩個物體之間會出現明顯的間隙,您可以在此處觀看視頻:
我已經嘗試了SCNPhysicsShapeTypeKey
的所有不同組合,並嘗試將 SCNPhysicsBody 的形狀也設置為 nil(文檔說: “離開這個 nil 將讓系統決定並使用最有效的邊界表示” )但沒有什么能夠消除差距。
// ...
// plane physics
var body = SCNPhysicsBody(type: SCNPhysicsBodyType.Static, shape: SCNPhysicsShape(geometry: result.node!.geometry!, options: [SCNPhysicsShapeTypeKey:SCNPhysicsShapeTypeConvexHull]));
result.node!.physicsBody = body;
} else {
// cube physics
var body = SCNPhysicsBody(type: SCNPhysicsBodyType.Dynamic, shape: SCNPhysicsShape(node: result.node!, options: [SCNPhysicsShapeTypeKey:SCNPhysicsShapeTypeConvexHull]));
result.node!.physicsBody = body;
}
我檢查了我的 dae 文件( 附在此處)並根據這個問題應用了所有比例/變換,但是結果相同。
我想我在這里遺漏了一些明顯的東西,有什么想法嗎?
@Toyos關於提交錯誤的評論是一個好主意。 但是,在這種情況下,最好不要依賴默認的凸包生成。
當您從自定義幾何圖形生成物理形狀(即從DAE加載)時,SceneKit必須構建一個復雜的數據結構來描述該幾何圖形的凸包,並且必須遍歷該數據結構以對每個渲染幀執行碰撞檢測(即每秒最多60次)。
相反,當您使用內置參數形狀之一( SCNBox
, SCNSphere
等)時,您會向SceneKit發出信號,告知它可以使用該形狀的理想表示形式,而不是基於其多邊形網格的復雜數據結構。
舉一個極端的例子,考慮一個球體:渲染一個看起來不錯的球體需要很多多邊形 。 如果將這樣的網格輸入到碰撞檢測算法中,要么陷入頂點數據的復雜性中,要么必須生成不太復雜但精度較低的形狀近似值(例如十二面體)。 另一方面,球體是檢測碰撞最簡單的形狀-要確定給定點是否在球體內,您需要做的就是獲取從該點到球體中心的距離,並查看其是否小於半徑。 (做對了,您甚至不必擔心sqrt
的費用。)
您應該為
SCNPhysicsShape.Option.collisionMargin<\/code>設置
0.0<\/code> 。
result.node!.physicsBody = SCNPhysicsBody(
type: .dynamic,
shape: SCNPhysicsShape(
node: result.node!,
options: [
.collisionMargin: 0.0,
.type: SCNPhysicsShape.ShapeType.convexHull
]
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.