Нахождение центра крепежа в Box2D

Я пытаюсь создать систему «кусочков» в Box2D — то есть формы, которые соединены вместе в большой ком, чтобы вы могли разбить куски на собственное тело.

В настоящее время моя система очень проста (действительно только начинается) и смоделирована после теста «Breakable» на стенде Box2D. Это тело с несколькими базовыми приспособлениями (которые позже станут многоугольниками). Когда вы щелкаете тело, оно удаляет прибор и создает новое тело с тем же прибором, вращением и т. Д. В том же месте, что и старый «чанк».

Тем не менее, я могу получить его только для создания нового тела в начале большого тела
(-> GetWorldCenter). То, что я хочу сделать, это найти глобальное местоположение устройства, которое будет удалено и заменено, чтобы я мог создать новый блок там.

Я читал кое-что о b2PolygonShape, имеющем «центроид», но я не уверен, как получить к нему доступ и использовать …

Проще говоря, я хочу найти глобальное местоположение (как x + y или b2Vec2) FIXTURE, а не тела (это легко). Приспособление будет перемещаться вместе с телом, к которому оно прикреплено, но в настоящее время мне нужно только положение для одного кадра (хотя его обновление также было бы полезно).

1

Решение

Для 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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]