Как повернуть актер изображения в libgdx по средней точке?

Если я правильно понимаю, LibGDX поворачивает изображение с помощью метода addActions:

this.addAction( parallel(rotateBy(360, 0.5f), moveTo(320, 100, 0.5f)));

Дело в том, что оно поворачивается на point = (0,0) изображения.

Вот мой вопрос:

Есть ли способ повернуть изображение с помощью центральной точки объекта? Что-то вроде того, что он фиксирует его посередине, а затем поворачивает его, как колесо в машине? Оба метода rotateBy и rotateTo поворачивают его по (0,0) точке самого изображения.

Ответы

Ответ 1

Вам нужно правильно установить "происхождение" вашего актера. Вы можете прочитать из API-интерфейса Actor, что начало координат относительно позиции и используется для масштабирования и вращения.

Итак, вычислите свою среднюю точку и установите начало в среднюю точку.

Actor a;
....
a.setOrigin(a.getWidth()/2, a.getHeight()/2);

Ответ 2

Самый простой способ - перевести объект, чтобы точка 0,0 была центром, поверните ее, а затем переведите обратно в нужное положение. Я не знаком с libGDX, но должен быть метод для агрегирования трех преобразований, то есть вы применяете только одно агрегированное преобразование к вашему объекту. Имейте в виду порядок, в котором вы объединяете преобразования, имеет значение.

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

** Изменить Глядя на API, объект Actor имеет метод translate(). Используйте это, чтобы сдвинуть изображение, чтобы точка 0,0 находилась в центре. В psuedocode;

x = this.getX();
y = this.getY();
cx = this.getWidth() * .5;
cy = this.getHeight() * .5;
this.translate(-(x+cx), -(y+cy)); // move so 0,0 is the centre of the Actor object
this.rotate(thisMuch);  // rotate the Actor
this.translate((x+cx), (y+cy)); // move it back to its original location

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

Ответ 3

Вот простой способ, как вы можете повернуть актера в libgdx.

Сначала вам нужно установить источник:

img.setorigin(width/2,hieght/2);

Теперь вы можете вращать по часовой стрелке и против часовой стрелки в соответствии с вашими потребностями:

img.rotate(2f);

или

img.rotate(-2f);

Ответ 4

Самый простой и самый короткий способ, который я нашел для установки источника, - вызвать:

Actor a;

...

a.setOrigin(Align.center);