Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Set transformation point программно (http://www.flasher.ru/forum/showthread.php?t=148340)

bumb0x 28.12.2010 13:02

Set transformation point программно
 
Здравствуйте, такой вопрос: можно ли программно задавать координаты точки преобразования?

iflamberg 28.12.2010 13:15

Нет. Много раз обсуждалось. Попробуйте погуглить или поиск по форуму.

Hidest 28.12.2010 13:53

Еще один кандидат на прикрепленную тему... Хотя, таких частых тем полно, будет первая страница вся в прикрепленных...

Программно нельзя, используйте контейнер, в котором смещайте свой клип как вам надо, а в дальнейшем странсформируйте уже контейнер как надо.

drnet_ua 28.12.2010 14:04

можно, но проще поместить его в спрайт и сместить как надо.

Добавлено через 4 минуты
вот решение попроще

Hidest 28.12.2010 14:27

Это просто имитация, сама точка регистрации клипа никуда не смещается. То же самое можно сделать через матрицы трансформации.

Все подобные решения являются заменой, а не реальным изменением точки (можно просто все чайлды клипа еще подвинуть как надо), хотя эти действия и приводят к нужному результату.


UPD: блин, речь же о точке трансформации, а не о точке регистрации. Тогда да, в таком контексте можно.

alatar 28.12.2010 14:51

Цитата:

Все подобные решения являются заменой, а не реальным изменением точки
Нет никакой точки, соответсвенно не может быть "реального" или "нереального" ее изменения.

Hidest 28.12.2010 15:37

Я уже написал, что сначала писал о точке регистации, а потом понял, что нужна была точка трансформации.. В Flash IDE при трансформации вручную можно эту точку перемещаться как хочется. Автору нужно было именно это, насколько я понял. Но вот никакого метода setTransfomationPoint() у нас, естественно нет, поэтому я и сказал про имитацию именно функционала IDE. Естественно, что точка, относительно которой происходит трансформмирование - понятие абстрактное.

drnet_ua 28.12.2010 18:41

точка есть. это точка (0,0). сдвинуть ее нельзя, можно сдвинуть все остальное относительно ее.

при особом желании можно все содержимое обьекта сдвинуть поштучно, а потом сдвинуть то что получилось, но это геморой.

вращение например, через матрицу делают, но у меня с первого раза не получилось :) пришел к тому что порекомендовал Hidest

alatar 28.12.2010 18:49

Цитата:

точка есть. это точка (0,0). сдвинуть ее нельзя, можно сдвинуть все остальное относительно ее.
Это не точка, а начало координатных осей. Ну или их пересечение.
Цитата:

вращение например, через матрицу делают, но у меня с первого раза не получилось пришел к тому что порекомендовал Hidest
С матрицами все просто (по сути особой разницы с контейнером нет, за исключением контейнера). Сначала матрицу трансформации объекта надо обнулить (по-сути все трансформации объекта происходят через матрицы). Потом сдвигаем матрицу в нужные локальные координаты объекта. Трансформируем матрицу. Сдвигаем обратно в 0, 0 (либо учитываем сдвиг на следующем шаге). И сдвигаем обратно в координаты в которых объект был до трансформации.

passertm 28.12.2010 18:53

на счет частозадаваемых вопросов не былобы лучше сделать одну прикрепленную тему и там списком давать ссылки на частозадаваемые вопросы. это решилобы часть вопросов.

alatar 28.12.2010 18:55

Цитата:

это решилобы часть вопросов.
Ага, так же как поиск по форуму. :)

Dukobpa3 28.12.2010 18:56

Присоединюсь к вопросу автора.

alatar, просто с матрицами, да не просто:)
К примеру я с успехом применяю матрицу для смещений всяких. Вращение тоже работает ок - пматрицей ноль клипа передвинул и ок.

А вот со скейлами полдня промучался и ничего не получилось. Скейл при любых раскладах работал из лево-верха клипа, а не из нуля оного. (хотя такое же смещение нуля помогало мне когда надо было крутить клип вокруг этого самого нуля).

passertm 28.12.2010 19:24

Цитата:

Сообщение от alatar (Сообщение 960543)
Ага, так же как поиск по форуму. :)

ну. согласитесь, поиск это не faq. очень часто бывают темы которые то ли не знаешь как искать. то ли поиск выдает кучу тем не относяшихся к делу

alatar 29.12.2010 01:05

Цитата:

А вот со скейлами полдня промучался и ничего не получилось.
Просто надо учесть, что линейные размеры при увеличении меняются и скорректировать координаты.

Код AS3:

