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);//默认的应该只有这句吧,作用上重力和阻力。
}

五,其他
可以加上冲量:

chipmunk 物理引擎的基本概念和基本用法的更多相关文章

  1. Cocos2d-js官方完整项目教程翻译:六、添加Chipmunk物理引擎在我们的游戏世界里

    添加Chipmunk物理引擎在我们的游戏世界里         一.简介                   cocos2d JS能给我们力量来创造令人印象深刻的游戏世界.但缺乏某种现实.       ...

  2. cocos2d-js中Chipmunk物理引擎相关(1)

    近期看些cocos2d-js的东西.用到当中的Chipmunk的一些东西.由于相关的资料也不是非常具体,所以看到一些东西实用就记录下来. 1. chipmunk是cocos2d的一个一个物理引擎.用来 ...

  3. Chipmunk-js物理引擎学习笔记

    一.基本概念## 空间:在Chipmunk中,空间是所有对象容器.因此,刚体.形状.链接节点等对象都需要添加到空间中.空间控制这些对象的相互作用. 刚体:物理上的刚体指的是在运动和受力作用后,形状和大 ...

  4. Cocos2d-x3.2 使用物理引擎进行碰撞检测[转]

    通常在游戏简单逻辑判断和模拟真实的物理世界时,我们只需要在定时器中判断游戏中各个精灵的条件是否满足判断条件就可以了.例如,在飞机大战中,判断我方子弹和敌机是否发生碰撞一般在定时器中通过敌机所在位置的矩 ...

  5. Cocos2d-x3.2总结---使用物理引擎进行碰撞检测

    [转自]: http://blog.csdn.net/cbbbc/article/details/38541099 通常在游戏简单逻辑判断和模拟真实的物理世界时,我们只需要在定时器中判断游戏中各个精灵 ...

  6. Cocos2d-x 使用物理引擎进行碰撞检测

    [转自]: http://blog.csdn.net/cbbbc/article/details/38541099 通常在游戏简单逻辑判断和模拟真实的物理世界时,我们只需要在定时器中判断游戏中各个精灵 ...

  7. Cocos2d-x教程(30)-3.x版本号物理引擎的使用

    转载时请注明原文出处 : http://blog.csdn.net/u012945598/article/details/38417333 在Cocos2d-x 2.x的版本号中,开发人员能够直接使用 ...

  8. Egret中使用P2物理引擎

    游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎. 来自瑞典斯德哥尔摩 ...

  9. 一个使用物理引擎的WebGL3D场景

    这是一个类似第三人称射击游戏(TPS)的3D场景,可以通过https://ljzc002.github.io/FPS2/index.html访问.场景运行效果如下图: 场景环境由一个天空盒和一个地面网 ...

随机推荐

  1. 【297】IDL 过程、函数&关键字参数

    目录: 一.Procedure 1.1 基本说明&定义 1.2 关键字参数 二.Function 2.1 基本说明&定义 2.2 关键字参数 参考:IDL中函数中的带有关键字的参数的使 ...

  2. ubuntu linux常用指令(1)

    序号 命令 说明 1 sudo su 从普通用户切换到root用户 2 su user 从root用户切换到普通用户 3 ls 列出当前目录的文件和目录,但是不包括隐藏文件和目录 4 ls -a 列出 ...

  3. Hadoop HA 机制学习

    一.Hadoop 系统架构 1.1 Hadoop1.x和Hadoop2.x 架构 在介绍HA之前,我们先来看下Hadoop的系统架构,这对于理解HA是至关重要的.Hadoop 1.x之前,其官方架构如 ...

  4. Storm配置说明

    配置项 配置说明 storm.zookeeper.servers ZooKeeper服务器列表 storm.zookeeper.port ZooKeeper连接端口 storm.local.dir s ...

  5. kali linux: 网卡监听及扫描网络

    一.网卡监听: kali不支持内置网卡,仅仅支持usb网卡.我用的虚拟机.首先在虚拟机的可移动设备里打开usb网卡的连接,执行ifconfig命令,如下: eth0接口是本地有线网卡信息,lo接口是本 ...

  6. SpringBoot29 登录逻辑、登录状态判断

    1 知识点扫盲 浏览器和服务器之间时通过session来确定连接状态的,浏览器第一次请求时服务端会自动生成一个session,并将这个sessionId传回给浏览器,浏览器将这个sessionId存放 ...

  7. OceanBase

    OceanBase 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! OceanBase是一个支持海量数据的高性能分布式数据库系统,实现了 数千亿条记录.数百TB数据上的 ...

  8. 解决T4模板的程序集引用的五种方案

    在众多.NET应用下的代码生成方案中,比如CodeDOM,BuildProvider, 我觉得T4是最好的一种.关于T4的基本概念和模板结果,可以参考我的文章<基于T4的代码生成方式>.如 ...

  9. Spring查询方法的注入 为查询的方法注入某个实例

    //这里是客户端的代码 当调用CreatePersonDao这个抽象方法或者虚方法的时候由配置文件返回指定的实例 为查询的方法注入某个实例 start static void Main(string[ ...

  10. servler配置

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...