# 第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用户手册翻译 - 第10章 世界(World Class)

• deruiyu93
• 2014年01月16日 08:45
• 390

## Box2D v2.1.0 用户手册

Box2D v2.1.0 用户手册 版权 © 2007-2010 Erin Catto 第01章 导言(Introduction) 第02章 Hello Box2D 第03章 公共模块(...
• henren555
• 2013年10月12日 09:47
• 489

## Box2D v2.1.0用户手册(12)——其它

• linmy1211
• 2014年09月05日 15:30
• 636

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

• linmy1211
• 2014年09月05日 11:35
• 582

## Box2D v2.1.0用户手册(6)——夹具(Fixtures)

• linmy1211
• 2014年09月05日 14:47
• 463

## Box2D v2.1.0用户手册(11)——杂项(Loose Ends)

• linmy1211
• 2014年09月05日 15:26
• 482

## Box2D v2.1.0用户手册(3)——公共模块(Common)

• linmy1211
• 2014年09月05日 14:21
• 464

## Box2D v2.1.0用户手册(1)——导言(Introduction)

• linmy1211
• 2014年09月05日 11:27
• 504

## Box2D v2.1.0用户手册(7)——物体(Bodies)

• linmy1211
• 2014年09月05日 14:52
• 699

## Box2D v2.1.0用户手册(9)——接触(Contacts)

• linmy1211
• 2014年09月05日 15:16
• 526

举报原因： 您举报文章：Box2D v2.1.0用户手册(10)——世界(World Class) 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)