0
点赞
收藏
分享

微信扫一扫

关于box2D多边形形状


用过cocos2d的朋友大家一定都知道box2D这么一个物理引擎。用过box2D的同学也一定知道box2D中有一个物体形状的东西。下边大家听我说一下这个box2D中形状相关的一点东西吧。


box2D在使用之前都要先建一个世界对象的实例。而这个世界对象实例主要有两个参数,一个是重力失量,一个是物体是否眠。

有了这个世界之后,我们才可以通过这世界来创建世界中要模拟的物体。当然了,创建物体之前一定要先定义一下自已要创建的物体了。定义好了之后,把自已的物体定义当参数传给世界,世界便会创建一个物体了。这个时候物体其实只有一个世界坐标,别的什么参数也没有。

没有形状,我们也看不到物体,物体没有形状,自然物体就不能相互作用了。所以接着就是我们今天要聊的主题了----形状!

如果有人用过形状定义数组,一定知道,box2D中定义的多边形形状要求必须是凸多边形的。

什么,你不知道什么是凸多边形什么是凹多形边,好吧,我释一下。

1.多边形基础知识

凸多边形的性质:

1.凸多边形的内角均小于180°,边数为n(n为整数且n大于2)的凸多边形内角和为(n-2)×180°,但任意凸多边形外角和均为360°,并可通过反证法证明凸多边形内角中锐角的个数不能多于3个。
2.凸多边形所有对角线都在内部,边数为n的凸多边形对角线条数为n(n-3)/2,其中通过任一顶点可与其余n-3个顶点连对角线。
相对应的,凹多边形,自然就是会有一个内角大于180°多边形了。





图1 多边形ABCDEF是一个凸多边形。




图2 多边形ABCDEF是一个凹多边形 


 这回很明显了吧,图1所有的内角都小于180,而图二中的角AFE是大于180度的。


 


2.box2D中的多边形


好了,多边形的基础知道我们讲完了,下边我就来讲一下为什么在box2D会要求所有的box2D定义形状必须是凸多边形了。


这个东西要说起来,可能就要扯上OpenGL了,等等,先不要怕,OpenGL其实也是一个纸老虎。听着这名字,妈呀很吓人,OpenGL。其实就是一个画图的东西。


    当然了,一说OpenGL,在智能手机领域,我们就不得不说OpenGL ES了。不要怕,两个其实区别不大。


OpenGL中有差不多十种基本图元:


点,线,三角形,三角形带,四边形,四边形带。。。等等。我这里不说了,其实我自已用的也少。记不住。你们看一下下边这个博客吧。



 


OpenGL ES中的基本图元:


点,线, 三角形。别的没有了。这里对于形状,重点中的重点就是这个 三角形


因为OpenGL ES中除了三角形以外,没有别的多边形图元绘制api了,那我们要怎么在OpenGL ES中绘制大于三个边的多边形呢。可能有聪明的人想到了。我们可以用三角形来拼成我们想要的任何多边形。


好了,这就是为什么box2D中的多边形形状只有凸多形的原因了。因为box2D中的多边形都是用的OpenGL中的三角形图元进行绘制的。


 什么,你理解不了上边这句话的意思。好吧。你可以在纸上试着画一下,先画一个凸多边形,再画一个凹多边形。然后试着看,你只把多边形的顶点连在一起来组成一个没有重叠三角形的多边形。



左边的凸多边形是不是很好用三角形拼成。


左边的凹多边形是不是用顶点去拼的时候会觉得诡异。

3.PhysicsEditor工具中关于形状的plist文件解读。

我们先从精灵图片开始。下边是我自已画的一个小鸡吃米图中的小鸡。




大家可以看到这边上的很多小圆点的,这就是用这个工具自动生成的精灵边界点。


啥也不说了,生成一个plist的xml文件再说。下边是生成的plist文件截图。这个也是我们今天要说的重点。




可能有人对这个xml中这些个字典了数组了什么的,还是不明白,那么接下来我们看一下他的开源的真对这个xml的解析类:


GB2ShapeCache




接着说我们的解析类吧。


老规矩,先说.h头文件:





 这个类就只有一个字典属性和一个float属性。然后有一个类方法


+(GB2ShapeCache *)sharedShapeCache;


从这个类方法的命名上看,这个类是一个单例类了。


还有四个实例对象方法,


第一个:


-(void)addShapesWithFile:(NSString*)plist;


这个方法也很明显了,就是加载plist文件的方法。也是主要的plist文件解析方法。


第二个:


-(void)addFixturesToBody:(b2Body*)body forShapeName:(NSString*)shape;


这个方法应该是把plist中定义的形状按名称绑定到b2Body对象上。


第三个:


-(CGpoint)anchorPointForShape:(NSString*)shape;


这个方法是设置anchorPoint坐标的。


第四个:


-(float)ptmratio;


这个我提前看了一下.mm文件中的实现,其实就是反回了属性ptmRatio_的值。而ptmRatio_值是从plist文件中解析出来的。这个值用到box2D的朋友应该都知道。是把屏幕的像素和物理长度单位米进行换算的一个参数。


plist是苹果独有的文件,在苹果里用xcode打开这个文件,看起来参数类型会比较明了,所以这里上一个xcode打开的图:




是不是结构,很明了。我这里主要说一下最后的形状中的polygons这个数组中的所有形状是怎么在上边说的方法-(void)addShapesWithFile:(NSString*)plist;的实现中解析的。看代码:




最后,请大家看一眼博客右边的广告,有兴趣的可以点点看。 


举报

相关推荐

0 条评论