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

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

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

Регистрация: Jun 2002
Адрес: on the backyard
Сообщений: 285
Отправить сообщение для greep с помощью ICQ
По умолчанию Программная анимация стрелки тахометра: как описать зависимость от нажатия педали газ

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

Передо мной стоит задача сделать программную анимацию стрелки тахометра. Нажимаем газ, стрелка с замедлением ползет до определенного уровня вверх. Отпускаем газ, стрелка с равной скоростью падает вниз.

Для решения данной задачки, я вспомнил урок программной анимации эффекта скольжения/торможения.

Взял константу(коэффициент) замедления = 0.95
И шаг, на который изменяется значение угла поворота стрелки.

Получаем простейшую формулу:

шаг = шаг * 0.95
угол стрелки = угол стрелки + шаг

Каждый новый фрейм, стрелка возрастает, но различие в шаге снижается.

Если мы не успели довести стрелку до максимума и босили — она будет падать до нуля с постоянной скоростью.

Но что, если процесс бросания не доведен до конца? При нажатии газа, стрелка должна начать рости, постепенно замедляясь. Увы, я не могу понять как этот процесс реализовать. Вот если бы я знал, какой шаг соответствует текущему положению стрелки... Зависимость шага от положения стрелки...

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

Приведу тут же незамысловатый код, чтобы не качать исходник:

Код AS1/AS2:
 
pointer.tabSlowdown = 0.95;
pointer.rMove = 8.99;
 
 
btn.onRollOver = function(){
	pointer.onEnterFrame = function(){
		if(this._rotation > 169){
				delete this.onEnterFrame;
		}else{
				this.rMove *= this.tabSlowdown;
				this._rotation += this.rMove;
		}
	}
}
btn.onRollOut = function(){
		pointer.onEnterFrame = function(){
 
			if(this._rotation < 0){
				delete this.onEnterFrame;
				this._rotation = 0;
				this.rMove = 8.99;
			}else{
				this._rotation -= 7;
				// А вот тут нужно описать то, как переменная rMove будет увеличиваться плоть до 8.99... но как это сделать, я что-то не пойму...
			}
 
		}
}

Заранее благодарен за помощь или наводящие ответы... Очень на вас надеюсь.
Вложения
Тип файла: zip sample.zip (9.9 Кб, 49 просмотров)


Последний раз редактировалось greep; 06.08.2012 в 23:17.
Старый 07.08.2012, 09:41
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 2  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Может не усложнять?
И просто:
Код AS1/AS2:
btn.onRollOut = function()
{
	pointer.onEnterFrame = function()
	{
		if(this._rotation < 0)
		{
			delete this.onEnterFrame;
			this._rotation = 0;
		}
		else
		{
			this._rotation -= 7;
		}
	}
 
	pointer.rMove = 8.99;
}
Выглядит реалистично.
__________________
Идите первым!

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

Регистрация: Jun 2002
Адрес: on the backyard
Сообщений: 285
Отправить сообщение для greep с помощью ICQ
Как знал, что ответ на мой вопрос последует вместе триумфальным появлением г-на Мункар =) Приветствую!

Цитата:
Сообщение от mooncar Посмотреть сообщение
Может не усложнять? Выглядит реалистично.
На самом деле, выглядит довольно реалистично, но тут уже появился спортивный интерес... Очень хотелось бы понять, каким образом выразить зависимость между углом стрелки и шагом, который ей соответствует...

И раз уж Вы тут, можно задать еще один вопрос по теме? Дело в том, что свойство ротейшн работает достаточно неудобно: если угол острый вплоть до 180 градусов, значение его положительно. Если тупой — отрицательное. Очень сложно ловить нужный диапазон, если значение так изменяется. Например, если я хочу сделать так, чтобы стрелка доходила до 8000 об в мин. Тогда она пройдет путь от 0 градусов до 180 и дальше будет уходить в -179, -178 ... -1. Мне кажется очевидным завести переменную-счетчик градусов наклона и передавать её в виде 190 240 360 градусов. Но есть ли какой-то более изящный ход для решения данного вопроса?

