chipmunk是一个开源2D物理引擎,项目主页:http://code.google.com/p/chipmunk-physics/
工作需要研究了一下,这个引擎的资料还是不多,我阅读了所有的文档,7个demo,和一个教学程序,得出如下一些理解。
一,基本概念
space: 发生物理模拟的空间,可容纳body, shape,joint
body:刚体,可被赋予shape。刚体具有质量,转动惯量,位置,线性速度,加速度,角度,角速度,角加速度等属性。刚体之间可通过joint连接
shape:决定刚体的碰撞外形。一个刚体上可覆盖上多个shape,同属于一个刚体的shape不会互相发生碰撞。shape同样需要加到space中。有圆,线段,凸多边形这三种shape类型。
joint: 用于连接刚体。有4种类型:
pin joint: 相当于一根棍子(质量忽略)加两个大头针(锚点),两个刚体如果用pin joint连接,他们之间的距离不会改变,他们各自可绕锚点转动(如果有力矩的话)
slide joint: 相当于把pin joint的棍子换成了滑槽。这个滑槽有最大和最小长度。
pivot joint: 即一个旋转轴。两个刚体都绕这个轴旋转
groove joint:相当于可滑动的pivot joint。将刚体2的旋转轴挂到处于刚体1的一段滑槽上。
坐标系:demo里都使用的是2d笛卡尔坐标系。猜想对于2d游戏如果使用屏幕坐标系应该也可以(只是y反了)。或者在绘制2d sprite的时候自己转换一下坐标吧,应该更清楚些。
单位:引擎没有指定,最好使用国际单位制如kg,m,s,保持单位一致很重要
二,基本用法
0)初始化chipmunk引擎,调用cpInitChipmunk()
1)构建sapce,使用cpSpaceNew()
2) 构建一个static body,作为关卡的物理环境。这个body不需要加入到space中,否则会受重力作用。但这个body的shape需要加入到space中,用作碰撞检测。
staticBody = cpBodyNew(INFINITY, INFINITY); //生成static body,一般一个场景有一个够了
shape = cpSegmentShapeNew(staticBody, cpv(-320,-240), cpv(-320,240), 0.0f);//在static body上生成一个线段shape,也可以使用圆和多边形
cpSpaceAddStaticShape(space, shape);//将这个shape加入到space中
3)生成刚体body,和static body类似,只是使用cpBodyNew,另外需要使用cpSpaceAddBody(space, body);将body加入到space中。例子:
cpVect verts[] = {
cpv(-15,-7),
cpv(-15, 7),
cpv( 15, 7),
cpv( 15,-7),
};
cpBody *body = cpBodyNew(1.0, cpMomentForPoly(1.0, num, verts, cpv(0,0)));//第二个参数是转动惯量,一般用这个函数计算就可以了
body->p = cpv(x, y);//可设置body的位置
cpSpaceAddBody(space, body);//body要加入space中
cpShape *shape = cpPolyShapeNew(body, num, verts, cpv(0,0));
shape->e = 0.0; shape->u = 1.0;
cpSpaceAddShape(space, shape);//shape要加入space中
4) 加入joint:每个joint都是对于两个body的。使用cpPivotJointNew之类的方法加入joint,然后还要使用cpSpaceAddJoint将joint加入到space中
5)进行物理模拟计算:
其
实只要调用cpSpaceStep(space,
dt);就可以了。如果使用了外力,比如cpDampedSpring这样的方法,就要先清除一下body上的力和力矩,使用
cpBodyResetForces,另外如果需要提高精度,可以将dt分为几个step。例子:
void demo7_update(int ticks)
{
int steps = 3;
cpFloat dt = 1.0/60.0/(cpFloat)steps;
for(int i=0; i
cpBodyResetForces(chassis);
cpBodyResetForces(wheel1);
cpBodyResetForces(wheel2);
cpDampedSpring(chassis, wheel1, cpv(40, 15), cpvzero, 50.0f, 150.0f, 10.0f, dt);
cpDampedSpring(chassis, wheel2, cpv(-40, 15), cpvzero, 50.0f, 150.0f, 10.0f, dt);
cpSpaceStep(space, dt);
}
}
6)释放对象
这样就可以全部释放:
cpSpaceFreeChildren(space); //释放所有加入到space中的body, shape, joint
cpSpaceFree(space);
cpBodyFree(staticBody);//静态body没有加入space需要单独释放
三,碰撞回调
物理引擎本身会让物体在碰撞后产生“正确”的反应。但是你还是可以让碰撞时调用自己的方法,甚至取消掉碰撞。
使用:cpSpaceAddCollisionPairFunc(space, 1, 0, &collFunc, &some_value);
static int
collFunc(cpShape *a, cpShape *b, cpContact *contacts, int numContacts, cpFloat normal_coef, void *data)
{
int *some_ptr = (int *)data;
// Do various things with the contact information.
// Make particle effects, estimate the impact damage from the relative velocities, etc.
// for(int i=0; i
//
printf("Collision at %s. (%d - %d) %d\n", cpvstr(contacts[i].p),
a->collision_type, b->collision_type, *some_ptr);
// Returning 0 will cause the collision to be discarded. This allows you to do conditional collisions.
return 1;
}
四,速度函数
body->velocity_func = apply_buoyancy;//设定了一个自定义的速度计算函数
这个函数给刚体加入了水面的浮力(demo6)。
// Apply an approximate bouyancy and drag force to an object.
static void
apply_buoyancy(cpBody *body, cpVect gravity, cpFloat damping, cpFloat dt)
{
int numx = 20;
int numy = 4;
float stepx = (float)WIDTH/(float)numx;
float stepy = (float)HEIGHT/(float)numy;
cpBodyResetForces(body);//先清除力和力矩
for(int x=0; x
for(int y=0; y
cpVect p_sample = cpv((x + 0.5)*stepx - WIDTH/2, (y + 0.5)*stepy - HEIGHT/2);
cpVect p = cpBodyLocal2World(body, p_sample);
cpVect r = cpvsub(p, body->p);
if(p.y < 0){
cpVect v = cpvadd(body->v, cpvmult(cpvperp(r), body->w));
cpVect f_damp = cpvmult(v, -0.0003*cpvlength(v));
cpVect f = cpvadd(cpv(0, 2.0), f_damp);//计算浮力
cpBodyApplyForce(body, f, r);//将力作用上
}
}
}
cpBodyUpdateVelocity(body, gravity, damping, dt);//默认的应该只有这句吧,作用上重力和阻力。
}
五,其他
可以加上冲量:
cpBodyApplyImpulse
shape查询:
typedef
void
(*
cpSpacePointQueryFunc
)(
cpShape
*
shape
,
void
*
data
)
void
cpSpacePointQuery
(
cpSpace
*
space
,
cpVect point
,
cpLayers layers
,
cpLayers
group
,
cpSpacePointQueryFunc func
,
void
*
data
)
cpShape
*
cpSpacePointQueryFirst
(
cpSpace
*
space
,
cpVect point
,
cpLayers layers
,
cpLayers
group
)
分享到:
相关推荐
本文将深入探讨如何使用ChipMunk物理引擎,并结合quick-x框架实现精准的碰撞检测。 首先,理解ChipMunk的核心概念是关键。ChipMunk提供了基本的物理实体——“形状”(Shape)、“刚体”(Body)和“约束”...
总的来说,Chipmunk是一款强大而实用的2D物理引擎,无论是初学者还是经验丰富的开发者,都能从中找到适合自己的工具和方法,实现富有动态效果的项目。通过深入学习和实践,我们可以利用Chipmunk创造出更生动、更具...
本文将深入探讨cocos2d-js如何利用Chipmunk物理引擎制作出引人入胜的游戏Demo。 首先,我们来理解一下什么是物理引擎。物理引擎是游戏引擎的一部分,用于模拟现实世界中的物理现象,如重力、摩擦力、碰撞等。在...
在本文中,我们将深入探讨如何将Chipmunk2D,一个流行且高效的2D物理引擎,移植到Go语言。Chipmunk2D以其强大的性能和易用性在游戏开发和模拟应用中广受青睐,而Go语言则因其并发模型和简洁的语法受到开发者们的喜爱...
使用C语言来做,效率要高很多,但是开发,调试的难度也将增加,有机会我们将可以介绍如何使用NDK来编写C程序,并同时整合Chipmunk物理引擎。 这里只是我们对Box2d的一个简单介绍,让大家明白其用处,关于更多详细...
Chipmunk-js,又称为Chipmunk.js,是一款专门为JavaScript开发设计的物理引擎库,主要用于游戏开发和其他需要实时物理模拟的应用场景。这款库以其高效、灵活和易用性而受到开发者们的青睐,它能够帮助开发者创建出...
为了提高性能和减少计算量,可以考虑使用Bullet或Chipmunk等其他轻量级物理引擎,或者对jBox2D进行优化,比如使用固定时间步长,避免在不必要的时候进行物理模拟。 总结来说,使用jBox2D在Android开发中打造摩拜...
8. **模拟与求解**:2D物理引擎通常使用数值求解方法,如Euler积分或更高级的辛方法(如Verlet积分),来更新物体的位置和速度,以模拟连续时间下的物理系统。 9. **游戏应用**:2D物理在游戏开发中扮演着重要角色...
这个“ChipmuckTutorial”压缩包文件提供了一个关于iOS游戏碰撞检测的实际示例,使用了Chipmunk物理引擎。Chipmunk是一个轻量级的2D物理库,适用于各种游戏开发,尤其是移动平台。 首先,让我们了解一下碰撞检测的...
本书由Rod和Ray撰写,旨在帮助读者从概念到应用的整个过程中掌握Cocos2D的使用方法。书中不仅详细介绍了如何完成每一步操作,更重要的是解释了为什么这样做,让读者在实践中获得更深层次的理解。 #### 三、Cocos2D...
6. **物理引擎**:为了简化物理模拟的复杂性,一些开发者会使用现成的物理引擎库,如Box2D或Chipmunk。这些引擎已经实现了许多物理定律和碰撞检测算法,可以快速地在HTML5项目中集成复杂的物理效果。 7. **WebGL**...
其中,Pygame库为Python提供了一个方便的游戏开发框架,而Pymunk则是一个基于Chipmunk物理引擎的Python版本,专门用于处理游戏中的物理模拟。本文将详细介绍如何使用这两个库创建一个“倒塌解压金字塔”的游戏。 ...
6. **物理引擎**:如果涉及到Box2D或Chipmunk物理引擎,将介绍如何设置物理世界,创建刚体、关节,并实现碰撞检测。 7. **粒子系统(Particle Systems)**:如何创建和控制粒子效果,用于制作火焰、烟雾、雪花等...
4. **物理引擎集成**:通过Box2D或Chipmunk物理引擎,cocos2d-x允许开发者创建具有真实物理行为的游戏对象,如碰撞检测和重力模拟。 5. **脚本支持**:除了使用C++,cocos2d-x还支持JavaScript(通过Cocos2d-JS)和...
5. **物理引擎**:介绍如何集成Box2D或Chipmunk物理引擎,实现真实世界的物理模拟,如重力、碰撞和摩擦。 6. **音频和音效**:阐述如何在游戏中添加背景音乐和音效,包括音频资源的管理和播放控制。 7. **网络编程...
4. **物理引擎集成**:可以与Box2D或Chipmunk等物理引擎无缝集成,实现游戏中的碰撞检测和物理效果。 5. **音频支持**:Cocos2D提供音频播放功能,支持背景音乐和音效的播放。 6. **脚本支持**:通过CocosScript或...
通过学习粒子系统的创建和使用方法,可以让游戏更加生动有趣。 3. **Parallax Scrolling(视差滚动)**:这是一种常见的视觉技巧,用于营造深度感和沉浸感。书中会详细介绍如何实现这一效果。 4. **CocosDenshion**...
4. `chipmunk.js`或类似的文件:Chipmunk物理引擎的JavaScript绑定,使Cocos2d-js能够与Chipmunk进行交互。 5. `project.json`或类似文件:Cocos2d-js项目的配置文件,定义了项目结构和依赖。 为了运行这个项目,你...
4. **物理引擎**:学习如何集成和使用Cocos Creator内置的Box2D或Chipmunk物理引擎,创建真实的物理效果,如碰撞检测、重力模拟等。 5. **动画系统**:了解Action Editor和Timeline,制作复杂的角色动画和场景过渡...