Я пытаюсь создать систему «кусочков» в Box2D — то есть формы, которые соединены вместе в большой ком, чтобы вы могли разбить куски на собственное тело.
В настоящее время моя система очень проста (действительно только начинается) и смоделирована после теста «Breakable» на стенде Box2D. Это тело с несколькими базовыми приспособлениями (которые позже станут многоугольниками). Когда вы щелкаете тело, оно удаляет прибор и создает новое тело с тем же прибором, вращением и т. Д. В том же месте, что и старый «чанк».
Тем не менее, я могу получить его только для создания нового тела в начале большого тела
(-> GetWorldCenter). То, что я хочу сделать, это найти глобальное местоположение устройства, которое будет удалено и заменено, чтобы я мог создать новый блок там.
Я читал кое-что о b2PolygonShape, имеющем «центроид», но я не уверен, как получить к нему доступ и использовать …
Проще говоря, я хочу найти глобальное местоположение (как x + y или b2Vec2) FIXTURE, а не тела (это легко). Приспособление будет перемещаться вместе с телом, к которому оно прикреплено, но в настоящее время мне нужно только положение для одного кадра (хотя его обновление также было бы полезно).
Для Box2D положение тела не так важно. Положение тела только смещение для координат прибора. Это не влияет на процесс моделирования. Итак, я не понимаю, почему вы так заботитесь об этом.
Я сделал что-то вроде этого и могу сказать, что использование источника большого тела работает нормально. Вы можете увидеть в тестовом стенде Box2D к тесту Breakable. Там также используется происхождение большого тела. Единственная причина для вычисления новых координат, которые я вижу, — странное поведение метода SetAngle.
Если вам все еще нужен центроид, посмотрите на ComputeCentroid, расположенный по адресу b2PolygonShape.cpp. Обратите внимание, что метод не объявлен в b2PolygonShape.h. Вы можете скопировать код из cpp и использовать его следующим образом:
b2Fixture* chunk = ...;
b2Vec2 chunkCentroidLocal = ComputeCentorid(chunk->m_vertices,
chunk->m_vertexCount);
b2Vec2 chunkCentroidWorld = bigBody->GetWorldPoint(chunkCentroidLocal);
постскриптум Не забудьте преобразовать точки многоугольника, когда вы создадите новое тело. Просто найдите разницу между большим телом и новым телом и вычтите его из каждой точки многоугольника.
b2Vec2 shift = chunkCentroidWorld - bigBody->GetWorldCenter();
b2Vec2 newVertices = new b2Vec2[chunk->m_vertexCount];
for(int i = 0; i< chunk->m_vertexCount; i++)
{
newVertices[i] = chunk->m_vertices[i] - shift;
}
Других решений пока нет …