box2d с пользовательскими сбоями полигонов - PullRequest
1 голос
/ 25 сентября 2011

Я создал многоугольник, который имеет 5 вершин, и все вершины генерируются VertexHelper.

Почему программа получает SIGABRT в b2Assert (area> b2_epsilon) в ComputeCentroid () в b2PolygonShape.cpp?

Программа работает хорошо, когда я использую shape.SetAsBox (.359375, 1.0) вместо shape.Set (вершины, количество) .

Кажется, что что-то не так при вычислении центроида при использовании shape.Set (), но я не знаю, как справиться с этой проблемой.

Вот код:

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.awake = NO;
bodyDef.position.Set(3.125, 3.125);
bodyDef.angle = -.785398163397;
spriteBody = world->CreateBody(&bodyDef);
spriteBody->SetUserData(sprite);
b2MassData massData = {2.0, b2Vec2(0.021875, 0.203125), 0.0};
spriteBody->SetMassData(&massData);
int32 count = 5;
b2Vec2 vertices[] = {
    b2Vec2(-11.5f / PTM_RATIO, -16.0f / PTM_RATIO),
    b2Vec2(-10.5f / PTM_RATIO, 15.0f / PTM_RATIO),
    b2Vec2(10.5f / PTM_RATIO, 15.0f / PTM_RATIO),
    b2Vec2(10.5f / PTM_RATIO, -5.0f / PTM_RATIO),
    b2Vec2(-5.5f / PTM_RATIO, -16.0f / PTM_RATIO)
};
b2PolygonShape shape;
shape.Set(vertices, count);
b2FixtureDef fixtureDef;
fixtureDef.shape = &shape;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.2f;
fixtureDef.restitution = 0.7f;
spriteBody->CreateFixture(&fixtureDef);

1 Ответ

3 голосов
/ 25 сентября 2011

Похоже, вы намотали вершины неправильно.Я думаю, что они должны быть против часовой стрелки в box2d, по крайней мере по умолчанию.

Ваше утверждение не будет выполнено, потому что вычисление для площади будет возвращать отрицательное значение, намного меньшее, чем b2_epsilon

...