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();