【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2506|回复: 0

【Box 2D物理引擎C++】Box 2D例题01----Hello Box2D

[复制链接]
发表于 2012-10-22 15:18:26 | 显示全部楼层 |阅读模式
关于Box2D的用法,网上的资料并不是很多,因此在这里解释一下Box2D 的例题。
  1. #include "Box2D.h"
  2. #include <cstdio>
  3. int main(int argc, char** argv)
  4. {
  5.     B2_NOT_USED(argc);
  6.     B2_NOT_USED(argv);
  7.     // 定义检测碰撞世界的大小。
  8.     //如果钢体到达世界的边缘,但是它将会速度越来越慢直到休眠。
  9.     b2AABB worldAABB;
  10.     worldAABB.lowerBound.Set(-100.0f, -100.0f);
  11.     worldAABB.upperBound.Set(100.0f, 100.0f);

  12.     // 定义重力向量
  13.     b2Vec2 gravity(0.0f, -10.0f);

  14.     // 是否休眠
  15.     bool doSleep = true;

  16.     // 建立一个世界对象.
  17.     b2World world(worldAABB, gravity, doSleep);

  18.     //我们创建地面体。要创建它我们需要定义一个静态刚体(body definition),通过物体定义我们来
  19.     //指定地面体的初始位置。
  20.     b2BodyDef groundBodyDef;
  21.     groundBodyDef.position.Set(0.0f, -10.0f);

  22.     //将物体定义传给世界对象来创建地面体。世界对象并不保存到物体定义的引用。地面体是作
  23.     //为静态物体(static body)创建的,静态物体之间并没有碰撞。当一个物体具有零质量的
  24.     //时候 Box2D 就会确定它为静态物体,物体的默认质量是零,所以它们默认就是静态的
  25.     b2Body* groundBody = world.CreateBody(&groundBodyDef);

  26.     // 我们创建一个地面的多边形定义。我们使用 SetAsBox 简捷地把地面多边形规定为一个盒子
  27.     //(矩形)形状,盒子的中点就位于父物体的原点上。
  28.     b2PolygonDef groundShapeDef;

  29.     //SetAsBox 函数接收了半个宽度和半个高度,这样的话,地面盒就是 100 个单位宽(x 轴)以及
  30.     //20 个单位高(y 轴)。Box2D 已被调谐使用米,千克和秒来作单位,
  31.     groundShapeDef.SetAsBox(50.0f, 10.0f);

  32.     //创建地面多边形,以完成地面体
  33.     groundBody->CreateShape(&groundShapeDef);

  34.     // 现在我们已经有了一个地面体,我们可以使用同样的方法来创建一个动态物体。除了尺寸之外的主要
  35.     //区别是,我们必须为动态物体设置质量性质。
  36.     //首先我们用 CreateBody 创建物体
  37.     b2BodyDef bodyDef;
  38.     //设置起始坐标
  39.     bodyDef.position.Set(0.0f, 14.0f);
  40.     b2Body* body = world.CreateBody(&bodyDef);

  41.     // 接下来我们创建并添加一个多边形形状到物体上。注意我们把密度设置为 1,默认的密度是 0。并
  42.     //且,形状的摩擦设置到了 0.3。形状添加好以后,我们就使用 SetMassFromShapes 方法来命令物体通
  43.     //过形状去计算其自身的质量。这暗示了你可以给单个物体添加一个以上的形状。
  44.     b2PolygonDef shapeDef;
  45.     //动态刚体的大小,(1.0,1.0)表示物体的半个大小,也就是说这个物体的本质是2x2的一个方块。
  46.     shapeDef.SetAsBox(1.0f, 1.0f);

  47.     //密度,密度默认为0为0时判断为静态钢体
  48.     shapeDef.density = 1.0f;

  49.     //摩擦力
  50.     shapeDef.friction = 0.3f;

  51.     //创建刚体
  52.     body->CreateShape(&shapeDef);

  53.     //我也可以通过这个函数设置位置和角度
  54.     //body->SetXForm(b2Vec2(0.0f,5.0f),0.3f);

  55.     //按质量进行运算
  56.     body->SetMassFromShapes();

  57.     // Box2D 中有一些数学代码构成的积分器(integrator),积分器在离散的时间点上模拟物理方程,它将
  58.     // 与游戏动画循环一同运行。所以我们需要为 Box2D 选取一个时间步,通常来说游戏物理引擎需要至少
  59.     // 60Hz 的速度,也就是 1/60 的时间步。你可以使用更大的时间步,但是你必须更加小心地为你的世界调
  60.     // 整定义。我们也不喜欢时间步变化得太大,所以不要把时间步关联到帧频(除非你真的必须这样做)。直截
  61.     // 了当地,这个就是时间步:
  62.     float32 timeStep = 1.0f / 60.0f;
  63.     // Box2D 中还有约束求解器(constraint solver)。约束求解器用于解决模拟中的所有
  64.     // 约束,一次一个。单个的约束会被完美的求解,然而当我们求解一个约束的时候,我们就会稍微耽误另
  65.     // 一个。要得到良好的解,我们需要迭代所有约束多次。建议的 Box2D 迭代次数是 10 次。你可以按自己
  66.     // 的喜好去调整这个数,但要记得它是速度与质量之间的平衡。更少的迭代会增加性能并降低精度,同样
  67.     // 地,更多的迭代会减少性能但提高模拟质量。这是我们选择的迭代次数:
  68.     int32 iterations = 10;

  69.     // 输出坐标以及角度
  70.     for (int32 i = 0; i < 60; ++i)
  71.     {
  72.         // 单个约束求解以1/60帧。每帧计算10次
  73.         world.Step(timeStep, iterations);

  74.         // 得到动态刚体的坐标以及角度
  75.         b2Vec2 position = body->GetPosition();
  76.         float32 angle = body->GetAngle();

  77.         printf("%4.2f %4.2f %4.2f\n", position.x, position.y, angle);
  78.     }

  79.     // When the world destructor is called, all bodies and joints are freed. This can
  80.     // create orphaned pointers, so be careful about your world management.
  81.     system("pause");
  82.     return 0;
  83. }
复制代码
因为Box2D是一个纯数学引擎,没有图形显示模块,因此这个例题没有图形界面,看懂了代码也不能直观地了解运动过程。为此做了一张图,Box2D的形状坐标是按照物体的重心来表示的,在这个例题中,物体宽高2x2的方块用蓝色表示,他的位置在(0,4)这个点上,地板方块的大小是100X20的方块用砖红色表示,他的位置在(0,-10)这个位置上。

图像

图像

下面是用dx作为图形显示绘制的Box2D例题,要读懂这个例题除了要了解Box2D的知识以外,还需要了解D3D的绘图知识。
C++  Box2D 例题01
http://kuai.xunlei.com/d/SUABSKSZRFUO

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-5-3 10:31

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表