Как воспроизвести перемещение, вращение, масштабирование объекта? (возможно, языковая независимость) - PullRequest
0 голосов
/ 01 июня 2011

All

У меня довольно неприятная проблема, которую я считаю простой, но мой мозг просто не работает. Короче говоря, проблема в том, что при наличии спрайта / изображения / штучки вы знаете, что кто-то повернул / перевел / масштабировал спрайт, но вы не знаете, в каком порядке это происходит, как вы можете воспроизвести точное изображение?

Для иллюстрации - Приведенное изображение выглядит так: Given an image like this

Кто-то имеет возможность вращать / переводить / масштабировать его так, чтобы он выглядел следующим образом (Как это выглядит после манипуляции - в этом случае их два ...) What it looks like after manipulation

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

enter image description here

А вот как выглядит накладка, чтобы дать вам представление о том, как далеко я нахожусь:

http://infinitetaco.com/pics/merged.png

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

Я знаю, что это, вероятно, легко, но я был бы признателен за помощь.

Ответы [ 2 ]

1 голос
/ 02 июня 2011

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

Вам понадобится оригинальная ограничительная рамкаспрайт (x, y) и преобразованная ограничительная рамка спрайта (u, v).Сначала удалите любой перевод, сдвинув центр преобразованных координат в центр исходных координат.Теперь решите уравнение ниже - у вас есть 4 неизвестных и 4 уравнения, поэтому просто сделайте некоторую алгебру, чтобы найти a, b, c и d.

[x1 x2 x3 x4;y1 y2 y3 y4] = [ab;cd] * [u1 u2 u3 u4;v1 v2 v3 v4]

Для аффинных преобразований a, b, c, d имеют следующую структуру:

[sx * cos (theta) sy * sin (theta);-sx * sin (theta) sy * cos (theta)]

Таким образом, вы можете уменьшить это до масштабирования (sx, sy), вращения (theta), и вы уже вычислили преобразование.

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

0 голосов
/ 02 июня 2011

Решено! Было много глупых мелочей, которые я сделал неправильно, но главная ошибка заключалась в том, что способ вычисления центральной точки поворота был основан на верхнем левом углу, а не на центре!

...