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

风的驿站

一徐清风,半指烛光,觥筹已净,只余茶香。残卷一章,妙趣非常,忽闻帘响,愿闻其详?

 
 
 
 

日志分类

 
 
日志分类列表加载中...
 
 
 
 
 

标签

 
 
数据加载中...
 
 
 
 
 
 
 
心情随笔列表加载中...
 
 
 
 
 
 
 
 
 
 
 
网易云音乐 曲目表歌词秀
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

【原创】Box2d弹性物体的制作

2014-8-26 15:06:36 阅读214 评论0 262014/08 Aug26

这次我们来使用Box2d框架制作具有一定弹性的物体。这里我们说的弹性物体,不是指物体碰撞到其他物体后反弹的这种特性,而是指物体的外形在受到外力作用的时候会发生形变,比如我们小时候玩儿的弹力球。那么这里就有一个有意思的地方,我们知道在Box2d中,所有的物体都是“刚体”,刚体就是不会发生弹性形变的物体,那么不是矛盾了么?所以这里我们所得具有弹性的物体,实际上并不是一个物体,而是一系列刚体组成的一个物体。

好了,不多说废话了,下面就开始制作。

我们先看一下运行的效果截图:

我们要制作的就是这种具有一定弹性的环形物体(或者说球状物体)。

原理比较简单,我们可以看到,图中的环形物体实际上是由很多个小的梯形连接组成的,相邻的两个梯形物体通过关节进行连接,如下图所示:

相邻的两个梯形物体具有两个相邻的顶点,这两个顶点都使用具有固定作用的关节进行连接才能使两个物体形成一定的弹力效果,假如上图中我们去掉上面或者下面的关节,那么只有一个关节存在的时候,可以想象整个环形物体就会像下面这样松垮掉:

说道“具有固定作用的关节”,我指的就是能够将两个关节上的两个点固定在一起的关节,例如b2RevoluteJoint,b2WeldJoint,b2DistanceJoint。我们利用相邻的物体要脱离关节的约束时关节产生的反作用力,来体现出弹性的效果。

既然上面的三种约束都有固定的作用,我们分别试一下看看有什么效果。首先来看b2DistanceJoint的效果:

