Показать сообщение отдельно
Старый 17.11.2012, 16:06
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 4  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Конкретная архитектура не слишком принципиальна. Главное, чтобы вид был отделен от модели и его было просто поменять. Матрицами проще работать, чем scale/x/y/rotation. Через них все преобразования делаются единообразно и комбинации преобразований тоже легко выражаются. Через x/y/scale/rotation повотор вокруг произвольной точки, например, не так просто делается (для уже повернутого объекта).

Со скейлом все просто. Пусть мы скейлим относительно точки x, y. Тогда матрица будет
Код:
|1 0 x|   |sx 0  0|   |1 0 -x|
|0 1 y| * |0  sy 0| * |0 1 -y| = Ms
|0 0 1|   |0  0  1|   |0 0  1|
sx = 210 / 200, sy = 320 / 300
Соответственно, там все нужно умножить. X и Y при этом параллельны X и Y соответствующей области. Если мы скейлим повернутую группу, там все похоже. Если группа имеет трансформацию относительно сцены Mgt, то указанный скейл в координатах группы (визуально повернутый прямоугольник растягивается) будет Mgt*Ms*(Mgt^-1). Т.е на эту матрицу тоже можно умножать все объекты из группы и они попадут в правильную позицию (но тогда на матрицу группы мы отдельные элементы для получения эффективной матрицы не умножаем, естественно).

С текстом не совсем понятно, что именно вы хотите. Я бы как раз ожидал, что после скейла текст пропорционально уменьшится вместе со всеми остальными объектами группы. А иначе я нарисую кнопку, поскейлю, и она разъедется. Хотя вообще это тоже не большая проблема. Тоже решается матрицами . Пусть Mf - эффективная матрица текстового поля (либо просто матрица, либо произведение всег групп на собственную матрицу, если работать с раздельными матрицами). Тогда вычисляем "систему координат" текстового поля в экранных координатах.
Код:
          |1|        |0|            |0|        |0|       |x' 0  0|
xs = Mf * |0| - Mf * |0|, ys = Mf * |1| - Mf * |0|, Mt = |0  y' 0|
          |1|        |1|            |1|        |1|       |0  0  1|
x' = 1/sqrt(xs*xs), y' = 1/sqrt(ys*ys)
xs, ys - единичные вектора текстового поля в экранной системе координат. x', y' - нормирующие коэффициенты (вы же хотите, чтобы длины единичных отрезков сохранялись, поэтому они так и выбраны). Поэтому нужно еще домножить матрицу трансформации справа (именно справа!) на Mt. А еще умножить "исходную" ширину текстового поля на x' и высоту на y' (потому что относительно текста они изменились). Итоговая матрица для вывода текста будет (Mf * Mt). Все преобразования меняют только Mf! Mt (а также x' и y') вычисляются только в момент вывода текста на экран (при рендеринге) и пересчитывается при изменении Mf. Очевидно, что текст "относительно группы" при таких требованиях может выглядеть совершенно не так, как относительно экрана.


Последний раз редактировалось maxkar; 17.11.2012 в 16:21.