用过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°多边形了。

图1 多边形ABCDEF是一个凸多边形。
图2 多边形ABCDEF是一个凹多边形 
这回很明显了吧,图1所有的内角都小于180,而图二中的角AFE是大于180度的。
2.box2D中的多边形
好了,多边形的基础知道我们讲完了,下边我就来讲一下为什么在box2D会要求所有的box2D定义形状必须是凸多边形了。
这个东西要说起来,可能就要扯上OpenGL了,等等,先不要怕,OpenGL其实也是一个纸老虎。听着这名字,妈呀很吓人,OpenGL。其实就是一个画图的东西。
当然了,一说OpenGL,在智能手机领域,我们就不得不说OpenGL ES了。不要怕,两个其实区别不大。
OpenGL中有差不多十种基本图元:
点,线,三角形,三角形带,四边形,四边形带。。。等等。我这里不说了,其实我自已用的也少。记不住。你们看一下下边这个博客吧。
http://blog.csdn.net/feijj2002_/article/details/466987
OpenGL ES中的基本图元:
点,线, 三角形。别的没有了。这里对于形状,重点中的重点就是这个 三角形
因为OpenGL ES中除了三角形以外,没有别的多边形图元绘制api了,那我们要怎么在OpenGL ES中绘制大于三个边的多边形呢。可能有聪明的人想到了。我们可以用三角形来拼成我们想要的任何多边形。
好了,这就是为什么box2D中的多边形形状只有凸多形的原因了。因为box2D中的多边形都是用的OpenGL中的三角形图元进行绘制的。

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

左边的凸多边形是不是很好用三角形拼成。
左边的凹多边形是不是用顶点去拼的时候会觉得诡异。

这里还要提一下,不管是OpenGL还是OpenGL ES绘制的面是有正面和反面一说的,组成面的绘制顺序是逆时针的面是正面,自然然顺时针的面就是反面了。其实这两个面是完全不同的两个面,这篇文章涉及不到,我们不提了,有兴趣的朋友看兰宝书吧。

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;的实现中解析的。看代码:

有两种形状解析,一种是多边形,一种是圆。很明显,我的这个小鸡吃米图生成的plist文件形状是以多边形绘制的。

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

关于box2D多边形形状相关推荐

  1. Box2d源码学习十三b2Collision之碰撞(下) 具体形状间的碰撞的实现

    本系列博客是由扭曲45原创,欢迎转载,转载时注明出处,http://blog.csdn.net/cg0206/article/details/8441463 Box2d中,要形状间实现碰撞,必须两个碰 ...

  2. html5游戏开发box2djs,Box2D.js简易示例

    Box2dWeb example //在页面加载完毕后启动整个Box2D程序 function init() { //简化缩写各个对象名称 var b2Vec2 = Box2D.Common.Math ...

  3. Box2D v2.0.1 用户手册

    Box2D v2.0.1 用户手册 原文:Box2D v2.0.2 User Manual 译者:Aman JIANG(江超宇),翻译信息. 1. 导言 1.1 关于 Box2D 是一个用于游戏的 2 ...

  4. Cocos2d之Box2d基础知识

    一.box2d基础知识 1.关于 Box2D 是一个用于游戏的 2D 刚体仿真库.从游戏的视角来看,物理引擎就是一个程序性动画(procedural animation)的系统,而不是由动画师去移动你 ...

  5. Cocos2d-X Box2D内容讲解

    一.box2d基础知识 1.关于 Box2D 是一个用于游戏的 2D 刚体仿真库.从游戏的视角来看,物理引擎就是一个程序性动画(procedural animation)的系统,而不是由动画师去移动你 ...

  6. Box2D翻译_第二章

    本文是对Box2D v2.1.2 manual中文翻译(现在网上流行的一个中文翻译是针对以前版本的,跟最新的2.1.2版有些不对应)的第二章.持续更新中...... 2. Hello Box2D 在B ...

  7. box2d 碰撞检测_Box2d新系列 第四章 碰撞模块

    注:此文章翻译自Box2D v2.2.0用户手册,仅供学习参考. 4.1  关于 碰撞模块包括了形状以及操作形状的方法.模块也包括了动态树(dynamic tree)和broad-phase算法来提高 ...

  8. Box2D一:基础知识

    一.box2d基础知识 1.关于 Box2D 是一个用于游戏的 2D 刚体仿真库.从游戏的视角来看,物理引擎就是一个程序性动画(procedural animation)的系统,而不是由动画师去移动你 ...

  9. (老文章)Box2D新手入门顺阶教程

    注意: 本教程只适用于BOX2D 2.0以下版本,由于2.0版API的改动,所以有部分代码会并不适用.但是主要思想还是一样的. 一. HelloWorld 开始之前,我假想你已经看过了HelloWor ...

最新文章

  1. python输出等腰三角形代码_酷呆了!Python开发web应用的一些中级技巧
  2. VS Code 的常用快捷键和插件
  3. mysql主主同步配置_MySQL 主主同步配置步骤
  4. 微信开发必看,使用.Net Core 开发微信跨平台应用
  5. java 易变变量_关于java:易变变量和其他变量
  6. 用户登录功能:说简单也困难
  7. php 数据类型 map,es6中Set和Map的对比介绍(附代码)
  8. GNSS相关开源项目整理
  9. Kylin中cube优化
  10. 分槽ALOHA协议仿真
  11. html 的smap标签,SMap.Label
  12. mysql数据库报错1146_数据库错误代码1146 - 本地与在线
  13. 电脑开机密码,强制修改,覆盖原密码
  14. Nuxt - 自定义页面布局,<Nuxt /> 个性化多套模板(一个项目内既要有用户正常浏览的普通页面,又要存在后台管理系统布局的页面)
  15. 35岁以上的那些测试员何去何从?
  16. appvlv中偶有不爽
  17. 【全球排名前100的英文歌】
  18. C语言、C++与Java分别实现猜数字小游戏
  19. ssm明亮眼镜店网站毕业设计(附源码、运行环境)
  20. 微信小程序开发之——个人中心-介绍(1)

热门文章

  1. 少儿编程 电子学会机器人等级考试一级真题解析(选择题)2019-03
  2. 软文营销的间接作用有哪些?
  3. CAU 人工智能II(2022春) 课程期末复习 - 大纲整理
  4. 文华财经论坛上看到一些牛人
  5. 三菱Q系列PLC ,QD77MS16走总线控制伺服项目,实际 应用的, 程序结构清晰明了,通俗易懂,8个伺服,PLC程序有完整的注释
  6. linux python m2crypto,python – 如何在Ubuntu上安装M2Crypto?
  7. 销售困局:客户既要好的又嫌贵如何破局
  8. PIC16F877A与Proteus仿真-GPIO寄存器与配置
  9. XNA游戏:精灵Sprite的概念
  10. 批量下载sra文件linux,NCBI下载SRA数据的4种方法