注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

眼睛想旅行

技术就是我的生命与信仰!

 
 
 

日志

 
 
关于我

精通C,C++,python,Erlang。并熟悉各种其他编程语言,用cocos2dx游戏引擎作过几个项目。会MySQL增删改查,了解OpenGL渲染原理。懂单片机,能设计数字电路系统,会画电路图和设计电路板。喜欢了解最新前沿技术,并持续关注和学习新技术。

网易考拉推荐

关于box2D多边形形状  

2013-03-24 16:53:47|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

麻烦想转载的朋友注明一下转载的出处:http://fengmm521.blog.163.com/blog/static/25091358201322445347106/

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

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

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

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

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

1.多边形基础知识

凸多边形的性质:

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

关于box2D形状 - ♂苹果 - 眼睛想旅行
图1 多边形ABCDEF是一个凸多边形。
关于box2D形状 - ♂苹果 - 眼睛想旅行
图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中的三角形图元进行绘制的。

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

关于box2D形状 - ♂苹果 - 眼睛想旅行左边的凸多边形是不是很好用三角形拼成。
关于box2D形状 - ♂苹果 - 眼睛想旅行左边的凹多边形是不是用顶点去拼的时候会觉得诡异。
 这里还要提一下,不管是OpenGL还是OpenGL ES绘制的面是有正面和反面一说的,组成面的绘制顺序是逆时针的面是正面,自然然顺时针的面就是反面了。其实这两个面是完全不同的两个面,这篇文章涉及不到,我们不提了,有兴趣的朋友看兰宝书吧。

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

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

关于box2D多边形形状 - ♂苹果 - 眼睛想旅行
大家可以看到这边上的很多小圆点的,这就是用这个工具自动生成的精灵边界点。
啥也不说了,生成一个plist的xml文件再说。下边是生成的plist文件截图。这个也是我们今天要说的重点。
关于box2D多边形形状 - ♂苹果 - 眼睛想旅行
可能有人对这个xml中这些个字典了数组了什么的,还是不明白,那么接下来我们看一下他的开源的真对这个xml的解析类:
GB2ShapeCache
关于box2D多边形形状 - ♂苹果 - 眼睛想旅行
接着说我们的解析类吧。
老规矩,先说.h头文件:
 
关于box2D多边形形状 - ♂苹果 - 眼睛想旅行
 这个类就只有一个字典属性和一个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打开的图:
关于box2D多边形形状 - ♂苹果 - 眼睛想旅行
 
是不是结构,很明了。我这里主要说一下最后的形状中的polygons这个数组中的所有形状是怎么在上边说的方法-(void)addShapesWithFile:(NSString*)plist;的实现中解析的。看代码:
关于box2D多边形形状 - ♂苹果 - 眼睛想旅行
 
  有两种形状解析,一种是多边形,一种是圆。很明显,我的这个小鸡吃米图生成的plist文件形状是以多边形绘制的。
最后,请大家看一眼博客右边的广告,有兴趣的可以点点看。 
 
  评论这张
 
阅读(1296)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017