Форум 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=214837)

ZergMaster 18.12.2017 12:51

Реалистичная анимация кручения объектов вид сбоку
 
Вложений: 1
Всемпривет!
Занимаюсь сейчас схемкой одного механизма. Создал такую вот анимацю (приложил к сообщению). Все программное, так как количество поршней можно менять, угол главного барабана тоже (стрелочками лево-право).

gidroPump1.swf   (10.7 Кб)


В данной анимации есть недостаток - поршни крутятся с одинаковой скоростью, "ударяяськ" о границы, меняют направление на противоположное. У меня это реализовано пока что очень просто:

Код AS3:

_forsers[i].y += _model.speed*_forsers[i].direction;

то есть сначала я создаю и выставляю на сцену заданное количество поршней (_forsers).
Далее, анимация работает так, что каждый кадр прибавляем к игрику каждого поршня скорость, умноженную на направление поршня (1 либо -1). Когда поршень подходит в endPoint либо startPoint, его direction меняется на противоположный.

Сейчас хочу сделать так, чтобы скорость поршня замедлялась по мере приближения и убыстрялась по мере отдаления от крайних точек. Тогда это будет выглядеть гораздо более реалистично. Но не могу понять, как это лучше сделать.. Можно, конечно, нагромождением ifов, но хочется как-то более красиво. Может быть, у кого-то есть такие варианты?

undefined 18.12.2017 13:24

нужно двигать поршни по синусу.

ZergMaster 18.12.2017 13:28

undefined ага, а синус чего делать?

Добавлено через 5 минут
то есть, насколько я понимаю, нужно делать sin(t)? Получается, что время тут единственный изменяемый параметр..

undefined 18.12.2017 13:37

да, от времени,да, единственный

Zebestov 18.12.2017 14:20

Строго говоря, даже не времени, а угла поворота вала с поршнями.
Вертикальное положение относительно вала произвольного поршня forcer, расположенного на валу в угловой позиции phase, при произвольном положении вала alpha вычисляется по формуле:
Код:

y = Math.sin(alpha + phase) * radius
где radius — расстояние от центра вала до центра поршня.
Таким образом ты получаешь формулу, в которой с течением времени меняется alpha вала, давая новое положение каждого поршня. И кстати, подставив в эту же формулу cos вместо sin, ты получаешь возможность всегда знать, где должен находиться поршень в дисплейлисте —выше вала, или ниже. Ты это по знаку поймешь.

Appleman 18.12.2017 15:49

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

ZergMaster 18.12.2017 16:31

что-то здесь не так.
пробую поставить на сцену два поршня пока что.
Код AS3:

             _radious = 60;
            _phase = 360 / _model.forcesCount;
 
                        for (i = 0; i < _model.forcesCount; i++ )
                        {       
                                _forcers[i].y = Math.sin(_alpha + _phase * i) * _radius;
 
                                trace('_phase ' + i + ' = ' + _phase * i);
                                trace('_forcers[' + i + '] y = ' + _forcers[i].y);
                                trace('Math.sin(_alpha(='+_alpha+') + _phase(='+_phase+') * i(='+i+')) = '+Math.sin(_alpha + _phase * i))
 
                                _mc.forcersContainer.addChild(_forcers[i]);
                        }

при _alpha = 0 трейс выводит

Код:

_phase 0 = 0
_forcers[0] y = 0
Math.sin(_alpha(=0) + _phase(=180) * i(=0)) = 0
_phase 1 = 180
_forcers[1] y = -48.05
Math.sin(_alpha(=0) + _phase(=180) * i(=1)) = -0.8011526357338304

хотя, по идее, оба игрека должны быть равны нулю, ведь они в нулевом угле по разные стороны вала.
Окей, пробую alpha = 180

Код:

_phase 0 = 0
_forcers[0] y = -48.05
Math.sin(_alpha(=180) + _phase(=180) * i(=0)) = -0.8011526357338304
_phase 1 = 180
_forcers[1] y = 57.5
Math.sin(_alpha(=180) + _phase(=180) * i(=1)) = 0.9589157234143065

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

undefined 18.12.2017 16:34

синус принимает радианы, а не градусы

caseyryan 18.12.2017 16:36

А почему ты считаешь синус от угла в градусах? Он же в радианах

ZergMaster 18.12.2017 18:41

Всем огромное спасибо!
Конечно, банальный вопрос получился, но почему-то я не мог до него сам допереть. Что если хочешь реалистично - делай как в реальности. =) + кроме того, сильно сократился код. Потому то у меня и свербило где-то, что я чувствовал - не дело писанину разводить, должен быть простой способ. Еще раз спасибо.
В итоге что я проделал:
сначала задаю параметры

Код AS3:

                private var _alpha: Number = 0;
                private var _phase: Number = 0;
                private var _radius:Number = 60;

потом выставляю на сцену поршни

Код AS3:

                        _phase = 360 / _model.forcesCount;
 
                        for (i = 0; i < _model.forcesCount; i++ )
                        {       
                                var angle:Number = radToDeg(_alpha + _phase * i);
 
                                _forcers[i].y = Math.cos(angle) * _radius;
 
                                _forcers[i].direction = _phase * i < 180 ? -1 : 1;
 
                                _mc.forcersContainer.addChild(_forcers[i]);
                        }

далее, при анимации, сдвигаю по фомуле .y и присваиваю direction в крайних положениях пошня (для того, чтоб менять цвет и глубину отображения в дисплей листе)

Код AS3:

                                var forcer:MovieClip = _forcers[i];
                                var angle:Number = radToDeg(_alpha + _phase * i);
                                var cos:Number = Math.cos(angle);
 
                                forcer.y = cos * _radius;
 
                                if ((cos == 1) || (cos == -1))
                                        _forcer.direction = -cos;



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

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