截图中我们看到下落的时候还好(其实在

作者  | 2014-8-26 15:06:36 | 阅读(214) |评论(0) | 阅读全文>>

【原创】使用Box2d实现物体在液体中的漂浮效果(一)

2014-8-25 13:32:37 阅读240 评论2 252014/08 Aug25

今天我们来学习使用Box2d物理引擎制作物体在液体中的漂浮效果,没有新的技术,只是综合运用了以前博文中介绍过的技术。

注:如果使用Box2d flash的版本,可以直接使用buoyancycontroller来实现本文制作的效果。

首先我们来分析一下大体思路:

首先需要在场景中创建一个液体区域(以下简称液体,我们不做液体流动的模拟,只是创建一个矩形的区域),由于需要检测物体与液体的接触(Contact),所以液体应该也是一个b2Body对象,只不过液体不检测碰撞,故我们将其设置为传感器(Sensor)。

要实现物体与液体的接触检测,我们需要创建一个继承自b2ContactListener的子类,重写BeginContact和EndContact方法,在BeginContact和EndContact中对物体的速度进行调整(因为液体具有一定的阻力和粘稠度)。

物体在液体中还会受到浮力的作用,浮力的大小与物体浸入液体的体积有关,而要计算物体浸入液体的体积,就要用到射线投射的相关知识与多边形面积计算的相关知识了。

好了,下面我们开始来制作,首先还是看一下运行效果截图:

首先我们以cocos2d iOS with Box2d为模板创建工程(Box2d版本为2.3.1),接着在HelloWorldLayer中添加下面的方法创建液体区域(也就是上面图片中的下半部分绿色区域):

-(void) createWater {

CGSize winSize = [[CCDirector sharedDirector] winSize];

作者  | 2014-8-25 13:32:37 | 阅读(240) |评论(2) | 阅读全文>>

【原创】根据凸多边形顶点坐标来计算面积算法与实现

2014-8-22 15:55:54 阅读278 评论0 222014/08 Aug22

本文我们来介绍一下如何利用凸多边形的所有顶点的坐标来计算其面积,并使用该算法制作一个小的示例程序。

注:对于凹多边形的面积,可以将其分解为若干个凸多边形分别计算求和,关于凹多边形的分解算法请参考Box2d中使用b2Separate开源代码创建凹多边形及其算法分析

求解的思路其实非常简单,对于任何凸多边形,我们以它的任意一个顶点为一个端点,连接该顶点与其他所有的顶点得到若干条线段,就可以将这个多边形切割成若干个三角形,如下图:

对于得到的任何一个三角形,它的三个顶点都是多边形的顶点,因此其坐标是已知的(我们假定多边形的顶点坐标为已知量)。那么我们就可以利用三个顶点的坐标求解每一个三角形的面积(关于如何利用坐标求解三角形面积,请参考游戏中两个常用的数学运算推导即算法推论)。于是我们得到下面的算法步骤:

对于给定的顶点数组vertexes,数组大小为n(即n边形),我们选取第一个顶点vertexes[0]作为起点,从i=1开始,一直循环到i=n-2,每次计算顶点vertexes[0],vertexes[i],vertexes[i+1]组成的三角形面积,将从1到n-2次循环得到的所有三角形的面积累加起来,就得到了vertexes围成的多边形的面积。

作者  | 2014-8-22 15:55:54 | 阅读(278) |评论(0) | 阅读全文>>

【原创】使用b2MouseJoint实现鼠标拖拽刚体的效果

2014-8-19 15:04:36 阅读132 评论0 192014/08 Aug19

要在Box2d中实现鼠标拖拽效果(当然在移动设备上就不是鼠标拖拽而是手指拖拽了),可以使用Box2d中定义的b2MouseJoint来制作。大体思路是,首先在ccTouchBegan事件中获取鼠标(以下不再区分鼠标或是手指)所在位置的刚体(如果有的话),接着在ccTouchMoved事件中通过更新b2MouseJoint的target的位置(更新为鼠标的当前位置),最后在ccTouchEnded事件中清理掉b2MouseJoint让刚体受力自由运动。

首先我们来完成获取鼠标所在位置的刚体的代码。

以cocos2d iOS with Box2d为模板创建Box2d工程(本文使用的是Box2d 2.3.1版本),接着我们去掉HelloWorldLayer的addNewSpriteAtPosition方法中为盒子对象添加的纹理贴图部分(这样我们看到的就是原始的刚体骨架了,个人喜好哈哈),接着我们在HelloWorldLayer的init方法中把menu相关的代码都给注释掉,让我们的界面看着更简洁一些,然后使用循环,调用addNewSpriteAtPosition方法向场景中添加若干个盒子刚体来用于测试:

for (int i = 0; i < 20; i++) {

[self addNewSpriteAtPosition:ccp(s.width/2, s.height/2)];

}

添加完成后试运行一下:

这里我们添加了20个刚体。

接着把HelloWorldLayer的ccTouchesEnded方法全部注释掉。

作者  | 2014-8-19 15:04:36 | 阅读(132) |评论(0) | 阅读全文>>

Box2d中刚体的纹理可以有很多种实现方式(参考Box2d中刚体的纹理的几种实现方式),但是这几种实现方式都是在我们已知刚体形状并且保证刚体形状不变的情况下,通过提前将刚体的纹理绘制好并“附加”到刚体上来完成的。

因此如果遇到下面这些情况:

1.     刚体形状不确定,例如随机生成的形状或者某些游戏中玩家可以手工绘制物体等等。

2.     刚体形状可能会发生变化,例如切割游戏中,一个大的刚体被切割成若干个小的刚体,或者游戏中一些能够变形的物体或软体受力发生形变等等。

这时,我们通过提前绘制好纹理的那种解决方案就失效了。

那么这种情况下,我们的思路是根据任意路径去创建一个多边形,然后为多边形填充一个纹理,让多边形外边的区域不显示纹理呢。Box2d和Cocos2d中都没有为我们提供这样的类或者方法,因此我们使用开源库PRKit来实现。PRKit由Precognitive Reserch的开发人员实现和维护,可以处理纹理映射和纹理填充。

PRKit的下载地址:https://github.com/asinesio/cocos2d-PRKit

作者  | 2014-8-12 14:34:05 | 阅读(282) |评论(0) | 阅读全文>>

【原创】Box2d中刚体的纹理的几种实现方式

2014-8-11 8:37:33 阅读101 评论0 112014/08 Aug11

Box2d中创建完刚体并将装置(fixture)附加到刚体上以后,还需要对刚体应用纹理才能够让刚体看起来像一个真正的物体,而不是一个个多边形或者圆形线框。因此,总结了下面几种为刚体添加纹理的思路。

1.    最简单的方式就是使用CCPhysicsSprite类,CCPhysicsSprite是cocos2d 2.1之后引入的,支持Chipmunk和Box2d两个框架,类中定义了b2Body成员用来存储其对应的刚体,该类重写了nodeToParentTransform,position和rotation的get/set等方法,获取对应刚体的坐标和转角,然后使用坐标和转角来更新其纹理的位置和旋转,从而使纹理和刚体能够同步移动和旋转。

使用CCPhysicsSprite的方式很简单:

CCPhysicsSprite *sprite = [CCPhysicsSprite spriteWithTexture:texture rect:CGRectMake(x, y, width, height)];

[parent addChild:sprite];

[sprite setPTMRatio:PTM_RATIO];

[sprite setB2Body:body];

[sprite setPosition: ccp( p.x, p.y)];

首先通过初始化方法初始化纹理texture和纹理的绘制区域(矩形区域),接着将该精灵对象添加到场景中(与一般的

作者  | 2014-8-11 8:37:33 | 阅读(101) |评论(0) | 阅读全文>>

【原创】Box2D中切割刚体效果的实现一览(二)

2014-8-10 11:11:39 阅读96 评论0 102014/08 Aug10

我们继续来实现切割效果。

我们现在有了切割线和多边形,可以利用Box2d的射线投射(RayCast)来检测切割线和多边形的交点(入射点)。在Box2d中通过定义b2RayCastCallback的子类来获取射线投射的结果,关于Box2d中的射线投射的使用,可以参考Box2D v2.3.0 用户指南(第十章)

我们创建b2RayCastCallback的子类MyRayCastCallback,声明如下:

#import "Box2D.h"

class MyRayCastCallback : public b2RayCastCallback {

public:

NSMutableArray* results;

NSMutableArray* endResults;

BOOL resultFlag;

MyRayCastCallback();

float32 ReportFixture(b2Fixture *fixture, const b2Vec2 &point, const b2Vec2 &normal, float32 fraction);

void ClearResults();

void ResetFlag();

作者  | 2014-8-10 11:11:39 | 阅读(96) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
 

辽宁省 大连市 金牛座

 发消息  写留言

 
喜欢写生 编程 音乐 设计 喜欢把自己的想法变成实实在在的东西 喜欢安静的做一些事情 CSDN博客:http://blog.csdn.net/qwertyupoiuytr
 
近期心愿找到自己能够为之奋斗的事业
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 
 
 
博友列表加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

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

注册 登录  
 加关注