关于BOX2D的那些事儿(3)

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


[html]  view plain copy print ?
  1. b2Vec2 GetLocalPoint(const b2Vec2& worldPoint);  
  2.   
  3.   17、根据一个世界向量来取得一个此时的向量  
  4.   
  5.   b2Vec2 GetLocalVector(const b2Vec2& worldVector);  
  6.   
  7.   18、判断刚体是否静止  
  8.   
  9.   bool IsStatic() const;  
  10.   
  11.   19、判断刚体是否冷冻  
  12.   
  13.   bool IsFrozen() const;  
  14.   
  15.   20、判断刚体是否休眠  
  16.   
  17.   bool IsSleeping() const;  
  18.   
  19.   21、你可以用它来单独设置这个刚体是否可以休眠  
  20.   
  21.   void AllowSleeping(bool flag);  
  22.   
  23.   22、唤醒这个刚体  
  24.   
  25.   void WakeUp();  
  26.   
  27.   23、取得附加在这个刚体上的形状表  
  28.   
  29.   b2Shape* GetShapeList();  
  30.   
  31.   24、取得附加在这个刚体上的联系表  
  32.   
  33.   b2ContactNode* GetContactList();  
  34.   
  35.   25、取得附加在这个刚体上的所有关节表  
  36.   
  37.   b2JointNode* GetJointList();  
  38.   
  39.   26、取得这个刚体在世界刚体表中的下一刚体  
  40.   
  41.   b2Body* GetNext();  
  42.   
  43.   27、取得用户数据  
  44.   
  45.   void* GetUserData();  
  46.   
  47.   void SynchronizeShapes();  
  48.   
  49.   void QuickSyncShapes();  
  50.   
  51.   // This is used to prevent connected bodies from colliding.  
  52.   
  53.   // It may lie, depending on the collideConnected flag.  
  54.   
  55.   bool IsConnected(const b2Body* other) const;  
  56.   
  57.   // This is called when the child shape has no proxy.  
  58.   
  59.   void Freeze();  
  60.   
  61.   标记  
  62.   
  63.   enum  
  64.   
  65.   {  
  66.   
  67.   e_staticFlag = 0x0001,  
  68.   
  69.   e_frozenFlag = 0x0002,  
  70.   
  71.   e_islandFlag = 0x0004,  
  72.   
  73.   e_sleepFlag = 0x0008,  
  74.   
  75.   e_allowSleepFlag = 0x0010,  
  76.   
  77.   e_destroyFlag = 0x0020,  
  78.   
  79.   };  
  80.   
  81.   虽然说刚体这个类的很多成员变量没有私有化,但是还是建议你使用它的众多方法来管理。  
  82.   
  83.   在进行力学应用的时候,经常会需要相关转换坐标,所以建议找找相关书看看。  
  84.   
  85.   六、 Web  
  86.   
  87.   在开始之前,我们先来回顾一下以前所讨论过的形状,刚体,在这里我们来看看使用他们有什么值得注意的地方。  
  88.   
  89.   1、关于多边形形状定义,我们由b2_maxPolyVertices决定了最大顶点数为8,如果你想要更多的多边形,那么我可以在 b2Setting.h里面修改相关数值。你在使用多边形时,一定要指定顶点数,而且顶点坐标得按逆时针顺序(CCW),你不能交叠任何的顶点,多边形会自动帮你闭合,同时这个多边形得凸起的,也就是说你必须让每个顶点都向外扩展一定角度,以上几点很重要,不要因此引起许多莫名其妙的错误。  
  90.   
  91.   2、关于摩擦力和弹性系数,摩擦力与应力是成比例关系,它介出0和1之间,0表示无摩擦,1表示摩擦力很强,如果有两个形状都定义了摩擦力,那么它实际摩擦力将会是两个摩擦力的乘积开根。  
  92.   
  93.   3、弹性系数让物体能够弹起来,值也介于0与1之间,如果一个球掉到桌面上来,这个值是0的时候则不会弹起来,如果是1的话那么就叫完全弹性碰撞,如果刚体中有两个形状都有不同的弹性系数,那么使用这个方法:  
  94.   
  95.   float32 restitution;  
  96.   
  97.   restitution = b2Max(shape1->restitution, shape2->restitution);  
  98.   
  99.   4、关于碰撞过滤,有三种情况下是附加影响碰撞的,静态物体之间形状不发生碰撞,同一个刚体中的形状不发生碰撞,你能设置的在关节连接的两个物体形状间是否发生碰撞。  
  100.   
  101.   5、关于创建和销毁一个形状,你没有必要去讨论形状的创建和销毁,Box2D会帮你自动完成。  
  102.   
  103.   6、每一刚体添加形状是由参数b2_maxShapesPerBody来控制的,目前最大设为64,如果你想要更大的话,那么你修改b2Setting.h里面相关数值。  
  104.   
  105.   7、关于刚体创建与销毁,你不需要手动为一个刚体分配和释放内存,这些都由引擎自动完成,所以你创建的时候,你仅仅需要:  
  106.   
  107.   b2Body* body = myWorld->CreateBody(&bodyDef);  
  108.   
  109.   销毁的时候:  
  110.   
  111.   myWorld->DestroyBody(body);  
  112.   
  113.   body = NULL;  
  114.   
  115.   8、当刚体被销毁时,附加在上面的关节都会自动销毁,你必须清空这些关节指针,不然你的程序会在你以后销毁关卡的时候死得很难看。为了帮助你清空你的关卡指针,Box2D提供一个叫作b2WorldListener的监听类,你可以应用它来清空,之后世界就会告诉你到一个关节被销毁。  
  116.   
  117.   9、唤醒一个休眠物体你只能用b2Body::WakeUp,在它上面应用任何力是不可以唤醒一个刚体的。  
  118.   
  119.   10、要擅于利用刚体的转换函数,它会帮我们解决很多问题。  
  120.   
  121.   11、在Debug模式下,最好能利用下列代码把形状显示出来,帮助我们调试。  
  122.   
  123.   for (b2Shape* s = body->GetShapeList(); s; s = s->GetNext())  
  124.   
  125.   {  
  126.   
  127.   GameDrawShape(s);  
  128.   
  129.   }  
  130.   
  131.   12、Box2D里面所说的角度都是指弧度。  
  132.   
  133.   正文  
  134.   
  135.   在这一教程开始之前,先来讨论关节。  
  136.   
  137.   关节(Joint)其实就是用来连接刚体的,你可以想像一下你的手。每一个关节也有一个关节定义b2JointDef,所有关节都连接在两个不同的刚体之间,一个可能是静态,如果你想浪费内存的话,就创建一个连在两个静态刚体上吧。  
  138.   
  139.   关节是物体引擎中的另一重要部分,所以Box2D中把它作了细分,我们目前暂时先讨论在这个例程中使用的Distance关节。  
  140.   
  141.   先来看b2JointDef的结构:  
  142.   
  143.   struct b2JointDef  
  144.   
  145.   {  
  146.   
  147.   b2JointType type;  
  148.   
  149.   void* userData;  
  150.   
  151.   b2Body* body1;  
  152.   
  153.   b2Body* body2;  
  154.   
  155.   bool collideConnected;  
  156.   
  157.   };  
  158.   
  159.   Type表示为类别e_unknownJoint、 e_revoluteJoint、e_prismaticJoint、 e_distanceJoint、 e_pulleyJoint、 e_mouseJoint、 e_gearJoint。Userdata是用户数据,body1、body2为两个刚体指针,collideConnected表示是否在两个刚体之间检查碰撞。  




  160. 上一篇:关于BOX2D的那些事儿(2)
  161. 下一篇:关于BOX2D的那些事儿(4)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值