×

[SceneKit]碰撞检测(六)

96
里脊糖醋
2017.07.23 14:55* 字数 1608

进行碰撞检测的前提是必须是两个物体之间才能进行碰撞, SceneKit 框架已经为我们准备好了物体引擎, 我们不需要关心他是怎么进行碰撞检测的, 只需要关心, 我们需要什么样的物理效果, 剩下的就交给物理引擎来完成.

在场景中, 我们需要的是小球与边框之间的碰撞, 然后, 当小球到达边缘之后, 在进行反弹, 然后继续运动.
默认情况下, 添加到场景中的节点都是不具备物理运动效果的. 我们需要添加.

ok, 首先我们先给小球添加物理效果, 如下图所示的内容添加


屏幕快照 2017-07-23 下午1.56.50.png

接下来看下每个设置选项的属性的含义, 以及该如何去设置

•Physics Body:确定物体的类型。将球的类型设置为动态体,这意味着场景套件物理引擎将完全控制球的运动。在[SceneKit]物理仿真模拟(二)中, 已经解释过了不同type的含义.
•Settings:允许您微调物理体的行为。对于球,将质量(Mass)和恢复原则(Restitution)设置为1, 清除所有其他物理设置,并取消选中受重力影响(Affected by gravity)并允许休息(Allows resting)。这将使球弹起自由而不受重力的束缚。
•Velocity:影响物理体的速度和方向。给球(x:5,y:0,z:5)的线速度。一旦场景开始运行,这将给球一个初始的力量。将线性因子设置为(x:1,y:0,z:1),这将使可能施加到y轴上的球的任何物理力消除,从而保持球固定在相同的y位置有什么关系。

关与给球(x:5,y:0,z:5)的线速度。一旦场景开始运行,这将给球一个初始的力量。的解释
首先, 我们是按照向量的来进项运算的, 小球的初始位置是(0,0,0), 这是一个三维的向量, 然后我们给小球一个终点的位置(5,0,5), 这也是一个向量, 然后两个向量相加, (0,0,0)+(5,0,5)=(5,0,5), 求出最后运动的位置, 此处正式用到了向量相加的物理意义
在物理上的意义:合向量的效果=几个分向量效果之合(力、位移、速度、加速度等)

Mass

指定物体以千克为单位的质量, 默认为1为动态的物体, 默认为0为静态的物体

Restitution

当一个物体运动时与某个物体发生碰撞进行反弹时, 理论上来说是会有一部分能量被消失掉的, 当他在进行反弹时, 速度会比刚运动时的速度小, 以此类推, 直到停止, Restitution值设置为1, 即代表, 每次进行反弹时, 其携带的能量和刚开始的能量是一样的, 并不会因为反弹而减少, 这样小球就能一直无止境的进行运动反弹下去了.

•Bit masks:用于稍后设置冲突。将“类别”掩码设置为1.它将一个位掩码值分配给球。此掩码用于创建冲突组并唯一标识某些节点。然后,物理引擎使用这些信息,然后根据这些掩码应用碰撞计算,以确定哪些对象相冲突,哪些对象不相关。
•物理形状:定义碰撞检测期间使用的物理实体的实际形状。将Shape设置为Sphere。

位掩码

一、碰撞掩码分为以下三种:

  1. CategoryBitmask:该掩码会与另一个物体的另外两个掩码ContactTestBitmask、CollisionBitmask按位与,来确定是否可以碰撞
  2. ContactTestBitmask:确定两个物体碰撞时是否调用碰撞检测的代理方法
  3. CollisionBitmask:确定两个物体是否允许碰撞

如果希望A和B允许碰撞,则
A的CategoryBitmask与B的CollisionBitmask与运算结果为0
B的CategoryBitmask与A的CollisionBitmask与运算结果为0
否则A和B就不允许碰撞,接触后直接弹开

如果希望A和B发生碰撞检测,即调用onContactBegin,则
A的CategoryBitmask与B的ContactTestBitmask与运算结果不为0
B的CategoryBitmask与A的ContactTestBitmask与运算结果不为0

OK, 小球的物体引擎效果添加完毕, 下面添加边框的物理引擎

首先全选Barriers, 此时选中的物理几何体都被标记成了黄色的框框


屏幕快照 2017-07-23 下午2.17.46.png

如下设置Barriers


屏幕快照 2017-07-23 下午2.18.21.png

•Physical Body:对于类型,将其设置为静态主体,以便障碍物不会移动,也不会随动作移动。
•Setting:清除所有设置并将恢复设置为1,使其在碰撞发生时不会损失能量。取消选中这两个复选框,以便障碍物也不受重力的影响。
•Bit masks:将类别掩码设置为2,将碰撞掩码设置为1.这样可以将类别位掩码设置为2,并将其设置为与类别位掩码为1的对象相冲突 - 与您给出的相同类别位掩码。
•Physics Shape:Shape设置为Default shape, Type为Bounding Box。因为两侧障碍是带有子节点的节点,所以该选项更为合适,因为边界框围绕该组内的所有子节点创建边界。如果你看场景编辑器,你会发现有一个红色的线框,它显示了当您运行游戏时物理机构的外观。

此时点击预览效果的按钮


屏幕快照 2017-07-23 下午2.42.12.png

你将会看到小球在运动


Jietu20170723-144920.gif

关与各个属性是什么意思, 我也没全部搞清楚, 也没找到具体的文档, 资料比较少, 苹果官方的文档写的并不是很清楚.

具体代码
SceneEditor是一个添加好物体控件, 未添加物理引擎的工程
SceneEditor_Collision_Detection是一个添加了碰撞检测的工程工程
https://github.com/JasonSparrow/SceneKit

SceneKit
Web note ad 1