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表示是否在两个刚体之间检查碰撞。
-
-
-
-
- 关于BOX2D的那些事儿(2)
- 下一篇:关于BOX2D的那些事儿(4)