Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Задать центр вращения (http://www.flasher.ru/forum/showthread.php?t=124258)

Mtnt 24.04.2009 21:25

Задать центр вращения
 
Доброго времени суток.

Ситуация следующая: нарисовал, я, скажем, треугольник, создал из него Movie clip.

Захотел я его покрутить с помощью изменения свойства rotation, только вот беда, центр вращения у него находится на месте пересечения диагоналей прямоугольника, обрамляющего его, а не на месте пересечения его медиан (треугольник равносторонний).

Следовательно возник вопрос: как задать точку, вокруг которой он будет вращаться?

Lou 24.04.2009 21:53

Правой кнопкой по вашему клипу ->Edit-> ставьте его куда хотите.
p.s. заодно и узнаете, где у него центр вращения на самом деле.

SamFR 27.04.2009 00:49

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

Цитата:

Сообщение от Mtnt (Сообщение 815334)
...центр вращения у него находится на месте пересечения диагоналей прямоугольника, обрамляющего его

Для справки: вращение мувиклипа производиться относительно точки (0,0).

RenoVATio 23.05.2009 13:58

Проще всего задавать вращение в режими правки экземпляра символа, вызвав панель Align и при нажатой кнопке To stage нажать Align vertical center, затем Distribute horisontal center.

Stargazer 23.05.2009 15:03

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

Герыч 23.05.2009 15:54

Раз уж зашёл вопрос.. а программно как?

Stargazer 23.05.2009 16:05

А программно вращение всегда будет происходить вокруг точки (0, 0).

AlexDesinger 23.05.2009 16:18

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

TERRORist 23.05.2009 16:54

AlexDesinger не надо такому людей учить...

Герыч, юзайте Transform Matrix

хорошая статья http://www.senocular.com/flash/tutor...ansformmatrix/

Stargazer 23.05.2009 17:01

Цитата:

Сообщение от TERRORist (Сообщение 822384)
AlexDesinger не надо такому людей учить...
Герыч, юзайте Transform Matrix

Здесь я не согласен. Матрица сделает точно то же самое. Нельзя повернуть мувиклип вокруг иной точки, чем нулевая.
То есть, матрица, остаётся хорошим вариантом - но дополнительных возможностей в плане вращения она не даёт.

TERRORist 23.05.2009 17:06

вы статью не смотрели

RenoVATio 23.05.2009 17:54

Цитата:

Сообщение от Stargazer (Сообщение 822349)
По-моему, если выбрать инструмент transform - то появляется дополнительный белый кружок, который указывает, вокруг чего вращать.

Да, это так, но програмно мувик вращается вокруг крестика, который виден, если в его контекстном меню выбрать Edit и перейти к редактированию символа.
И, к стати, вращать можно только мувику экшеном, потому что ActionScript на символ Graffic не действует.

Stargazer 23.05.2009 18:17

Цитата:

Сообщение от TERRORist (Сообщение 822389)
вы статью не смотрели

Пробежался глазами. Продолжаю придерживаться того же мнения.

Конечно, у меня нет возможности полностью разобраться со всеми деталями той статьи, но с матрицей трансформации я много успел поработать - так что мне кажется, что я понимаю в том, что говорю.

Особого преимущества в данном случае матрица не даёт. Проще сдвинуть дочерний клип на минус половины размеров. Поэтому я согласен с предложением AlexDesigner-а и не согласен с вашим выражением "не надо людей такому учить". Очень даже надо.

TERRORist 23.05.2009 18:42

Ну не знаю... там примеры скомпиленные - вроде как раз то что топик стартер хотел

контейнер как то не по ООП'овски просто))))

ИМО

Stargazer 23.05.2009 20:35

Цитата:

Сообщение от TERRORist (Сообщение 822413)
контейнер как то не по ООП'овски просто))))

Ну, так просто вертеть матрицей тоже не удастся.
Если по ООП - то предлагаете перегрузить чтение/присваивание матрицы и выполнять пересчёт?
Можно, но сложно. Да и ненадёжно. По крайней мере, я бы не стал так делать.

Можно унаследоваться от Matrix и добавить новые методы, которые позволяют задать матрицу относительно произвольной точки. Это мне кажется более правильным.

А по факту - работать будет точно так же, как если бы клип был вложен в другой клип.

wvxvw 23.05.2009 21:48

Цитата:

Сообщение от Stargazer (Сообщение 822423)
А по факту - работать будет точно так же, как если бы клип был вложен в другой клип.

Никогда в жизни оно точно так же работать не будет: способ задать координаты и вращение через матрицу - самый оптимальный и по быстроте и по объему кода, а вращать 2 клипа один в другом - это примерно из серии, когда на то, чтобы закрутить лампочку четверо поднимают пятого на стуле до потолка и крутят его в одну стотону, а еще четверо крутят в обратную, чтобы голова не закружилась...
Матрица - это самое близкое к нативному предтавлению плеера о грфических объектах, т.е. на присвоение новых значений уйдет минимум времени, кроме того, это всего 1 сеттер который нужно дернуть, а не 6... ну и все-таки матрица раз так в 5 меньше по объму занимаемой памяти чем самый примитивный спрайт...

http://code.google.com/p/e4xu/source...i/Preloader.as
Да, кстати, пример использования.

Stargazer 23.05.2009 22:14

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

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

zafod 23.05.2009 22:33

Цитата:

Сообщение от Stargazer (Сообщение 822432)
Автор спрашивал только о том, как задать точку, вокруг которой происходит вращение. Один из вполне пригодных способов - сдвигать вложенную графику. Есть такой способ? Есть. Для новичка он пригоден и удобен. Мой ответ был адресован не для вашего уровня, а для тех, кто спрашивал.
Если для вашего проекта вы хотите реализовать сложение матриц - на здоровье. Но вы, наверное, не будете спрашивать на форуме как это сделать.

Не согласен полностью. С самого начала изучения флеша желательно иметь представление о векторных операциях, плоскостях и кривых. Начало разделов MSDN по DirectX и OpenGL начинается с изучения основ линейной алгебры дла первого курса института. Поэтому разберитесь с матрицами - это избавит вас от многих проблем в будущем.

Mur4ik 23.05.2009 22:41

http://www.flasher.ru/forum/showpost...83&postcount=9

Stargazer 23.05.2009 22:59

Сейчас заметил, что в AS3 есть любопытный класс MatrixTransformer, который позволяет (в том числе) повернуть существующую матрицу относительно какой-нибудь точки. При таком раскладе матрицы получают явное преимущество.

UPD: Хотя поспешил. Не явное. Но дополнительные пару очков в свою пользу они набирают.

firsoff 23.05.2009 23:20

вот именно MatrixTransformer + Matrix, покрывают практически все требования к геометрическим преобразованиям.

Герыч 24.05.2009 15:52

Всё, поглядел класс Matrix(там не 2*2, а 3*3! а это хорошо для 2д), понял, что вращение вокруг произвольной точки легко реализовать.
Вроде можно так:
Код AS3:

var m:Object = myDisplayObject.transform.matrix;  
 
m.translate(-cx,-cy);
m.rotate(angle);
m.translate(cx,cy);
myDisplayObject.transform.matrix = m;


derhab 24.05.2009 18:02

выше уже упоминали, есть класс MatrixTransformer и у него методы для вращения вокруг произвольной точки:
Код AS3:

MatrixTransformer.rotateAroundInternalPoint(matrix, x, y, angleDegrees);
MatrixTransformer.rotateAroundExternalPoint(matrix, x, y, angleDegrees);


Герыч 24.05.2009 19:17

Но делает она то же самое и тем же методом!) Максимимум в чём их решение отличается от моего-тем, что они сразу задают коэфиициенты a,b,c,d,tx,ty, а не просчитывают в 3 этапа. Но сути не меняет

