Как установить центры фигур / светильники/тела в Box2D

Эй, я пытаюсь интегрировать SFML и Box2D, и SFML сделал центры настройки для спрайтов, фигур и т. д. очень легко. Box2D, с другой стороны, у меня проблемы, поскольку я не могу понять, как установить или даже найти центр формы или крепления.

Мне кажется, что при добавлении вершин вручную в b2_PolygonShape центр устанавливается на первую вершину в массиве вершин, но результаты сильно отличаются при использовании функций быстрого доступа SetAsBox() или любого другого SetAs__(). Центр-это середина фигуры, или половина экстента(ов) коробки/фигуры.

Мне нужно объединить систему центрирования box2D и SFML, но я не могу понять, как локальные системы координат работают для объектов.

Как установить / получить центры многих объектов, таких как формы, светильники, тела и т. д. в Box2D в?

5 ответов


хорошо, я понял, что SFML и Box2D действительно не были такими разными, но я просто не думал о том, как формы сделаны/ правильно визуализированы в мировых координатах.

Если не указано иное, (0,0) всегда используется в качестве точки/ центра отражения объекта, когда его положение перемещается/ рисуется, и каждая вершина рисуется по отношению к этой точке.

учебник SFML был немного запутанным, как он сказал установка центра a shape / sprite-смещение от верхнего левого угла объекта,не (0,0).


Я думаю, что с box2d вы несете ответственность за то, чтобы "центроид" многоугольника совпадал с положением вашего тела. В принципе, вы должны сделать что-то вроде этого.

  • вычислите центроид вашего списка вершин (b2vec)

  • сдвиньте вершины на-центроид.

Box2d предоставляет необходимые функции, чтобы помочь вам с этой задачей. Что происходит с SetAs__ , так это то, что центроид равен (0,0) и многоугольник создается симметрично вокруг центра тела.


Я попробую еще раз. Я уверен, что могу вам помочь, но я не совсем понимаю ваш вопрос.

тело имеет положение (b2Vec2) в мире.
Тело b2Fixtures (плотность, трение, реституция,формы, etc...)
The b2PolygonShape имеет вершины и массовые данные. Эти вершины относительно положения тела.

примеры вершин для b2PolgygonShape (прямоугольник, размер: 1 метр * 1 метр)

(-0.5f, -0.5f)  // left  upper corner
( 0.5f, -0.5f)  // right upper corner
( 0.5f,  0.5f)  // right lower corner
(-0.5f,  0.5f)  // left  lower corner

сохранить в виду не могу установите вершины самостоятельно! Вы должны передать их

b2PolgygonShape::Set(b2Vec2 *vertices, int count);

этот метод вычислит массовые данные, в зависимости от вершин.


Это может быть связано, хотя я использую Box2DWeb и мольберт.Яш, а чем и Box2D в СФМЛ. Проблема я столкнулся заключается в том, что мольберт.js regX / regY (графический центр спрайта) должен соответствовать физическому центру массы.

для простого b2Body с одним b2FixtureDef центр массы тела совпадает с m_centroid b2FixtureDef.форма (будь то SetAsBox, SetAsArray, новый b2CircleShape и т. д.).

для тел multi-приспособления и скачками полигоны, что сработало для меня, это добавить все светильники (т. е. вызвать b2Body.CreateFixture), затем установите графический regX/regY равным b2Body.m_sweep.localCenter.x / y (умноженное на коэффициент масштаба пикселей/метра).

Это не работало для простых кругов и ящиков, но они не были проблемой в первую очередь. Надеюсь, это поможет.


вы можете просто сделать это:

b2Body *body = ...;
b2Vec2 pos = body->GetPosition();

Это положение тела в мире (pos.x и pos.y, определенными в метрах). Это означает, что вы должны использовать соотношение, например, 1 метр = 20 пикселей. Таким образом, вы должны умножить координаты на ваше отношение, чтобы получить позицию в пикселях.

используйте эту позицию для рисования изображений. При необходимости вы можете добавить координаты к изображению и нарисовать изображение по этим координатам относительно положения тела.

имейте в виду что вы также должны рисовать свои изображения с этим соотношением. При изменении соотношения (увеличение или уменьшение) изображения также должны увеличиваться.

для моей игры я использую SDL с OpenGL, что очень хорошая комбинация, поэтому я точно не знаю, как работает SFML.