Как установить центры фигур / светильники/тела в 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
) в мире.
Тело b2Fixture
s (плотность, трение, реституция,формы, 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.