关于BOX2D的那些事儿(6)

motorTorque或motorForce表示现在的扭矩或应力,Revolute Joint就是扭矩,因为他共用一个锚点,只能沿这锚点转动,而Prismatic Joint支持基于轴的移动,所以他是应力。

  motorSpeed表示的是把这应力或者扭距应用到刚体上的数值增减程度。(仅当参考,事实是你加大减少这个值会让游戏数值瞬间变化量变多或变少,理解就行)

  enableMotor是决定使用不使用Motor。

  enableLimit决定上下限(角度或者长度)是否有用。

  在SliderCrank这个例子中,先是定义了一个刚体,并用这个刚体和地面创建了一个Revolute Joint,这个Revolute Joint的motorTorque值设为一定值,让这个刚体持续转动,当然你的速度越快,转动就越快。这个刚体又用Revolute Joint连接了一个刚体,但这个Revolute Joint无效了motor,所以这个刚体只能靠其他刚体让他移动。又用Revolute Joint连接了活塞刚体,同样是无效了motor,之后创建了Prismatic Joint来连接你的活塞和地面,给定了应力,所以这个应力就使得上面掉下来的块上升。

  注意他的相关坐标设置。

  总结一下,这里真正提供动力的有两个东西,一个是活塞,他是给下面掉下来的块提供力量,另一个是最持续转动的刚体盒子,他供给活塞以及他上面的块能量。

  MotorsAndLimits这个例子同样很好理解,除了对motor的应用外,还使用了enableLimit值,这个值是用来做什么,上面说过了,是用来决定在JointDef中定义的相关上下限是否起效。

  试着改动相关数据对你理解更有效。

  十二、CollisionProcessing

  CollisionProcessing这个例子是有关于Contacts的使用。这个东西是Box2D用来在形状间检测碰撞的,有很多不同种类的 Contacts,比如说负责圆和圆碰撞的,负责圆和多边形碰撞的。这些其实你都没有必要去了解它,你只要会应用你最需要的就行了。

  这里你最起码需要了解的几个概念:

  Contact:就是用来管理碰撞的

  contact manifold:这个东西就是碰撞时候产生的,是一个由碰撞点组成的矢量线段。

  contact point:碰撞点

  在例子CollisionProcessing中的Step部分,先从世界的Contacts表里取出你需要的连接,然后取得contact manifold的数量,如果有连接,然后再做出相应的处理。

  b2Contact的结构:

  重要的属性:

  发生碰撞的两个形状

  b2Shape* m_shape1;

  b2Shape* m_shape2;

  contact manifold的数量

  int32 m_manifoldCount;

  组合摩擦力和弹性系数

  float32 m_friction;

  float32 m_restitution;

  重要的成员函数:

  取得相应的contact manifold

  virtual b2Manifold* GetManifolds() = 0;

  取得contact manifold数

  int32 GetManifoldCount() const

  取得下一个Contact

  b2Contact* GetNext();

  取得这个Contact的两个形状

  b2Shape* GetShape1();

  b2Shape* GetShape2();

你可能感兴趣的:(关于BOX2D的那些事儿(6))