Другим способом сделать это (в качестве альтернативы использованию b2TestOverlap
, как было предложено ранее кем-то другим), было бы использование функции b2CollidePolygons
(из b2Collision.h
). Вы можете использовать это для многоугольников форм приборов, а затем посмотреть, будет ли поле b2Manifold
pointCount
больше нуля.
Вот несколько примеров кода до C ++ 11 для вас (который я не скомпилировал и не протестировал, поэтому, надеюсь, не слишком foobar'ed):
bool isTouching(const b2PolygonShape& polygonA, const b2Transform& xfA, const b2PolygonShape& polygonB, const b2Transform& xfb)
{
b2Manifold manifold;
b2CollidePolygons(&manifold, &polygonA, xfA, &polygonB, xfB);
return manifold.pointCount > 0;
}
bool isPolygonFixturesTouching(const b2Fixture& fixtureA, const b2Fixture& fixtureB)
{
const b2Shape* shapeA = fixtureA.GetShape();
const b2Shape* shapeB = fixtureB.GetShape();
if (shapeA->GetType() == b2Shape::e_polygon && shapeB->GetType() == b2Shape::e_polygon)
{
const b2Body* bodyA = fixtureA.GetBody();
const b2Transform& xfA = bodyA->GetTransform();
const b2Body* bodyB = fixtureB.GetBody();
const b2Transform& xfB = bodyB->GetTransform();
return isTouching(*(static_cast<b2PolygonShape*>(shapeA)), xfA, *(static_cast<b2PolygonShape*>(shapeB)), xfB);
}
return false;
}
int main()
{
...
if (isPolygonFixturesTouching(fixtureA, fixtureB))
{
std::cout << "hooray!" << std::endl;
}
}
Примечание: Некоторые грубые временные тесты, которые я только что попробовал, сравнивают b2TestOverlap
с b2CollidePolygons
, показывая b2TestOverlap
, чтобы быть в 4 или 5 раз быстрее (чем b2CollidePolygons
). Учитывая, что первый ищет только перекрытие, в то время как последний вычисляет коллизионный коллектор, я полагаю, что разница в скорости не удивительна. В любом случае, похоже, мораль этой истории такова, что b2TestOverlap
, вероятно, является предпочтительной функцией, если вы просто хотите знать, касаются ли 2 прибора, тогда как b2CollidePolygons
более полезна, если вы также хотите узнать дополнительные вещи, например, как 2 светильника соприкасаются.