Огромное спасибо за ответ и еще более ОГРОМНОЕ, если ответите на текущие! Уже не первый год Вы отвечаете на мои глупые вопросы =)

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Цитата:
Сообщение от greep Посмотреть сообщение
Дело в том, что свойство ротейшн работает достаточно неудобно: если угол острый вплоть до 180 градусов, значение его положительно. Если тупой — отрицательное.
С этим и не нужно заворачиваться. Можно хранить градусы в отдельной переменной от 0 до 360. Когда будете присваивать вашей стрелке градусы > 180, они автоматический переведутся в соответствующее отрицательное значение для свойства _rotation.

Зависимость тоже не сложно выразить.
Например у вас максимальный угол отклонения стрелки = 150 градусов (100%). В км/ч 100% = 300км/ч. То есть максимальная цифра на тахометре 300км/ч.
Значит 1 градус стрелки будет равен 300/150 = 2км/ч. А 1км/ч будет равен 150/300 = 0.5 градуса.
__________________
Дети не должны знать о своих родителях


Последний раз редактировалось Tails; 07.08.2012 в 12:44.
Старый 07.08.2012, 12:33
greep вне форума Посмотреть профиль Отправить личное сообщение для greep Найти все сообщения от greep
  № 5  
Ответить с цитированием
greep
 
Аватар для greep

Регистрация: Jun 2002
Адрес: on the backyard
Сообщений: 285
Отправить сообщение для greep с помощью ICQ
Цитата:
Сообщение от Tails Посмотреть сообщение
С этим и не нужно заворачиваться. Можно хранить градусы в отдельной переменной от 0 до 360. Когда будете присваивать вашей стрелке градусы > 180, они автоматический переведутся в соответствующее отрицательное значение для свойства _rotation.
Ну да, я уже об этом упоминал. Вот думаю, есть ли другой подход к решению данного вопроса?

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
greep
Какой другой подход?

Стрелка должна лишь отображать нашу скорость, как она это делает это её проблемы. Мы ей говорим: "Вот сейчас у нас скорость 100км/ч, отобрази её нам", то есть выглядит это примерно так:
Код AS1/AS2:
function displaySpeed(speed) {
    arrow._rotation = 150 / 300 * speed;
}
Где:
  • speed - Скорость в км/ч которую нужно отобразить на тахометре
  • 150 - максимальный угол отклонения стрелки
  • 300 - максимальная отображаемая на тахометре скорость, то есть на конце тахометра написано 300км/ч
  • arrow - стрелка

Вот в принципе и всё. То есть манипулируем мы скоростью в км/ч где то "наверху", а стрелка лишь отображает нашу скорость.
__________________
Дети не должны знать о своих родителях

Старый 07.08.2012, 13:55
PsixokoT вне форума Посмотреть профиль Отправить личное сообщение для PsixokoT Найти все сообщения от PsixokoT
  № 7  
Ответить с цитированием
PsixokoT

Регистрация: May 2008
Сообщений: 63
Если говорить о тахометре, то упрощенно можно записать это как:
n = k*d
n - частота вращения
k - некий коэфф нагрузки
d - процент нажатия на педальку

K я бы задал например меняется от 0,2 до 4
4 - при отсутствии нагрузки - холостой
0.2 при с прицепом и на горку и на пятой передаче)))
то бишь обороты расти почти не будут - они там даж падать будут при нажатии на педаль

Название: image002.png
Просмотров: 1162

Размер: 7.1 Кб

в букву K короч надо внести кучу коэффициентов всяких, но так чтоб она менялась тока от 0,2 до 4 ... типа туда вес, мощность, сопротивление качению (покрытие-асфальт песок, какая резина злая или лысая, как накачена), уклон - тут мож силу тяжесит вклинить от угла наклона - она может даже разгонять двигатель при отпущеной педали газа, сопроитвление водзуху - которое растет по диким законам. Сначла по прямой зависимости и начиная с большой скорости зависимости пропорциональна квадрату скорости.
еще аэродинамический коээф - это к сопротивлению воздуха. все данные для разных форм и тачек примерно в инете можно найти.

сопротивление трансмиссии - у нивы оно например просто неепическое - при отпускании педали газа тормозит сильна. То есть примерно 10-15% мозности уходит на трение в трансмисии.
БМВ недавно хвасталось что потери в трансмиссии достигди у нее всего 1-2 л.с. то есть ваще почти никаких.

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

