Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 两个对象彼此不接触,但contactTestBeween()返回一个结果_Ios_Swift_Scenekit - Fatal编程技术网

Ios 两个对象彼此不接触,但contactTestBeween()返回一个结果

Ios 两个对象彼此不接触,但contactTestBeween()返回一个结果,ios,swift,scenekit,Ios,Swift,Scenekit,我有一个SceneKit场景,我试图检测两个物体何时相互接触。我有两个对象彼此靠近,但它们不接触。当我对这些对象进行接触测试时,函数contactTestBetween()返回一个接触点。为什么会这样 首先,我将对象彼此放置得更远。如果将对象彼此放置一定距离,contactTestBetween()不会返回值。好像有一个神奇的数字 其次,我对这两个对象之间的碰撞检测进行了相同的测试。类似地,如果将对象放置在彼此之间一定距离的下方,它们将开始移动。更有趣的是,碰撞检测的距离限制低于接触测试的距离限

我有一个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
来增强这一点-不确定它在这里是否有帮助),因此在某种程度上产生了一些副作用……感谢您的回答,但它没有回答我的问题。我相信琼是对的。谢谢你的回答,但它没有回答我的问题。我相信琼是对的。