美文网首页
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