Название: image001.png
Просмотров: 1164

Размер: 9.6 Кб

типа грубо говоря кривые мощности по передача и скорость тачки.
Черные жирные это обычный спокойный дачниковый разгон тачки до 70 в час.
Красные это типа *****стритрейсер форсит на повышеных оборотах и разгоняется резво до 80 в час.
Кривые показывают и рост мощности от оборотов и рост момента силы и скорость изменения оборотов в этом месте на этой передаче.
Они немного будут отличаться друг от друга по кривизне но в целом похожи.
У чоперов например момент силы кривая оч сглажена – момент силы на низких и высоких оборотов достаточно высок и изменяется не сильно.
У спортбайков момент силы на холостых ваще никакой но высокий только на пике оборотов – оч крутая кривая будет.
По графику еще можно рассмотреть если все предсатвить (представит ькак тыв ездишь и переключаешься) в какие моменты выгодно например с четвертой переключиться на третью – чтоб перейти на более высокие обороты и более высокую мощность когда в гору едешь например.

Старый 07.08.2012, 17:03
greep вне форума Посмотреть профиль Отправить личное сообщение для greep Найти все сообщения от greep
  № 8  
Ответить с цитированием
greep
 
Аватар для greep

Регистрация: Jun 2002
Адрес: on the backyard
Сообщений: 285
Отправить сообщение для greep с помощью ICQ
2 PsixokoT: Серьезный подход) Вы очень доходчиво объяснили сам принцип работы тахометра. Тем не менее в данном контексте не очень понятен подход в реализации... Не могли бы Вы интерполировать ваши выкладки в контексте поставленных условий?

Старый 07.08.2012, 19:51
PsixokoT вне форума Посмотреть профиль Отправить личное сообщение для PsixokoT Найти все сообщения от PsixokoT
  № 9  
Ответить с цитированием
PsixokoT

Регистрация: May 2008
Сообщений: 63
Ну тут как бы итак все понятно. Вам не нужно запомнать там какие то промежуточные значения.
Выше вам уже написали, что тахометр это просто вьюха которая показывает обороты.
Как оно показывает это элементарные преобразования угол = <значение оборотов>*<коэффициент деления тахометра>;

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

Пример электродвигателя которому наплевать на все окружающие факторы, работающий всегда на максимальной мощности.

Код AS1/AS2:
public class Engine extends Object {
 
	private var _rPM:Number; //обороты
 
	public function Engine() {
		super();
	}
 
	/**
	 *  
	 * @param value - значение 0..1, коэфициент нажатия на педаль
	 * 
	 */		
	public function fuelSupply(value:Number):void {
		var Uc:Number = 220;//Напряжение V 
		var Iy:Number = 20;//сила тока якоря А
		var Ry:Number = 4;//сопротивление якоря Om
		var k:Number = 0.4;//конструкт. коэфф
		var F:Number = 20*value;//поток Вб, 20 максимальное значение 
		this._rPM = (Uc - Iy*Ry)/k*F; 
	}
 
	public function get rPM():Number {
		return this._rPM;
	}
}
Понятное дело что в реальных условиях ни один двигатель не будет тот час выдавать таких результатов так как я захардкодил константами значения тока напряжения и сопротивления.

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

Регистрация: Jun 2002
Адрес: on the backyard
Сообщений: 285
Отправить сообщение для greep с помощью ICQ
То есть, вы предлагаете в коде тахометра описать реальный принцип работы двигателя?) Но мне вего лишь нужна анимация движения стрелки =) Принцип, которым я воспользовался — очень прост. Шаг движения стрелки в градусах, замедляющий коэффициент на который каждый раз мы умножаем шаг, тем самым укорачивая его и далее шаг суммируется с текущим углом поворота стрелки. Таким образом каждый фрейм, различие в изменении поворота стрелки все меньше.

Вопрос лишь в том, как при падении стрелки, рассчитать такое значение шага, которое бы соответствовало углу стрелки при возрастании.

Кажется найти ответ на мой вопрос не получится и тут... =(

Создать новую тему Ответ Часовой пояс GMT +4, время: 08:49.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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