关于BOX2D的那些事儿(2)

转自:http://hi.baidu.com/goodlad/blog/item/5df9bd2b439d01ece7cd40f6.html


AddShape(b2ShapeDef* shape)。

  上面这些东西,其实现在没有必要去记住,慢慢运用中就可以熟练掌握。

  源文件包里除了这个HelloWorld之外还有不少的例子,个人建议先从CompoundShapes开始。

  二、CompoundShapes

  CompoundShapes其实也没有做什么事情,相对于HelloWorld来说,我认为,仅仅是多了一个方法的应用,即是有关b2Mat22方阵和向量的相乘应用,这里被用来获得转换后的位置。

  这个例子对于看过HelloWorld的你来说,应该会很简单,只是建议看这个例子的时候再翻翻数学书,并复习一下使用到的几种数据类型说明。

  三、 VaryingRestitution、VaryingFriction、Pyramid、PolyShapes

  Box2D本身所自带的教程相当的少,前两个例程是关于摩擦力和弹性系数的例子,也仅仅修改了相关数据,算是一种演示吧,Pyramid这个例子也就是一个简单的例子,只是使用了Make方法来创建向量。没什么参考价值。

  PolyShapes这个例子举个自定义多边形形状的方法,你只要记住当前多边形最多支持顶点数为8就行了。

  四、 CollisionFiltering、

  碰撞过滤是用来防止形状与形状之间进行碰撞的,就像上文所示,它可以用碰撞种类和组名来区别,Box2D总共提供16种碰撞种类,每个形状都可以提定属于什么种类,那么它就可以和其他不同种类的形状碰撞,如果在一个多人在线游戏中,你想你的玩家在他们之间不进行碰撞,怪物和怪物之间不进行碰撞,但人和怪物进行碰撞,你可以使用

  playerShapeDef.categoryBits = 0x0002;

  monsterShapeDef.categoryBits = 0x0004;

  playerShape.maskBits = 0x0004;

  monsterShapeDef.maskBits = 0x0002;

  碰撞组索引是一个可以大量指定物体碰撞规则的东西,你可以通过它来指定成百上千的物体,当碰撞组索引为负数时,东西之间不碰撞,当为正数时进行碰撞,而且碰撞组索引的优先级比碰撞种类要高。

  shape1Def.groupIndex = 2;

  shape2Def.groupIndex = 2;

  shape3Def.groupIndex = -8;

  shape4Def.groupIndex = -8;

  形状1和2就碰撞,因为组索引大于0,而3和4不碰撞,因为小于0

  可以参考例子代码来确定你的碰撞方法.

  五、 ApplyForce

  应力的应用是物理引擎中必不可少的部分,你有刚体能碰撞却不能推动它,那么它必定会给你带来很强的挫败感。

  在这个教程中,主要是对刚体的几个方法进行了应用,这些方法都很简单易用。

  刚体有两个点对我们有用,一个是刚体的坐标点,另一个是刚体的质心位置。刚体的质心位置就不需要你自己指出,Box2D将会自己算出这个坐标。

  刚体有如下几个成员变量,

  uint32 m_flags;

  质心位置:

  b2Vec2 m_position;

  质心旋转度:

  float32 m_rotation;

  线性速度:

  b2Vec2 m_linearVelocity;

  角速度:

  float32 m_angularVelocity;

  力:

  b2Vec2 m_force;

  扭矩:

  float32 m_torque;

  形状表:

  b2Shape* m_shapeList;

  形状数:

  int32 m_shapeCount;

  关节表:

  b2JointNode* m_jointList;

  关节数:

  b2ContactNode* m_contactList;

  质量:

  float32 m_mass, m_invMass;

  float32 m_I, m_invI;

  线性阻尼:

  float32 m_linearDamping;

  角阻尼:

  float32 m_angularDamping;

  休眠时间

  float32 m_sleepTime;

  用户数据:

  void* m_userData;

  并有以下几种方法:

  1、设置刚体位置和旋转度

  void SetOriginPosition(const b2Vec2& position, float32 rotation);

  2、取刚体当前位置

  b2Vec2 GetOriginPosition() const;

  3、设置刚体的质心位置及旋转度

  void SetCenterPosition(const b2Vec2& position, float32 rotation);

  4、取得刚体的质心位置

  b2Vec2 GetCenterPosition() const;

  5、取得旋转度

  float32 GetRotation() const;

  6、取得旋转矩阵

  const b2Mat22& GetRotationMatrix() const;

  7、设置和取得质心的线性速度

  void SetLinearVelocity(const b2Vec2& v);

  b2Vec2 GetLinearVelocity() const;

  8、设置和取得角速度

  void SetAngularVelocity(float32 w);

  float32 GetAngularVelocity() const;

  9、应用一个力到世界点上

  void ApplyForce(const b2Vec2& force, const b2Vec2& point);

  force为力的大小,point为作用点

  10、应用一个扭矩

  void ApplyTorque(float32 torque);

  11、在点上应用一个推力

  void ApplyImpulse(const b2Vec2& impulse, const b2Vec2& point);

  12、取得质量

  float32 GetMass() const;

  13、取得惯性

  float32 GetInertia() const;

  14、取得世界点(取得给定相对于质心的点的世界坐标)

  b2Vec2 GetWorldPoint(const b2Vec2& localPoint);

  15、根据届出当前坐标系给的向量来得到世界向量

  b2Vec2 GetWorldVector(const b2Vec2& localVector);

  16、根据给定世界坐标来得到相对于质心的坐标


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值