Как установить центры форм / приспособлений / тел в Box2D - PullRequest
7 голосов
/ 08 июля 2011

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 13 июля 2011

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

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

2 голосов
/ 10 июля 2011

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

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

  • Сместить вершины на-centroid.

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

1 голос
/ 11 июля 2011

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

Тело имеет Положение (b2Vec2) в мире.
Тело имеет b2Fixture с (плотность, трение, восстановление, форма и т. Д.)
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);

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

0 голосов
/ 13 августа 2013

Возможно, это связано, хотя я использую Box2DWeb и Easel.js, а не Box2D и SFML. Проблема, с которой я столкнулся, заключается в том, что Easel.js regX / regY (графический центр спрайта) должен соответствовать физическому центру масс.

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

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

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

0 голосов
/ 10 июля 2011

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

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

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

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

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

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

...