Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Помогите реализовать очень плавное и медленное вращение большого обьекта. (http://www.flasher.ru/forum/showthread.php?t=103523)

Nuclear_soul 07.11.2007 00:52

Помогите реализовать очень плавное и медленное вращение большого обьекта.
 
Вложений: 1
Всем привет.

Сразу оговорюсь что я нашел подобную тему на этом форуме, но описанный там способ меня не устраивает, об этом чуть ниже.

Задача состоит в следующем: очень большая шестеренка 4000 х 4000 пикселей, должна очень медленно и плавно, едва заметно вращаться вокруг своей оси с частотой 24 фпс. В кадре видна лишь ее малая часть с зубцами.

На форуме нашел 2 варианта:
Код:

onClipEvent (enterFrame) {
_rotation=+0.1;
}

Код:

_root.onEnterFrame = function() {
        this.mc._rotation -= 0.1;
};

в обоих случаях вращение дерганое, и нифига не медленное.

Но первое что пришло на ум это сделать без скриптов, задав вращение для моушен твина. Задаю один поворот за 3000 кадров - всеравно все дергается.

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

Вообщем картина такая, буду признателен за помощь.

Остается добавить следующие данные:

Шестеренка отрисована в иллюстраторе (CS3).
Флеш тоже CS3

fla исходник прилагаю (в 8й версии):

Заранее спасибо.

silin 07.11.2007 01:48

Вложений: 1
как вариант: тело(сам круг) оставить в покое, а двигать зубцы по кругу..
сколько и как подбирать надо, но это детали..
а c _rotation действительно беда: перерисовывает когда захочет..

aQuestion 07.11.2007 02:29

а апдейтАфтерЭвент не помогает? эдит: посмотрел вложение и понял, что нет. видимо, у _ротейшн лимитэд резолюшен.

Nuclear_soul 07.11.2007 02:30

Ооо... спасибо брат, буду разбираться... ибо познания в экшенах мои весьма скудны... может посоветуешь мне с чего начать в осмысление всех этих var'ов ?

А куда спрятан сам клип с зубцом? Какую роль играет клип с кругом?
Если не сложно, объясни конструкцию?

Цитата:

Сообщение от aQuestion
а апдейтАфтерЭвент не помогает?

А по подробнее? Куда и что прописать.

Molecula 07.11.2007 03:02

Там нет зубчатого колеса,...там прямоугольники атачатся, ну, размножаются по окружности и крутятся.

Шестеренка слишком большая, сам объект большой для вращения.

Nuclear_soul 07.11.2007 03:18

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

wvxvw 07.11.2007 03:24

Цитата:

Сообщение от silin
как вариант: тело(сам круг) оставить в покое, а двигать зубцы по кругу..
сколько и как подбирать надо, но это детали..
а c _rotation действительно беда: перерисовывает когда захочет..

Угу, если честно, то лучше такое вручную заанимировать (меняя продолжительность анимации). К сожалению, это правда, дискретность у вращения недостаточная для того, чтобы создать "красивую" анимацию. Но можно попробовать поиграться - поискать более-менее приемлимый результат.
Т.е. ты пытаешься менять поворот на 0.1 градус, а технически флеш в состоянии отрисовать повороты с точностью до 0.3 градуса (поэтому же апдейтАфтерИвент и тому подобные ухищрения не спасут).

silin 07.11.2007 09:16

Цитата:

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

Код:

var zArr=[];//массив для мувикоа-зубцов
var fi0=0;//с какого угла начинаем расставлять
var dfi=Math.PI/128;//угол между зубцами
var x=circle._x;//координаты центра
var y=circle._y;
var r=circle._width/2;//радиус
//плодим сколько-то зубцов
for(var i=0;i<48;i++){
        var z= this.attachMovie("z","z"+i,i);
        z.fi=fi0-i*dfi;//определяем каждому сдвиг по углу
        zArr.push(z);//кладем в массив
}

//крутим
var fi=0;//текущий общий угол поворота
function onEnterFrame(){
        for(var i=0;i<zArr.length;i++){
                var z=zArr[i];//зубец
                var a=z.fi+fi;//его персональный угол
               
                if(a<-Math.PI/2)z.fi+=Math.PI/2;//как уходит за какой-то предел, возвращаем назад
               
                z._x=x+r*Math.cos(a);//ставим куда положено
                z._y=y+r*Math.sin(a);
                z._rotation=180/Math.PI*a;
        }
        fi-=0.00005;//меняем общий угол
}


aQuestion 07.11.2007 10:08

Цитата:

Сообщение от wvxvw
Т.е. ты пытаешься менять поворот на 0.1 градус, а технически флеш в состоянии отрисовать повороты с точностью до 0.3 градуса

больше похоже на 0.25 (0.3 все-таки немного дергается), хорошо бы найти точно на adobe.com

Кстати, можно тогда написать нечто вроде
Код:

updateGear = function() {
        _root.g._rotation -= 0.25; updateAfterEvent ();
};

// virtual "fps" we want for 1 degree rotation
var vfps = 6.0;

setInterval (updateGear, 0.25 * 1e3 / vfps);

скачки останутся, но будут более равномерные.

chingachgoog 07.11.2007 11:16

Не надо никакого скрипта вообще тут. И шестеренки гигантской не надо.
Надо всего лишь несколько кадров видимой части шестеренки (простая тупая анимация со сменой кадров) - остальное отрезать нафиг - только тогда тормозить не будет.

Nuclear_soul 07.11.2007 13:16

Спасибо всем за то что откликнулись. Мне больше всего нравится вариант silin'а так как в итоге он весит меньше всего, да и как-то приятнее когда на скрипте все сделано. Теперь, с комментариями в коде, я думаю разберусь. Ну или в крайнем случае и вправду сделаю раскадровку.

Nuclear_soul 07.11.2007 17:50

Решил таки сделать покадровую анимацию, и опять проблемы.
Почему когда я врашяю обьект фри трансформом, он как-то скачет относительно центра? А когда я в опциях задаю ему ротейт на допустим 0.07 градусов, то происходит то же самое, с каждым градусом происходит изменение размера и X Y координат... странно что функция называется ротейт энд скейл, а где тогда тупо ротейт? хотя скейл стоит 100% поидее ничего меняться не должно... Тоесть я просто жму F6 потом Ctrl + Alt + C (ротэйт энд скэйл) потом энтр. и так много раз, и в итоге с каждым кадром вместо того чтобы просто врашаться обьект еше и изменяет свою форму и позицию странно ейбогу... если руками потом поставить размеры на место то все вращается как надо, но это издивательство какое-то... =(((((((((((
PS
Вопрос не по скриптам, но не отдельную же тему создавать ейбогу.


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

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