Как повернуть актер изображения в 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);