注:此文章翻译自Box2D v2.2.0用户手册,仅供学习参考。
4.1 关于
碰撞模块包括了形状以及操作形状的方法。模块也包括了动态树(dynamic tree)和broad-phase算法来提高大系统碰撞检测的速度。
碰撞模块的设计独立于动力学系统之外。例如,你可以在游戏中除了物理系统之外的其他方面单独使用动态树(dynamic tree)。
4.2 形状
形状描述了碰撞几何体,在物理模拟中可独立使用,你可以对形状进行多种操作。
b2Shape作为Box2D形状的基类,定义了如下方法:
判断一个点是否与形状重叠
向形状投射一条射线
计算形状的AABB
计算形状的质量属性
另外,每一个形状有一个类型成员和对应的半径。半径甚至会应用于多边形中,下面还将会对此进行讨论。
4.3 圆形(Circle Shapes)
圆形有坐标点和半径。
圆形是实心的。你不能够创建一个空心的圆形。即便如此,你还可以使用多边形形状来创建线段链。
b2CircleShape circle;
circle.m_p.Set(2.0f, 3.0f);
circle.m_radius = 0.5f;
4.4 多边形(Polygon Shapes)
多边形形状是实心凸多边形。所谓一个多边形为凸多边形,即多边形上所有线段中任意两个顶点间的连线都与此多边形的边无交点。多边形实心的,永远都不会是空心。一个多边形至少需要由3个或更多顶点组成。
你必须按照逆时针(counter clockwise winding,CCW)的方向创建一个多边形。对于这一点我们需要小心,逆时针是相对于右手坐标系统而言的,其中z轴指向平面外面。在你的屏幕上可能是顺时针方向,这取决于你的坐标系统是如何约定的。
虽然多边形的成员变量的访问权限是public,但是你仍然需要使用相应的初始化方法来创建一个多边形。初始化方法会创建法向量并验证其合法性。
你可以通过一个顶点数组来创建多边形。数组的最大值被b2_maxPolygonVertices所控制,它的默认值是8,这足以描述大多数凸多边形。
//This defines a triangle in CCW order.
b2Vec2 vertices[3];
vertices[0].Set(0.0f, 0.0);
vertices[1].Set(1.0f, 0.0f);
vertices[2].Set(0.0f, 1.0f);
int32 count = 3;
b2PolygonShape polygon;
polygon.Set(vertices, count);
多边形有一些定义好的创建盒子(boxes)的初始化方法。
void SetAsBox(float32 hx, float32 hy);
void SetAsBox(float32 hx, float32 hy, const v2Vec2& center, float32 angle);
多边形从b2Shape继承了半径。半径围绕多边形创建了一个外壳(skin)。在多边形重叠的情况下,外壳可以保持多边形之间短距离分离。这使得