什么是Arbiter
在《Nape刚体碰撞检测》一节中学习InteractionCallback时,我们曾提到过Arbiter类,很显然这个单词我们不认识,更说不上知道它是干嘛的了。那它的作用到底是什么呢?拉登大叔告诉你。
Nape中的Arbiter类似于Box2D中的b2Contact类,用来存储碰撞时的碰撞对象、碰到点、碰撞冲量等信息。同样的,我们无需手动创建Arbiter对象,Npae会在碰撞时自动创建Arbiter对象,并将上面提到的碰撞信息保存到这个对象中。
一个Arbiter对象中包含的碰撞信息包括:
- body1:Body:碰撞时的第1个刚体,与shape1.body一致。
- body2:Body:碰撞时的第2个刚体,与shape2.body一致
- collisionArbiter:CollisionArbiter:保存了具体的碰撞信息的一个CollisionArbiter对象,这些信息包括:
- fluidArbiter:FluidArbiter:如果碰撞刚体中包含浮力刚体,则可以通过该属性获取浮力碰撞相关的信息,包括:
- buoyancyImpulse():浮力冲量,和dragImpulse():流体阻力冲量
- isSleeping : Bool:当前Arbiter对象是否处在睡眠状态
- shape1:Shape:碰撞时的第1个刚体形状。该shape对象与InteractionListener中设定的options1没有任何关系,而是取shape1.id < shape2.id的规则来保存。id的大小与形状创建的先后顺序有关
- shape2:Shape:碰撞时的第2个刚体形状。
接下来更为详细的信息保存在了CollisionArbiter中
CollisionArbiter
- dynamicFriction、staticFriction、rollingFriction:运动摩擦系数、静止摩擦系数和旋转摩擦系数
- elasticity:碰撞时的弹性系数
- referenceEdge1:碰撞时参与碰撞的边,如果是圆形刚体碰撞,则返回null。
- referenceEdge2:碰撞时参与碰撞的边,如果是圆形刚体碰撞,则返回null。
- contacts:碰撞点。
- normal:碰撞边的法向量,始终由shape1指向shape2
- normalImpulse():沿normal方向的碰撞冲量
- tangentImpulse():沿水平方向的碰撞冲量
- rollingImpulse():因摩擦使刚体旋转的冲量值
点击下面的图片,可以动态的查看arbiter的相关属性。其中,红色形状表示body1/shape1,蓝色形状表示body2/shape2,形状内的绘制的线条,表示形状碰撞时对应的referenceEdge。绿色线条表示normal,红色圆圈表示碰撞点位置。
联系作者
多谢拉登大叔
这个在什么地方会应用得到呢?
很多啊,比如在碰撞位置添加爆炸特效,比如在碰撞时获取碰撞的两个缸体,比如碰撞过程中获取碰撞冲量,来决定是否要摧毁被碰撞的刚体(小鸟和猪的碰撞)等等,具体要看你实际的使用需求啦!