Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.12.2017, 12:51
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 1  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
По умолчанию Реалистичная анимация кручения объектов вид сбоку

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

gidroPump1.swf   (10.7 Кб)


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

Код AS3:
_forsers[i].y += _model.speed*_forsers[i].direction;
то есть сначала я создаю и выставляю на сцену заданное количество поршней (_forsers).
Далее, анимация работает так, что каждый кадр прибавляем к игрику каждого поршня скорость, умноженную на направление поршня (1 либо -1). Когда поршень подходит в endPoint либо startPoint, его direction меняется на противоположный.

Сейчас хочу сделать так, чтобы скорость поршня замедлялась по мере приближения и убыстрялась по мере отдаления от крайних точек. Тогда это будет выглядеть гораздо более реалистично. Но не могу понять, как это лучше сделать.. Можно, конечно, нагромождением ifов, но хочется как-то более красиво. Может быть, у кого-то есть такие варианты?
Вложения
Тип файла: swf gidroPump1.swf (10.7 Кб, 97 просмотров)
__________________
while(live()) { hope(); }


Последний раз редактировалось Zebestov; 18.12.2017 в 14:12.
Старый 18.12.2017, 13:24
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 2  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
нужно двигать поршни по синусу.

Старый 18.12.2017, 13:28
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 3  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
undefined ага, а синус чего делать?

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

Старый 18.12.2017, 13:37
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 4  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
да, от времени,да, единственный

Старый 18.12.2017, 14:20
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 5  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Строго говоря, даже не времени, а угла поворота вала с поршнями.
Вертикальное положение относительно вала произвольного поршня forcer, расположенного на валу в угловой позиции phase, при произвольном положении вала alpha вычисляется по формуле:
Код:
y = Math.sin(alpha + phase) * radius
где radius — расстояние от центра вала до центра поршня.
Таким образом ты получаешь формулу, в которой с течением времени меняется alpha вала, давая новое положение каждого поршня. И кстати, подставив в эту же формулу cos вместо sin, ты получаешь возможность всегда знать, где должен находиться поршень в дисплейлисте —выше вала, или ниже. Ты это по знаку поймешь.
__________________
Поймай яблоко 2!

Старый 18.12.2017, 15:49
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 6  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Самый торч был бы ещё чуть-чуть увеличивать их при приближении, тогда совсем было бы реалистично.
__________________
Не сломано - не чини!

Старый 18.12.2017, 16:31
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 7  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
что-то здесь не так.
пробую поставить на сцену два поршня пока что.
Код 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
получаю разные значения игрека, будто центр окружности, от которой беру синус, не в нуле. Я что-то проглядел видимо?
__________________
while(live()) { hope(); }

Старый 18.12.2017, 16:34
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 8  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
синус принимает радианы, а не градусы

Старый 18.12.2017, 16:36
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 9  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
А почему ты считаешь синус от угла в градусах? Он же в радианах
__________________
Ко мне можно и нужно обращаться на ты)

Старый 18.12.2017, 18:41
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 10  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
Всем огромное спасибо!
Конечно, банальный вопрос получился, но почему-то я не мог до него сам допереть. Что если хочешь реалистично - делай как в реальности. =) + кроме того, сильно сократился код. Потому то у меня и свербило где-то, что я чувствовал - не дело писанину разводить, должен быть простой способ. Еще раз спасибо.
В итоге что я проделал:
сначала задаю параметры

Код 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;
__________________
while(live()) { hope(); }


Последний раз редактировалось ZergMaster; 19.12.2017 в 03:20.
Создать новую тему Ответ Часовой пояс GMT +4, время: 11:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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