# 第10章 世界(World Class)

b2World类包含物体和关节。它管理着模拟的方方面面,并允许异步查询(就像AABB查询和光线投射)。 你与Box2D的大部分交互都将通过 b2World 对象来完成。

## 创建和摧毁world

b2World* myWorld = newb2World(gravity, doSleep);

... do stuff ...

delete myWorld;

## 使用World

world类含有用于创建和摧毁物体与关节的工厂函数, 已在物体和关节的章节中讨论过。 在这里我们讨论b2World的其它交互。

## 模拟(Simulation)

float32 timeStep = 1.0f / 60.f;

int32 velocityIterations = 10;

int32 positionIterations = 8;

myWorld->Step(timeStep,velocityIterations, positionIterations);

myWorld->ClearForces();

## 探测世界(Exploring the World)

for (b2Body* b = myWorld->GetBodyList();b; b = b->GetNext())

{

b->WakeUp();

}

for (b2Body* b =myWorld->GetBodyList(); b; b = b->GetNext())

{

GameActor* myActor = (GameActor*)b->GetUserData();

{

myWorld->DestroyBody(b);// 错误: 现在GetNext会返回无用信息(garbage)

}

}

b2Body* node =myWorld->GetBodyList();

while (node)

{

b2Body* b = node;

node = node->GetNext();

GameActor* myActor = (GameActor*)b->GetUserData();

{

myWorld->DestroyBody(b);

}

}

b2Body* node =myWorld->GetBodyList();

while (node)

{

b2Body* b = node;

node = node->GetNext();

GameActor* myActor =(GameActor*)b->GetUserData();

{

bool otherBodiesDestroyed =GameCrazyBodyDestroyer(b);

if (otherBodiesDestroyed)

{

node =myWorld->GetBodyList();

}

}

}

## AABB查询(AABB Queries)

class MyQueryCallback : publicb2QueryCallback

{

public:

bool ReportFixture(b2Fixture*fixture)

{

b2Body* body =fixture->GetBody();

body->WakeUp();

// 返回true，继续查询

return true;

}

};

...

MyQueryCallback callback;

b2AABB aabb;

aabb.lowerBound.Set(-1.0f, -1.0f);

aabb.upperBound.Set(1.0f, 1.0f);

myWorld->Query(&callback,aabb);

## 光线投射(Ray Casts)

(译注:关于fraction的含义，可以看第04章的注释)

// This class captures the closesthit shape.

class MyRayCastCallback : publicb2RayCastCallback

{

public:

MyRayCastCallback()

{

m_fixture = NULL;

}

float32 ReportFixture(b2Fixture*fixture, const b2Vec2& point,

constb2Vec2& normal, float32 fraction)

{

m_fixture = fixture;

m_point = point;

m_normal = normal;

m_fraction = fraction;

return fraction;

}

b2Fixture* m_fixture;

b2Vec2 m_point;

b2Vec2 m_normal;

float32 m_fraction;

};

MyRayCastCallback callback;

b2Vec2 point1(-1.0f, 0.0f);

b2Vec2 point2(3.0f, 1.0f);

myWorld->RayCast(&callback,point1, point2);

## 力和冲量(Forces and Impulses)

void ApplyForce(const b2Vec2&force, const b2Vec2& point);

void ApplyTorque(float32 torque);

void ApplyLinearImpulse(constb2Vec2& impulse, const b2Vec2& point);

void ApplyAngularImpulse(float32impulse);

if (myBody->IsAwake() == true)

{

myBody->ApplyForce(myForce,myPoint);

}

## 坐标转换(Coordinate Transformations)

body类包含一些工具函数,它们可以帮助你在局部和世界坐标系之间转换点和向量。如果你不了解这些概念,请看 Jim Van Verth 和 Lars Bishop 的“游戏和交互应用的数学基础(Essential Mathematics for Games and Interactive Applications)”。这些函数都很高效(当inline时)。

b2Vec2 GetWorldPoint(constb2Vec2& localPoint);

b2Vec2 GetWorldVector(constb2Vec2& localVector);

b2Vec2 GetLocalPoint(constb2Vec2& worldPoint);

b2Vec2 GetLocalVector(constb2Vec2& worldVector);

## 列表(Lists)

for (b2Fixture* f =body->GetFixtureList(); f; f = f->GetNext())

{

MyFixtureData* data =(MyFixtureData*)f->GetUserData();

... do something with data ...

}

body也提供了访问相关contact的列表。你可以用来得到当前contact的信息。但使用时请小心，因为前一个时间步存在的contact,可能并不包含在当前列表中。

#### Box2D v2.1.0用户手册中文翻译

2011年12月30日 460KB 下载

#### Box2D v2.1.0用户手册翻译 - 第10章 世界(World Class)

2014-01-16 08:45:34

#### Box2D v2.3.0 用户手册中文版

2015年04月07日 373KB 下载

#### Box2D v2.1.0 用户手册

2013-10-12 09:47:19

#### Box2D v2.1.0 中文版文档 pdf版

2012年03月05日 613KB 下载

#### Box2D API 中文：b2World 类参考

2014-09-16 19:21:35

#### box2d_用户手册

2013-08-28 14:37:25

#### box2djs 一个bug world.Step运行数秒钟的调试记录

2016-08-17 20:51:52

#### Box2D v2.1.0用户手册(2)——Hello Box2D

2014-09-05 11:35:59

#### Box2DFlash笔记（四）--世界缩放单位

2009-04-15 11:23:00