iNils 24.05.2009 19:24

Герыч, для оформления своего кода надо использовать теги [code][/code]

Добавлено через 43 секунды
Цитата:

Сообщение от Герыч (Сообщение 822620)
Но делает она то же самое и тем же методом!) Максимимум в чём их решение отличается от моего-тем, что они сразу задают коэфиициенты a,b,c,d,tx,ty, а не просчитывают в 3 этапа. Но сути не меняет

Раз сути не меняет, то можно и вручную считать, А то что это вы матрицами пользуетесь? :D

Ляксей 14.06.2009 10:12

Я вот такое использовал, если кому надо
Код AS3:

//---------------------------------------------------------------------------------
                // ф-я вращения клипа вокруг центра при точке привязки Top-Left
                //mc - клип, который будем вращать
                //angle - в градусах       
                function SetRotaionAroundCenter(mc:MovieClip,angle:Number)
                {
 
                        // находим центр клипа
                        var old_rot = mc.rotation;
                        mc.rotation= 0;
                        var w = mc.width;
                        var h = mc.height;
                        mc.rotation= old_rot;
                        var center_point = new Point(w/2,h/2);
                        var matr = new Matrix();
                        matr.rotate((old_rot/180)*Math.PI);               
                        center_point = matr.transformPoint(center_point);
                        center_point.offset(mc.x,mc.y);        //теперь это настоящая точка нахождения центра клипа
 
                        //находим точку , где после поворота вокруг центра клипа будет находиться
                        // его изначальная точка привязки (Top-Left)
                        var new_pos = new Point(-w/2,-h/2);
                        var matr1 = new Matrix();
                        matr1.rotate((angle/180)*Math.PI);
                        new_pos = matr1.transformPoint(new_pos);
                        new_pos = new_pos.add(center_point);               
                        mc.rotation= angle;
                        mc.x = new_pos.x;
                        mc.y = new_pos.y;
 
                }



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

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