![]() |
Вращение изображения вокруг центра ViewPort
Ситуация такова: есть изображение, которое лежит внутри контейнера фиксированного размера, оно может быть как больше так и меньше контейнера; у контейнра установлено свойство clipAndEnableScrolling, поэтому все, что за пределами контейнера невидимо. Надо уметь вращать изображение вокруг точки, которая является центром видимой зоны.
Код AS3:
|
Попробуйте вот так, point это точка во круг которой крутится объект.
Если работать не будет, хотя вроде должно, то на форуме много тем, Вы напишите если что, я попробую найти.. Аааа, я Вас вспомнил:) я тоже сейчас делаю трансформацию и мне кажется, что подход предложенный мной, может не подойти. Код AS3:
|
Пока не пробовал, но очень походе на мой способ. Мне кажется, что всю дело в:
Код AS3:
|
помещайте изображение в контейнер в координаты
Код AS3:
|
Во-первых, мне надо вращать изображение не вокруг его центра (как это сделать я знаю), а вокруг центра контейнера, в котором оно находится.
Во-вторых, я могу двигать изображение с помощью мыши, так что фиксировать его позицию никак нельзя. |
Способ с -х-у может подойти, но обяжет все расчёты делать с минусами и не позволит вращать во круг произвольно взятой точки, что обязательно должно присутствовать в трансформе. я как сделаю, то покужу в Вашей теме, что у меня получилось, но пока я застрял на неопределённое время с рамкой, как в FS.
|
Код AS3:
|
Цитата:
Добавлено через 21 минуту И погрешности не только в rotation накапливаются, это касается и x,y и может ещё чего. |
Потому что, как и мой первый вариант, он вращает правильно всего 1 раз.
Код AS3:
|
Sonet конечно я могу ошибаться, но я столько уже экспериментировал с трансформацией, что могу сказать - в коде нет ошибок. Вы можете просто включить его на EF и смотреть, как он крутится и крутится и не сбивается, даже если угол подавать вот 0,0000545454545 такими значениями.
Ошибка может крыться в том, что я пока тоже не делал, а именно, расчёт угла в зависимости от курсора. Хотя сложного вроде не чего в этом нет. |
Ну не знаю. Мне надо вращать относительно видимой области. Наверное я не понимаю, как правильно вычислить эту точку (хотя скейлинг, без помощи матрицы, сделал).
Если не трудно, можете сделать пример, где есть изображение 200*200 внутри контейнера 100*100 с clipAndEnableScrolling = true. И чтобы оно вот так по таймеру вращалось вокруг центра видимой области. |
Цитата:
И, судя по clipAndEnableScrolling тема переезжает во флекс. |
Цитата:
Это свойство я использую, и привел в пример только, чтобы пояснить, что контйенер скрывает части изображения, выступающие за его границы. Геометрия от этого не меняется, поэтому я создал тему в более популярном разделе AS 3.0. |
Вложений: 1
Цитата:
Цитата:
Код AS3:
|
Вложений: 1
А почему вы вращаете _transformContainer да еще и относительно такой точки ( не понимаю, почему учитываются его x и y координаты)? У меня максимально просто случай: изображение и контейнер с установленным scrollRect. Метод будет просто принимать на вход изображение и угол и поворачивать его относительно центра scrollrect (еще одно несоответствие, т.к. у вас scrollRect тоже поворачивается, а мне надо, чтобы я всегда видел прямоугольник, полностью заполненный изображением, которое в свою очередь может быть повернуто).
Я попытался перенести этот код к себе, но у меня не работает ну никак. Код AS3:
Кстати, у вас похоже тоже погрешность накапливается (от этого никуда не деться?) - после нескольких минут вращения изображение прилично так сдвинулось. |
Цитата:
Цитата:
Цитата:
Цитата:
|
В случае передачи изображения, какую точку надо передать? Она у вас не в методе считается, и мне не понятно почему именно так (не ясно почему вообще в расчет берутся х и y координаты).
|
Координаты у точки должны быть те, во круг которых вы хотите вращать.
Цитата:
Вот как можно ещё сделать. Добавлено через 5 минут Вы в коде считаете так, что ширина контейнера равна видимой области, но это не так. |
Цитата:
+ я должен считать точку внутри метода, т.к. я могу двигать изображение и т.о. точка всегда меняется. Мне не ясно почему вы учитываете х и у координаты вращаемого объекта, ведь точку надо задавать в координатах этого же объекта. |
Цитата:
Но это уже Ваша история и помочь Вам я не могу. Удачи Вам! А я пойду экспериментировать с рамкой :) |
Как бы есть некая область, куда пользователь может загрузить изображение (размеры получаются с сервера) - контейнер. Туда пользователь имеет возможность загрузить изображение. Оно может быть больше или меньше этой области, показываться должно изначально как есть. Соответственно если зображение больше, то лишние края прячутся контейнером. Пользователь может двигать, вращать и скейлить изображение внутри контейнера. Сам контейнер при этом должен оставаться неподвижен и не изменен. Получаается как бы окно, через которое мы видим кусок изображения и все модоификации должны производиться относительно этого окошка: скейлинг и вращение относительно центра окна, перемещение с учетом отступа относительно топлефт угла окна, а не картинки. И я все сделал, кроме поворота. Поворот работать не хочет никак. Лучший вариант валится из-за погрешности.
|
Мне кажется я видел такое в ВК, аватара там вроде так же сделана.
И тут опять-таки мне кажется, что Вы немного сбились. Вот загрузил я большое фото и мне нужно его по желанию подогнать под размер. Во первых я должен видеть всё изображение , по верх которого нарисована рамка конечного результата. Вращение и скейл должен проходить относительно центра этой рамки. Как бы я фото не скейлил и не перемещал, то всё это для того, чтобы в итоге я мог подкрутить по отношению центра контейнера. А если сделать вращение да и скейл по отношению не центра рамк конечного результата, то получится не плохая головоломка. Код который показал Вам я, рабочий и если делать как у меня то не чего не смещается. Проблема не в коде а в Вашем видении. Для примера разберём эту строчку - Код AS3:
Для поиска его центра нужно к координате х прибавить половину его ширины 50. Но мы поворачиваем его на 45 градусов. Теперь его ширина не 100, а равна его диагонали в состоянии без вращения и координаты смещены. Под углом 90 градусов его координаты будут в 200, 200 и прибавив к ним ещё половину ширины вы центр смещаете воооообще не туда. Вам нужен центр РАМКИ! |
вы отбраковываете нормальные варианты, и пытаетесь все усложнить.
есть главный контейнер- окно (назовем его window), в него в центр помещается другой контейнер(назщовем его innerBox и этот контейнер больше не двигается, или двигается при изменении размеров window ставится опять по центру ), в inner box помещаем изображение в координаты Код AS3:
|
Цитата:
Akopalipsis Это у меня очевидно не верная версия. Я пытался подогнать ваш код под свои нужны. Дело в том, что у меня картинка находится внутри статичного контейнера, который сам себе scrollRect. Т.е. скролл рект как бы имеет координаты (0,0) и ширину/высоту такую же, как у контейнера. И эти значения не меняются никогда. Картинка внутри может иметь отрицательные координаты по этой причине. Поэтому по-хорошему должны быть вот такие сещения: Код AS3:
|
Цитата:
|
Цитата:
|
Код AS3:
|
Цитата:
У меня всего 2 объекта: контейнер, который обрезает все, что за его пределами (т.е. его ширина, высота фиксированы, если в него поместить что-то большее, чем он сам, то они не изменятся, лишний контент будет невидим, контент может иметь отрицательные координаты), и картинка внутри него. |
Цитата:
|
К чему эта картинка? Кстати у меня задача немного проще, т.к. шаг поворота 90 градусов.
|
Цитата:
|
Вложений: 1
Akopalipsis
Я не понимаю, что вы хотите мне сказать. Всем ясно как будут менять координаты. Приклдадываю некоторую иллюстрацию. Перед поворотом, как я понимаю, мы транслируем точку внутри изображения, которая для пользователя видна, как точка-центр контейнера в topLeft. Потом поворачиваем и транслируем обратно. Кстати, вы не пробовали мой метод со switch-блоком? Он работает полностью как надо, но накапливает погрешность. Он статический, на вход нужен компонент, который будем вращать (в моем случае объект класса Image, но подойдет любой) и новый угол вращения (90, 180, 270 и т.п. кратное 90). Создайте контейнер, установите ему clipRect равный его же размерам и засуньте в него изображение. |
Делаю ещё одну попытку :)
Цитата:
Мой примитивный код, построен на том, что центр, будь то рект-контейнер или что-то другое, ПОСТОЯНЕН! Тут я немного объясню то, что Вы должны знать, но все-же.. Есть сцена, у неё точка регистрации находится в topLeft. Вот мы создаём контейнер и присваеваем его точки регистрации (300, 300). В этот контейнер кладем картинку в координаты (0,0) и выглядеть это будет так, как буд-то она находится в координатах (300,300), так-как у контейнера уже другая система координат. Продолжаю, если Вы двигаете картинку ( видимую её часть ) в пространстве, то это не как не должно сказываться на координаты центра контейнера!!!! Вы понимаете? Двигать контейнер или что-то в нем, это не значит, что его собственная система координат меняется! Точка центра как была в координатах (50,50), так она там и будет, даже если Вы сам контейнер за пределы монитора сдвинете! Продолжаю, Вам нужно, как Вы сами говорите, двигать ОТНОСИТЕЛЬНО ЦЕНТРА КОНТЕЙНЕРА, ширина и высота которого ВСЕГДА ПОСТОЯННА! Так зачем же точку центра искать исходя из-за положения картинки? Центр как был в (50,50) так он там и будет. Продолжаю, смотрите на свою картинку, видите в topLeft невидимой области находится настоящая точка регистрации картинки. Противоположная часть называется topRight. Вот Вы повернули картинку на 90 градусов, где будет точка регистрации картинки? Там, где в самом начале была точка topRight и то это с условием, что картинка КВАДРАТНАЯ!!! А ширина становиться равной длине! Возьмите и нарисуйте мои слова и свои слова. Когда Вы это поймете, то я скажу что делать дальше. |
Это все я понимаю.
|
Расскажите какая у Вас вложенность, что в какой контейнер вставляется, и на сколько градусов Вам нужно крутить и относительно чего. я сделаю так же и покажу.
|
У меня 1 контейнер (сцену я не считаю за контейнер, т.к. мне не надо создавать ее вручную). Я задаю ему позицию и размеры, они никогда не меняются. В него я вкладываю изображение, которое может быть как больше, так и меньше, чем контейнер. У контейнера выставлено проперти clipAndEnableScrolling. Как я понимаю это равносильно выставлению проперти scrollRect со значниеми (0, 0, container.width, container.height) - контейнер сам себе scrollRect.
Вращение на величину кратную +-90 градусов. Повернуть надо изображение (внутри контейнера) относительно центра видимой области. В любой момент изображение может быть сдвинуто (просто меняю х и у координаты) или промасштабированно (тоже относительно центра, делаю без матрицы, просто применяю новый scale фактор и смещения по х и у). |
Пока могу сказать только одно, не знаю как у clipAndEnableScrolling, но у scrollRect ширина и высота равняется, так же как и у обычного контейнера, его содержимому.
|
Хмм. clipAndEnableScrolling влияет только на видимость контейнера. Т.е. допустим я выставил ширину и высоту контейнера по 100, а картинку вставил 200*200. Если это проперти установлено, то я буду видеть только то, что попало в прямоугольник 100*100 и размеры контейнера не будут увеличены.
У меня вопрос возник: matrix.translate изменяет x и y координаты компонента, или перемещает pivot point на заданные величины? Я почему-то считал, что последнее. |
я пока воздерживаюсь от комментариев, так как сам на данный момент не знаю железного решения.
Без сохранения начальных координат сделать можно, но на столько затратно, что я лучше промолчу.. |
Нашел решение без свича. Работает, но накапливает погрешность.
Код AS3:
Финальный вариант, может быть кому-то будет полезен. В конце чуть-чуть хитрим - округляем итоговый угол. На глаз все работает вроде хорошо. Код AS3:
|
| Часовой пояс GMT +4, время: 23:57. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.