关于BOX2D的那些事儿(3)

http://hi.baidu.com/goodlad/blog/item/7cf24927804dc315908f9df2.html


b2Vec2 GetLocalPoint(const b2Vec2& worldPoint);

  17、根据一个世界向量来取得一个此时的向量

  b2Vec2 GetLocalVector(const b2Vec2& worldVector);

  18、判断刚体是否静止

  bool IsStatic() const;

  19、判断刚体是否冷冻

  bool IsFrozen() const;

  20、判断刚体是否休眠

  bool IsSleeping() const;

  21、你可以用它来单独设置这个刚体是否可以休眠

  void AllowSleeping(bool flag);

  22、唤醒这个刚体

  void WakeUp();

  23、取得附加在这个刚体上的形状表

  b2Shape* GetShapeList();

  24、取得附加在这个刚体上的联系表

  b2ContactNode* GetContactList();

  25、取得附加在这个刚体上的所有关节表

  b2JointNode* GetJointList();

  26、取得这个刚体在世界刚体表中的下一刚体

  b2Body* GetNext();

  27、取得用户数据

  void* GetUserData();

  void SynchronizeShapes();

  void QuickSyncShapes();

  // This is used to prevent connected bodies from colliding.

  // It may lie, depending on the collideConnected flag.

  bool IsConnected(const b2Body* other) const;

  // This is called when the child shape has no proxy.

  void Freeze();

  标记

  enum

  {

  e_staticFlag = 0x0001,

  e_frozenFlag = 0x0002,

  e_islandFlag = 0x0004,

  e_sleepFlag = 0x0008,

  e_allowSleepFlag = 0x0010,

  e_destroyFlag = 0x0020,

  };

  虽然说刚体这个类的很多成员变量没有私有化,但是还是建议你使用它的众多方法来管理。

  在进行力学应用的时候,经常会需要相关转换坐标,所以建议找找相关书看看。

  六、 Web

  在开始之前,我们先来回顾一下以前所讨论过的形状,刚体,在这里我们来看看使用他们有什么值得注意的地方。

  1、关于多边形形状定义,我们由b2_maxPolyVertices决定了最大顶点数为8,如果你想要更多的多边形,那么我可以在 b2Setting.h里面修改相关数值。你在使用多边形时,一定要指定顶点数,而且顶点坐标得按逆时针顺序(CCW),你不能交叠任何的顶点,多边形会自动帮你闭合,同时这个多边形得凸起的,也就是说你必须让每个顶点都向外扩展一定角度,以上几点很重要,不要因此引起许多莫名其妙的错误。

  2、关于摩擦力和弹性系数,摩擦力与应力是成比例关系,它介出0和1之间,0表示无摩擦,1表示摩擦力很强,如果有两个形状都定义了摩擦力,那么它实际摩擦力将会是两个摩擦力的乘积开根。

  3、弹性系数让物体能够弹起来,值也介于0与1之间,如果一个球掉到桌面上来,这个值是0的时候则不会弹起来,如果是1的话那么就叫完全弹性碰撞,如果刚体中有两个形状都有不同的弹性系数,那么使用这个方法:

  float32 restitution;

  restitution = b2Max(shape1->restitution, shape2->restitution);

  4、关于碰撞过滤,有三种情况下是附加影响碰撞的,静态物体之间形状不发生碰撞,同一个刚体中的形状不发生碰撞,你能设置的在关节连接的两个物体形状间是否发生碰撞。

  5、关于创建和销毁一个形状,你没有必要去讨论形状的创建和销毁,Box2D会帮你自动完成。

  6、每一刚体添加形状是由参数b2_maxShapesPerBody来控制的,目前最大设为64,如果你想要更大的话,那么你修改b2Setting.h里面相关数值。

  7、关于刚体创建与销毁,你不需要手动为一个刚体分配和释放内存,这些都由引擎自动完成,所以你创建的时候,你仅仅需要:

  b2Body* body = myWorld->CreateBody(&bodyDef);

  销毁的时候:

  myWorld->DestroyBody(body);

  body = NULL;

  8、当刚体被销毁时,附加在上面的关节都会自动销毁,你必须清空这些关节指针,不然你的程序会在你以后销毁关卡的时候死得很难看。为了帮助你清空你的关卡指针,Box2D提供一个叫作b2WorldListener的监听类,你可以应用它来清空,之后世界就会告诉你到一个关节被销毁。

  9、唤醒一个休眠物体你只能用b2Body::WakeUp,在它上面应用任何力是不可以唤醒一个刚体的。

  10、要擅于利用刚体的转换函数,它会帮我们解决很多问题。

  11、在Debug模式下,最好能利用下列代码把形状显示出来,帮助我们调试。

  for (b2Shape* s = body->GetShapeList(); s; s = s->GetNext())

  {

  GameDrawShape(s);

  }

  12、Box2D里面所说的角度都是指弧度。

  正文

  在这一教程开始之前,先来讨论关节。

  关节(Joint)其实就是用来连接刚体的,你可以想像一下你的手。每一个关节也有一个关节定义b2JointDef,所有关节都连接在两个不同的刚体之间,一个可能是静态,如果你想浪费内存的话,就创建一个连在两个静态刚体上吧。

  关节是物体引擎中的另一重要部分,所以Box2D中把它作了细分,我们目前暂时先讨论在这个例程中使用的Distance关节。

  先来看b2JointDef的结构:

  struct b2JointDef

  {

  b2JointType type;

  void* userData;

  b2Body* body1;

  b2Body* body2;

  bool collideConnected;

  };

  Type表示为类别e_unknownJoint、 e_revoluteJoint、e_prismaticJoint、 e_distanceJoint、 e_pulleyJoint、 e_mouseJoint、 e_gearJoint。Userdata是用户数据,body1、body2为两个刚体指针,collideConnected表示是否在两个刚体之间检查碰撞。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值