簡體   English   中英

SceneKit – SCNPhysics 主體與 SCNPhysicsShape 不匹配

[英]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關於提交錯誤的評論是一個好主意。 但是,在這種情況下,最好不要依賴默認的凸包生成。

TLDR:盡可能將原始參數化實體(或它們的化合物)用於物理形狀。

當您從自定義幾何圖形生成物理形狀(即從DAE加載)時,SceneKit必須構建一個復雜的數據結構來描述該幾何圖形的凸包,並且必須遍歷該數據結構以對每個渲染幀執行碰撞檢測(即每秒最多60次)。

相反,當您使用內置參數形狀之一( SCNBoxSCNSphere等)時,您會向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.

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