package
{
        import flash.display.DisplayObject;
        import flash.display.Graphics;
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.MouseEvent;
        import flash.geom.Matrix;
        import flash.geom.Point;
        import flash.net.URLRequest;
        import flash.system.System;
 
        public class asTest extends Sprite
        {
                private var _sprite:Sprite = new Sprite();
 
                public function asTest()
                {
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
 
                        draw(_sprite.graphics);
 
                        _sprite.x = 100;
                        _sprite.y = 100;
 
                        addChild(_sprite);
                        _sprite.addEventListener(MouseEvent.CLICK, scaleAroundPoint);
                }
 
                private function draw(gr:Graphics):void
                {
                        gr.beginFill(Math.random()*0xFFFFFF);
                        gr.drawRect(0, 0, 50, 50);
                        gr.endFill();
                }
 
                private var scale:Number = 2;
 
                private function scaleAroundPoint(event:MouseEvent):void
                {
                        scale++;
 
                        var target:DisplayObject = DisplayObject(event.currentTarget);
 
                        //точка вращения
                        var transformPoint:Point = new Point(25, 25);
 
                        var unscaledWidth:Number = target.width / target.scaleX;
                        var unscaledHeight:Number = target.height / target.scaleY;
 
                        var offsetX:Number = transformPoint.x / unscaledWidth;
                        var offsetY:Number = transformPoint.y / unscaledHeight;
 
                        /* корректируем координаты объекта.
                        Необходимо восстановить координаты объекта относитльно
                        точки вращения без увеличения */

                        var targetX:Number = target.x + target.width * offsetX - target.width * offsetX / target.scaleX;
                        var targetY:Number = target.y + target.height * offsetY - target.height * offsetY / target.scaleY;
 
                        var m:Matrix = new Matrix();
 
                        m.translate(-transformPoint.x, -transformPoint.y);
                        m.scale(scale, scale);
                        m.translate(transformPoint.x, transformPoint.y);
                        m.translate(targetX, targetY);
 
                        target.transform.matrix = m;
                }
        }
}


Dukobpa3 29.12.2010 01:12

Спасибо Кэп, я именно так и сделал:)

Вопрос не про "подогнать по пикселам после скейла", а в том что если делать это в ИДЕ - то смена центра влияет и на центр скейла.
Кодом у меня это сделать не получилось, кроме как подогнать так как ты привел в своем примере.

alatar 29.12.2010 01:15

FlashIDE просто сдвигает содержимое в контейнере относительно 0,0. Что значит не получилось кодом?

Dukobpa3 29.12.2010 01:24

Не получилось - значит при любых раскладах скейлится из лево-верха - вправо-низ.
И кроме как центровать в процессе - ниче не придумалось.

Хотя я так полагал что скейл работает из точки нуля мувика (черненький крестик в ИДЕ). И вот знатоки вопрос:
- Это я неправильно думаю про скейл и он при любых раскладах таки работает из лево-верха, и пофиг где ноль
- или я прав насчет скейла, но все танцы с матрицей на самом деле делают что-то другое, но не сдвигают ноль
- или я просто что-то не так делал, и скейл у нас должен быть из точки нуля, и матрица должна свигать именно этот ноль.

Wolsh 29.12.2010 01:41

Длина стороны прямоугольника зависит от того, где находится начало координат?

alatar 29.12.2010 01:43

Все трансформации работают относительно 0,0 клипа (включая скейл и матрицу).
Матрица сдвигает объект, а не его 0,0.

Dukobpa3 29.12.2010 02:24

А не все ли равно, сдвинуть ноль относительно объекта (что и звучит то абсурдно), или сдвинуть объект относительно нуля?

В итоге этих действий мы получим(ну это как я себе понимаю) один результат - ноль будет в определенной точке клипа (не лево-верх клипа, но что-то другое).

alatar 29.12.2010 02:32

Ноль всегда будет в нуле, ложки нет никаких верхов-низов. Другое дело, что содержимое этого клипа может находиться в отрицательных координатах. Так вот, матрица на содержимое клипа тоже никак не влияет, в том смысле, что не сдвигает относительно нуля клипа.

Dukobpa3 29.12.2010 02:40

О. теперь понял.

Так а на что же тогда влияет матрица? Куда там она что двигает?

alatar 29.12.2010 02:43

Она смещает сам объект в родительских координатах. При поворотах объекта создается иллюзия, что объект повернулся относительно некоторой точки.

Dukobpa3 29.12.2010 02:50

Т.е. получается чтобы действительно сдвинуть центр - нам нужно делать какой-то спрайт-обертку. И интересующий нас спрайт пихать в эту обертку с отрицательными координатами нашего нужного центра?:)
Только так?

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

alatar 29.12.2010 03:02

Ничего унылого в этом методе нет, за исключением лишнего контейнера (если он делается только для трансформаций). Но сам плеер работает через матрицы, по-крайней мере матрица влияет на x, y, width, height, scaleX, scaleY и наоборот, эти параметры влияют на матрицу.

Dukobpa3 29.12.2010 03:06

Ок, спасибо.

Ура, товарищи, истина найдена:)
Держи плюс в карму:)


Часовой пояс GMT +4, время: 15:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.