SceneKit碰撞偶尔会失败

时间:2017-10-27 19:57:27

标签: ios swift scenekit game-physics

我试图模拟足球比赛。我有SCNPlane来模拟球场。我导入了足球目标3d模型(.dae文件)和球模型(.dae)。

我的球有一个动态的物理身体,飞机静止,目标是运动学。我为每个SCNNode设置了categoryBitMaskcontactTestBitMask

当我将球射向球门时,有时球会弹跳并按预期运行,但有时候球会穿过球门并穿过球门。

我还指定了SCNPhysicsContactDelegate并且当球再次反弹时触发了didBeginContact,但是当球越过它时,则不会调用该方法。

你知道会发生什么吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

球移动速度过快,可能导致物理引擎无法正确计算。尝试更改“ timeStep”值:

  

SceneKit处理物理模拟并更新所有状态   该属性指定的时间间隔内一次的物理物体。   默认值为1/60秒(60 Hz的速率)。更快   仿真速率可提高仿真结果的准确性,例如   快速移动的对象之间发生碰撞—但CPU成本较高   时间(可能反过来会降低您应用的渲染帧速率)。   通常,您应该设置此属性以匹配目标渲染   帧速率(由帧速率的preferredFramesPerSecond属性定义   SCNView对象呈现场景)。   https://developer.apple.com/documentation/scenekit/scnphysicsworld/1512881-timestep

答案 1 :(得分:0)

实例属性categoryBitMask定义了物理物体所属的类别,contactTestBitMask定义了哪些物体类别导致与此物理物体发生相交通知。

您需要一个collisionBitMask实例属性,该属性定义可以与该物理物体碰撞的物理物体类别

var collisionBitMask: Int { get set }
  

当两个物理物体相互接触时,可能会发生碰撞。 SceneKit通过执行按位与运算,将人体的碰撞蒙版与其他人体的类别蒙版进行比较。如果结果为非零值,则身体受碰撞影响。每个机构独立选择是否要受到另一个机构的影响。例如,您可能选择避免进行碰撞计算,以免对物体的速度造成微不足道的变化。   默认值为all(启用了每个位的位掩码),指定该主体将与所有其他类别的主体发生碰撞。

static var all: SCNPhysicsCollisionCategory { get }
  

all是物理实体的Type Property属性的默认collisionBitMask

相关问题