gpt4 book ai didi

ios - SceneKit – SCNPhysics Body 与 SCNPhysicsShape 不匹配

转载 作者:搜寻专家 更新时间:2023-10-30 23:07:07 24 4
gpt4 key购买 nike

我有一个非常简单的场景:一个带有动态物理体的立方体和一个带有静态物理体的平面。当立方体掉落并撞到地面时,两个物体之间有一个可见的缝隙,你可以看到这个的视频here :

我已经尝试了 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 文件 ( attached here ) 并应用了所有缩放/转换 as per this question , 但结果相同。

我想我在这里遗漏了一些明显的东西,有什么想法吗?

最佳答案

@Toyos 对 filing a bug 的评论是个好主意。但是,在这种情况下最好不要依赖默认的凸包生成。

TLDR:尽可能使用原始参数化实体(或它们的复合体)作为物理形状。

当您从自定义几何体(即从 DAE 加载)生成物理形状时,SceneKit 必须构建一个复杂的数据结构来描述该几何体的凸包,并且它必须通过该数据结构来执行碰撞检测每个渲染帧(即每秒最多 60 次)。

当您改为使用其中一种内置参数化形状(SCNBoxSCNSphere 等)时,您向 SceneKit 发出信号,它可以使用该形状的理想化表示形状而不是基于其多边形网格的复杂数据结构。

举一个极端的例子,考虑一个球体:渲染一个好看的球体需要 a lot of polygons .如果将这样的网格输入碰撞检测算法,它要么陷入顶点数据的复杂性,要​​么必须生成不太复杂但不太准确的形状近似值(例如,十二面体)。另一方面,球体是用于碰撞检测的最简单的形状——要确定给定点是否在球体内,您需要做的就是获取从该点到球体中心的距离,并查看它是否小于半径. (做对了,您甚至不必担心 sqrt 的成本。)

关于ios - SceneKit – SCNPhysics Body 与 SCNPhysicsShape 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26834554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com