【问题标题】:SceneKit collision occasionally failsSceneKit 碰撞偶尔会失败
【发布时间】:2018-04-09 12:01:30
【问题描述】:

我正在尝试模拟一场足球比赛。我有一个模拟球场的SCNPlane。我已经导入了一个足球球门 3d 模型(.dae 文件)和一个球模型(.dae)。

我的球有一个动态的物理体,平面是静态的,目标是运动的。我为每个 SCNNode 设置了 categoryBitMaskcontactTestBitMask

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

我还分配了SCNPhysicsContactDelegate,当球弹回球门时触发didBeginContact,但当球越过球门时,不会调用该方法。

你知道会发生什么吗?

谢谢!

【问题讨论】:

    标签: ios swift scenekit game-physics


    【解决方案1】:

    可能是球移动太快导致物理引擎无法正确计算的问题。尝试更改“timeStep”值:

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

    【讨论】:

      【解决方案2】:

      Instance 属性 categoryBitMask 定义物理体属于哪些类别,contactTestBitMask 定义哪些类别的物体会导致与此物理体的交叉通知。

      您需要一个 collisionBitMask 实例属性来定义哪些类别的物理体可以与此物理体发生碰撞

      var collisionBitMask: Int { get set }
      

      当两个物理体相互接触时,可能会发生碰撞。 SceneKit 通过执行按位与运算将身体的碰撞掩码与其他身体的类别掩码进行比较。如果结果是一个非零值,那么身体会受到碰撞的影响。每个身体独立地选择它是否想受到另一个身体的影响。例如,您可以选择避免碰撞计算,因为这种计算对身体速度的影响可以忽略不计。 默认值为all(一个位掩码,其每一位都被启用),指定body将与所有其他类别的body碰撞。

      static var all: SCNPhysicsCollisionCategory { get }
      

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

      【讨论】:

        猜你喜欢
        • 2018-08-08
        • 1970-01-01
        • 1970-01-01
        • 2020-08-08
        • 1970-01-01
        • 2023-04-09
        • 2019-07-16
        • 1970-01-01
        相关资源
        最近更新 更多