1

我最近在一个长期运行的项目中将 box2d 的版本升级到 v2.2.1,它导致了与现有项目代码的许多向后兼容性问题。大部分都解决了,除了这个

b2Fixture *f = body->GetFixtureList();
b2RayCastOutput output;
b2RayCastInput input;
f->RayCast(&output, input) // broken call

现在坏了,期待第三次争论。我在 box2d 源代码中看到函数签名是

inline bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const;

但我找不到任何childIndex应该是的例子。有人可以提供一个如何使用这个更新的 RayCast 功能的例子吗?

编辑:我注意到设置childIndex为 0 似乎有效,但我不知道为什么。

4

1 回答 1

3

此参数仅与 b2ChainShape 夹具相关。对于其他形状类型,它只是为了符合虚函数签名。

链形状的功能实际上是由多个 b2EdgeShape 完成的,链形状本身可以被认为是组织这些边缘形状“孩子”的帮手。它分配内存,为您设置幻影顶点,并将诸如碰撞检查之类的事情委托给边缘形状。

如果您不针对链形状投射光线,则可以将其保留为零。如果是,您可以使用 b2ChainShape 的这些函数将光线投射到每个子边缘:

int32 GetChildCount() const;
void GetChildEdge(b2EdgeShape* edge, int32 index) const;

其中第二个使用如下:

b2EdgeShape edgeShape;
chainShape->GetChildEdge(&edgeShape, 123);

您需要先将形状转换为 b2ChainShape*:

if ( e_chain == fixture->GetType() ) {
    b2ChainShape* chainShape = (b2ChainShape*)fixture->GetShape();
    ....
}

...使用 b2World 的 RayCast 功能会更容易和更有效:)

于 2012-07-09T15:46:08.073 回答