美文网首页
Box2D基础

Box2D基础

作者: 大龙10 | 来源:发表于2022-05-23 06:49 被阅读0次

书名:代码本色:用编程模拟自然系统
作者: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/)。

相关文章

网友评论

      本文标题:Box2D基础

      本文链接:https://www.haomeiwen.com/subject/tbmkprtx.html