AS3: вращать объект DisplayObject с помощью мыши - PullRequest
0 голосов
/ 06 августа 2010

Я в основном пытаюсь создать менеджер преобразования экранных объектов, который позволит мне масштабировать / вращать объекты. В настоящее время я пытаюсь выяснить, как вращать объект, чтобы его угол следовал за текущими x и y мыши.

Пример 1 http://www.freeimagehosting.net/uploads/ae697efb80.jpg Пример 2 http://www.freeimagehosting.net/uploads/1a968e5e2b.jpg Пример 3 http://www.freeimagehosting.net/uploads/1270816f01.jpg

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

ОТВЕТ НА ТРОБАДУР

Ваш ответ настолько блестящий, что я вообще не могу его понять. Позвольте мне объяснить, что я могу понять, а что нет. Вот что я делаю / не понимаю:

Сначала сохраните то, что будет в центре изображения, так называемую точку регистрации, вокруг которой мы будем вращать все:

var box:Sprite = new BeautifulSprite();
box.width = box.height = 100;
/* ... */
var registrationPoint:Point = new Point(box.x + box.width / 2, 
        box.y + box.height / 2);

Я прав до сих пор? Если так, я продолжу.

Во-вторых, обозначить исходное положение мыши:

var mouseDownPoint:Point = new Point(box.mouseX, box.mouseY);

В-третьих, храните «вектор». Проблема в том, что я не уверен, что вы имеете в виду под вектором. Я знаком с типами Vector в Java и AS3, так как они хранят список значений определенного типа. Помимо этого, я потерян.

var vector:* = WTF.forReals();

Затем сохраните расстояние между registrationPoint и mouseDownPoint. Я помню, как учился вычислять расстояние между двумя точками еще в старшей школе, поэтому я уверен, что смогу найти формулу для расстояния между двумя 2d точками.

var distance:Number = calculateDistance(registrationPoint, mouseDownPoint);

Я знаю, что приближаюсь! Затем, чтобы определить ограниченный масштаб, мы получаем текущее местоположение мыши, определяем его расстояние до registrationPoint и делим его на distance.

var constrainedScale:Number = calculateDistance(registrationPoint, new Point(mouseX, mouseY)) / distance;

Мой вопрос здесь такой: как получить значения, когда я не хочу их ограничивать, например, scaleX и scaleY?

Теперь, чтобы получить фактическое вращение вокруг точки регистрации, я полностью потерян. Не могли бы вы помочь мне, используя переменные, которые я определил выше?

1 Ответ

3 голосов
/ 06 августа 2010

Обозначим координаты мыши в центре шкалы / поворота как (x0, y0) и координаты мыши в углу в немасштабированном, не повернутом состоянии как (x1, y1).Сохраните точку (x0, y0) и кешируйте как вектор, так и расстояние между (x0, y0) и (x1, y1).Обозначим кешированный вектор как v0, а расстояние - как d0.

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

Чтобы получить угол поворота, сначала рассчитайте вектор между (x0, y0) и текущими координатами мыши.Обозначим это через v. Затем рассчитайте угол, используя формулу точечного произведения

v.v0 = | v |d0 cos (theta)

, что даст вам что-то между 0 и пи.Чтобы попасть в правильный квадрант, просто изучите знак перекрестного произведения v и v0 и скорректируйте его соответствующим образом.

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