|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Реалистичная анимация кручения объектов вид сбоку
Всемпривет!
Занимаюсь сейчас схемкой одного механизма. Создал такую вот анимацю (приложил к сообщению). Все программное, так как количество поршней можно менять, угол главного барабана тоже (стрелочками лево-право). В данной анимации есть недостаток - поршни крутятся с одинаковой скоростью, "ударяяськ" о границы, меняют направление на противоположное. У меня это реализовано пока что очень просто: то есть сначала я создаю и выставляю на сцену заданное количество поршней (_forsers). Далее, анимация работает так, что каждый кадр прибавляем к игрику каждого поршня скорость, умноженную на направление поршня (1 либо -1). Когда поршень подходит в endPoint либо startPoint, его direction меняется на противоположный. Сейчас хочу сделать так, чтобы скорость поршня замедлялась по мере приближения и убыстрялась по мере отдаления от крайних точек. Тогда это будет выглядеть гораздо более реалистично. Но не могу понять, как это лучше сделать.. Можно, конечно, нагромождением ifов, но хочется как-то более красиво. Может быть, у кого-то есть такие варианты?
__________________
while(live()) { hope(); } Последний раз редактировалось Zebestov; 18.12.2017 в 14:12. |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
нужно двигать поршни по синусу.
|
|
|||||
undefined ага, а синус чего делать?
Добавлено через 5 минут то есть, насколько я понимаю, нужно делать sin(t)? Получается, что время тут единственный изменяемый параметр..
__________________
while(live()) { hope(); } |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
да, от времени,да, единственный
|
|
|||||
Lorem ipsum
|
Строго говоря, даже не времени, а угла поворота вала с поршнями.
Вертикальное положение относительно вала произвольного поршня forcer, расположенного на валу в угловой позиции phase, при произвольном положении вала alpha вычисляется по формуле: где radius — расстояние от центра вала до центра поршня. Таким образом ты получаешь формулу, в которой с течением времени меняется alpha вала, давая новое положение каждого поршня. И кстати, подставив в эту же формулу cos вместо sin, ты получаешь возможность всегда знать, где должен находиться поршень в дисплейлисте —выше вала, или ниже. Ты это по знаку поймешь.
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Самый торч был бы ещё чуть-чуть увеличивать их при приближении, тогда совсем было бы реалистично.
__________________
Не сломано - не чини! |
|
|||||
что-то здесь не так.
пробую поставить на сцену два поршня пока что. _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]); } _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 получаю разные значения игрека, будто центр окружности, от которой беру синус, не в нуле. Я что-то проглядел видимо?
__________________
while(live()) { hope(); } |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
синус принимает радианы, а не градусы
|
|
|||||
Всем огромное спасибо!
Конечно, банальный вопрос получился, но почему-то я не мог до него сам допереть. Что если хочешь реалистично - делай как в реальности. =) + кроме того, сильно сократился код. Потому то у меня и свербило где-то, что я чувствовал - не дело писанину разводить, должен быть простой способ. Еще раз спасибо. В итоге что я проделал: сначала задаю параметры private var _alpha: Number = 0; private var _phase: Number = 0; private var _radius:Number = 60; _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]); }
__________________
while(live()) { hope(); } Последний раз редактировалось ZergMaster; 19.12.2017 в 03:20. |
Часовой пояс GMT +4, время: 11:51. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|