我试图模拟足球比赛。我有SCNPlane
来模拟球场。我导入了足球目标3d模型(.dae
文件)和球模型(.dae
)。
我的球有一个动态的物理身体,飞机静止,目标是运动学。我为每个SCNNode设置了categoryBitMask
和contactTestBitMask
。
当我将球射向球门时,有时球会弹跳并按预期运行,但有时候球会穿过球门并穿过球门。
我还指定了SCNPhysicsContactDelegate
并且当球再次反弹时触发了didBeginContact
,但是当球越过它时,则不会调用该方法。
你知道会发生什么吗?
谢谢!
答案 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
。