Поворот 2D вектора с соотношением сторон - PullRequest
0 голосов
/ 03 сентября 2018

Многие из нас знакомы с подходом к вращению двумерного вектора вокруг начала координат с учетом угла theta:

newX = x * cos(theta) - y * sin(theta);
newY = x * sin(theta) + y * cos(theta);

Я сейчас пытаюсь повернуть координаты в UV-пространстве изображения, которое выглядит так:

UV Space

(Изображение заимствовано у этого ТАКОГО вопроса.)

Здесь единицы измерения по оси u шире, чем по оси v, поэтому приведенный выше подход приводит к вращению координат вокруг эллипса, а не круга. Мне нужно, чтобы вектор вращался так, как если бы координаты были квадратными, то есть необходимо учитывать соотношение сторон. Я подумал, что это будет так же просто, как растянуть координаты в квадратное пространство, повернуть, а затем растянуть назад, хотя кажется, что векторы вращаются эллиптически:

newX = (x * cos(theta) * Aspect - y * sin(theta)) / Aspect;
newY = x * sin(theta) * Aspect + y * cos(theta);

Любая помощь приветствуется, спасибо заранее!

1 Ответ

0 голосов
/ 03 сентября 2018

Общая версия для вращения и соотношения сторон:

(center_c, center_y) является центром вращения

(aspect_x, aspect_y) является аспект_рацио

tmp_x = (x-center_x)/aspect_x
tmp_y = (y-center_y)/aspect_y
tmp_x = tmp_x * cos(theta) - tmp_y * sin(theta)
tmp_x = tmp_x * sin(theta) + tmp_y * cos(theta)
new_x = aspect_x*tmp_x-center_x
new_y = aspect_y*tmp_x-center_y

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...