Как перевести, повернуть и масштабировать в конкретной точке?

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

Я использую ГЛМ.

Взгляните на код, который я использую: -

GLfloat rx = sprite->origin.x / width;
GLfloat ry = sprite->origin.y / height;

translate(model, vec3( -sprite->origin.x, -sprite->origin.y, 0.0f ));
translate(model, vec3( rx * scale[0], ry * scale[1], 0.0f ));
rotate(model, radians(rotation), vec3( 0.0f, 0.0f, 1.0f ));
translate(model, vec3( -(rx * scale[0]), -(ry * scale[1]), 0.0f ));
scale(model, vec3( width * scale[0], height * scale[1], 1.0f ));
translate(model, vec3( position[0], position[1], 0.0f ));

Происхождение — это начальная точка объекта, затем переведите его в центр для вращения, а затем переведите обратно.

Масштабируйте его и переместите объект в указанное положение.

Я имею в виду, что не так с этим кодом?


person Ruks    schedule 08.04.2018    source источник
comment
почему вы переводите по масштабному коэффициенту, а не масштабируете по масштабному коэффициенту? Кроме того, гораздо важнее: что вы хотите ДЕЛАТЬ? Этот код не говорит нам, каково ваше намерение, а ваш текст недостаточно объясняет его. Чтобы предотвратить проблему XY, можете ли вы обновить свой пост, чтобы объяснить, что вы пытаетесь достичь того, для чего вы пишете этот код?   -  person Mike 'Pomax' Kamermans    schedule 08.04.2018
comment
@Mike'Pomax'Kamermans Я хочу, чтобы он выполнял все преобразования с центром объекта (скажем, спрайта). Я реализую своего рода источник в средстве визуализации спрайтов.   -  person Ruks    schedule 09.04.2018
comment
В этом случае вы уже ответили на свой вопрос: переведите (-cx, -cy), чтобы ваш центр был (0,0), затем примените другие преобразования, которые будут относиться к (0,0), а затем переведите (cx, су).   -  person Mike 'Pomax' Kamermans    schedule 09.04.2018
comment
@Mike'Pomax'Kamermans Причиной проблемы является вращение. Вы можете понять, почему? Это происходит с большей частью объекта, который я трансформирую, объекты вращаются вокруг точки, а не от центра.   -  person Ruks    schedule 10.04.2018
comment
Я только что тебе сказал. Переведите центр вашего объекта x/y ((xmin+xmax)/2 на (ymin+ymax)/2), а не его смещение x/y, как ваш код делает прямо сейчас.   -  person Mike 'Pomax' Kamermans    schedule 10.04.2018
comment
@Mike'Pomax'Kamermans Я только что опубликовал ответ, спасибо за вашу помощь.   -  person Ruks    schedule 05.05.2018
comment
Боюсь, что этот ответ не имеет смысла. 2 и 3 компенсируются, так почему они там? Что-то происходит между ними? Если да, то почему вы оставили это? Универсальный рецепт для вращения объекта вокруг его собственного центра заключается в том, чтобы переместить точку, вокруг которой вы вращаете, в положение (0,0), повернуть ее, а затем вернуть обратно, почему бы не следовать этому рецепту?   -  person Mike 'Pomax' Kamermans    schedule 05.05.2018


Ответы (1)


Спасибо, я нашел ответ,

Делайте это в таком порядке: -

1) Перевести объект в положение, например, vec3(position, 0.0f).

2) Затем поверните объект.

3) Переместите точку обратно в исходную точку, например, vec3(-originx * scale, -originy * scale, 0.0f).

4) Наконец, масштабируйте объект.


Объяснение Время:

Возьмите положение объекта как 0, 0 в 2D-координатах (возьмите его как переменную position, упомянутую выше в примере с первой точкой).

Вы можете видеть, что объект переместится (переместится) в нужное положение.

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

Сейчас самое время повернуть объект.

Масштабирование работает из верхнего левого угла, поэтому вы не можете сделать это из центра.

Далее просто масштабируем объект.

Это все, что вам нужно сделать.

С уважением,

Рукс

person Ruks    schedule 05.05.2018