Box2D基础

书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录

5.3 Box2D基础

先概述一下Box2D的使用流程

5.3.0、实现流程对比

1、前4章中每个程序

  • SETUP
    1.创建模拟世界中的所有对象。
  • DRAW
    1.计算所有力向量。
    2.将所有力作用在对象上(F = M * A)。
    3.根据加速度更新所有对象的位置。
    4.绘制所有对象。

2、Box2D程序的实现流程

  • SETUP
    1.创建模拟世界中的所有对象。
  • DRAW
    1.绘制所有对象

3、Box2D的神奇

  这就是Box2D的神奇之处。我们摆脱了所有痛苦的计算步骤,不需要根据速度和加速度计算对象的移动,Box2D会替我们接管这些计算任务。
  Box2D就像一个魔术盒,替我们完成了整个模拟流程,这真是一个令人欣慰的消息!

  • 在setup()函数中,
    我们告诉Box2D:“我的模拟世界中需要这些物体。”
  • 在draw()函数中,
    我们只需要向Box2D询问:“我想绘制模拟世界中的这些物体,你能否告诉我它们在什么位置?”

4、Box2D的准备

  还有一个坏消息:情况并不像上面描述的那样简单。

  • 首先,我们在Box2D的世界中创建物体之前,要先读一遍文档,学会如何创建和配置不同形状的对象。
  • 其次,我们不能把任何与像素相关的东西告诉Box2D,因为它根本无法理解像素。
  • 在告诉Box2D怎样创建模拟物体之前,我们必须先将像素单位转换为Box2D“世界”的单位。
  • 同理,绘制物体之前还要做一次相反的转换,Box2D只会告诉我们它的世界中的位置,我们应该将这个位置翻译成像素世界中的位置。

5.3.1 SETUP

  • 1.创建像素世界中的所有对象。
  • 2.将像素世界转换为Box2D的模拟世界。

5.3.2 DRAW

  • 1.向Box2D询问各个对象的位置。
  • 2.将Box2D的返回值转化为像素世界的位置。
  • 3.绘制所有对象。

  现在我们知道Processing Sketch中的所有物体都要被放到Box2D的世界中,下面来看看Box2D世界由哪些元素组成。

5.3.3 Box2D世界的核心元素

  • 1.世界(world) 
    管理整个物理模拟过程,它知道坐标空间的所有信息,存放了世界
    中的所有物体。
  • 2.物体(body) 
    Box2D世界的基础元素,有自己的位置和速度。
    是否感到似曾相识?在前面力和向量的模拟程序中,我们开发了很多类,Box2D的物体就等同于这些类。
  • 3.形状(shape) 
    记录所有与碰撞相关的几何信息。
  • 4.夹具(fixture) 
    将形状赋给物体,设置物体的一些属性,比如密度、摩擦系数、复原性。
  • 5.关节(joint) 
    充当两个物体之间的连接器(或者物体和世界之间的连接器)。
  • 6.Vec2 
    描述Box2D世界中的向量。

5.3.4 Vec2

  在这里,我们必须了解一些关于物理库的事实。任何物理模拟都要涉及向量的概念。
  这是件好事,因为在前面几章,我们一直在学习如何用向量描述运动和力的作用,所以并不需要在本章学习任何新的向量概念。
  但有个坏消息:Box2D没有PVector类。虽然rocessing为我们提供了PVector类,但任何物理库都有它自己的向量实现。这是合情合理的,因为物理库怎么会知道PVector类的任何信息?一般情况下,为了兼容其他代码,物理库会按自己的需求实现一个向量类。虽然我们不需要接触任何新的概念,但还是要学习新的命名规则和语法。

  参照PVector类,下面列出了Vec2的基础用法。

  • 假如我们要将两个向量相加。
    PVector a = new PVector(1,-1); PVector b = new PVector(3,4); PVector c =PVector.add(a,b);
    Vec2 a = new Vec2(1,-1); Vec2 b = new Vec2(3,4); Vec2 c = a.add(b);

  • 将向量乘以标量,改变它的长度。
    PVector a = new PVector(1,-1); float n = 5; PVector c = PVector.mult(a,n);
    Vec2 a = new Vec2(1,-1); float n = 5; Vec2 c = a.mul(n);

  • 获取它的长度,将向量单位化。
    PVector a = new PVector(1,-1);float m = a.mag();a.normalize();
    Vec2 a = new Vec2(1,-1);float m = a.length();a.normalize();

  从以上几个表中可以看出,PVector和Vec2涉及的基本概念是一样的,但函数名和参数却有细微差异。
  比如,Vec2没有用静态和非静态函数区分两种不同用途的add()函数和mult()函数,如果Vec2对象在调用过程中被修改,那么函数名将包含“Local”——addLocal()、multLocal()。

如果你想知道Vec2的更多信息,请查看它的文档,文档放在JBox2D的源代码中

(http://code.google.com/p/jbox2d/)。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容