Ios 两个对象彼此不接触,但contactTestBeween()返回一个结果
我有一个SceneKit场景,我试图检测两个物体何时相互接触。我有两个对象彼此靠近,但它们不接触。当我对这些对象进行接触测试时,函数contactTestBetween()返回一个接触点。为什么会这样 首先,我将对象彼此放置得更远。如果将对象彼此放置一定距离,contactTestBetween()不会返回值。好像有一个神奇的数字 其次,我对这两个对象之间的碰撞检测进行了相同的测试。类似地,如果将对象放置在彼此之间一定距离的下方,它们将开始移动。更有趣的是,碰撞检测的距离限制低于接触测试的距离限制Ios 两个对象彼此不接触,但contactTestBeween()返回一个结果,ios,swift,scenekit,Ios,Swift,Scenekit,我有一个SceneKit场景,我试图检测两个物体何时相互接触。我有两个对象彼此靠近,但它们不接触。当我对这些对象进行接触测试时,函数contactTestBetween()返回一个接触点。为什么会这样 首先,我将对象彼此放置得更远。如果将对象彼此放置一定距离,contactTestBetween()不会返回值。好像有一个神奇的数字 其次,我对这两个对象之间的碰撞检测进行了相同的测试。类似地,如果将对象放置在彼此之间一定距离的下方,它们将开始移动。更有趣的是,碰撞检测的距离限制低于接触测试的距离限
scnView.debugOptions = .showPhysicsShapes
这是开着的,所以我可以看到物理形状有多大
box!.physicsBody = SCNPhysicsBody(type: .dynamic,
shape: SCNPhysicsShape(
geometry: box!.geometry!,
options: [SCNPhysicsShape.Option.type:
SCNPhysicsShape.ShapeType.boundingBox]))
box2!.physicsBody = SCNPhysicsBody(type: .dynamic,
shape: SCNPhysicsShape(
geometry: box2!.geometry!,
options: [SCNPhysicsShape.Option.type:
SCNPhysicsShape.ShapeType.boundingBox]))
box!.physicsBody!.isAffectedByGravity = false
box2!.physicsBody!.isAffectedByGravity = false
box!.physicsBody!.categoryBitMask = 2
box2!.physicsBody!.categoryBitMask = 4
box!.physicsBody!.contactTestBitMask = 4
box2!.physicsBody!.contactTestBitMask = 2
上面是我用来为对象创建物理实体的代码
let contactResult = scnView.scene?.physicsWorld.contactTestBetween(box!.physicsBody!, box2!.physicsBody!)
这就是我如何在对象之间进行接触测试的方法
let contactResult = scnView.scene?.physicsWorld.contactTestBetween(box!.physicsBody!, box2!.physicsBody!)
以下是模拟器的屏幕截图:
我不明白为什么会这样。非常感谢你的帮助 以下是关于
contactTestBetween(::options:)
实例方法的文档说明:
SceneKit仅当其碰撞位掩码
和类别位掩码属性重叠的实体之间发生碰撞时,才向物理世界的contactDelegate对象发送消息,并且仅当某些类型的实体之间发生碰撞时才会发送消息。(有关详细信息,请参阅。)使用此方法在您选择的时间直接测试任意两个实体之间的接触。例如,要实现一个玩家角色可以拾取物品的游戏,可以在玩家按下“拾取”按钮时调用此方法,以查看玩家角色是否与要拾取的物品接触
但是这两个对象的.categoryBitMask
和contactTestBitMask
是不同的
两者都是什么
还有一件事:
对于包含自定义几何图形的节点,它自动创建的物理图形场景是几何图形的粗略近似。这种近似,或凸包
,在碰撞检测的准确性和性能之间提供了折衷
为了获得最佳碰撞检测性能,请基于基本几何体类(SCNBox
,SCNSphere
,SCNPyramid
,SCNCone
,SCNCylinder
,或SCNCapsule
)创建SCNP物理形状实例
希望这能有所帮助。以下是文档中关于
contactTestBetween(\u:\ u:options:)
实例方法的说明:
SceneKit仅当其碰撞位掩码
和类别位掩码属性重叠的实体之间发生碰撞时,才向物理世界的contactDelegate对象发送消息,并且仅当某些类型的实体之间发生碰撞时才会发送消息。(有关详细信息,请参阅。)使用此方法在您选择的时间直接测试任意两个实体之间的接触。例如,要实现一个玩家角色可以拾取物品的游戏,可以在玩家按下“拾取”按钮时调用此方法,以查看玩家角色是否与要拾取的物品接触
但是这两个对象的.categoryBitMask
和contactTestBitMask
是不同的
两者都是什么
还有一件事:
对于包含自定义几何图形的节点,它自动创建的物理图形场景是几何图形的粗略近似。这种近似,或凸包
,在碰撞检测的准确性和性能之间提供了折衷
为了获得最佳碰撞检测性能,请基于基本几何体类(SCNBox
,SCNSphere
,SCNPyramid
,SCNCone
,SCNCylinder
,或SCNCapsule
)创建SCNP物理形状实例
希望这有帮助。物体是否在移动?我怀疑接触检测是“真实”接触的近似值(请记住,存在
使用PreciseCollisionDetection
来增强这一点-不确定它在这里是否有帮助),从而以某种方式产生一些次要效果……物体是否在移动?我怀疑接触检测是“真实”接触的近似值(请记住,存在使用PreciseCollisionDetection
来增强这一点-不确定它在这里是否有帮助),因此在某种程度上产生了一些副作用……感谢您的回答,但它没有回答我的问题。我相信琼是对的。谢谢你的回答,但它没有回答我的问题。我相信琼是对的。