|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Программная анимация стрелки тахометра: как описать зависимость от нажатия педали газ
Всем привет. Сегодня мне не повезло наткнуться на проблему, для решения которой мне не хватает серого вещества... Зная наверняка, что обитатели флешера, в отличие от меня, недостатком оного не страдают, решил обратиться к вам, мои дорогие.
Передо мной стоит задача сделать программную анимацию стрелки тахометра. Нажимаем газ, стрелка с замедлением ползет до определенного уровня вверх. Отпускаем газ, стрелка с равной скоростью падает вниз. Для решения данной задачки, я вспомнил урок программной анимации эффекта скольжения/торможения. Взял константу(коэффициент) замедления = 0.95 И шаг, на который изменяется значение угла поворота стрелки. Получаем простейшую формулу: шаг = шаг * 0.95 угол стрелки = угол стрелки + шаг Каждый новый фрейм, стрелка возрастает, но различие в шаге снижается. Если мы не успели довести стрелку до максимума и босили — она будет падать до нуля с постоянной скоростью. Но что, если процесс бросания не доведен до конца? При нажатии газа, стрелка должна начать рости, постепенно замедляясь. Увы, я не могу понять как этот процесс реализовать. Вот если бы я знал, какой шаг соответствует текущему положению стрелки... Зависимость шага от положения стрелки... Помогите пожалуйста разобраться... Прилагаю исходник, иллюстрирующий уровень моих познаний в программировании на АС и знания физики... А может еще и мои умственные способности. Приведу тут же незамысловатый код, чтобы не качать исходник: 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... но как это сделать, я что-то не пойму... } } } Заранее благодарен за помощь или наводящие ответы... Очень на вас надеюсь. Последний раз редактировалось greep; 06.08.2012 в 23:17. |
|
|||||
Модрон-ветеринар
|
Может не усложнять?
И просто: Выглядит реалистично.
__________________
Идите первым! |
|
|||||
Как знал, что ответ на мой вопрос последует вместе триумфальным появлением г-на Мункар =) Приветствую!
На самом деле, выглядит довольно реалистично, но тут уже появился спортивный интерес... Очень хотелось бы понять, каким образом выразить зависимость между углом стрелки и шагом, который ей соответствует... И раз уж Вы тут, можно задать еще один вопрос по теме? Дело в том, что свойство ротейшн работает достаточно неудобно: если угол острый вплоть до 180 градусов, значение его положительно. Если тупой — отрицательное. Очень сложно ловить нужный диапазон, если значение так изменяется. Например, если я хочу сделать так, чтобы стрелка доходила до 8000 об в мин. Тогда она пройдет путь от 0 градусов до 180 и дальше будет уходить в -179, -178 ... -1. Мне кажется очевидным завести переменную-счетчик градусов наклона и передавать её в виде 190 240 360 градусов. Но есть ли какой-то более изящный ход для решения данного вопроса? Огромное спасибо за ответ и еще более ОГРОМНОЕ, если ответите на текущие! Уже не первый год Вы отвечаете на мои глупые вопросы =) |
|
|||||
Цитата:
Зависимость тоже не сложно выразить. Например у вас максимальный угол отклонения стрелки = 150 градусов (100%). В км/ч 100% = 300км/ч. То есть максимальная цифра на тахометре 300км/ч. Значит 1 градус стрелки будет равен 300/150 = 2км/ч. А 1км/ч будет равен 150/300 = 0.5 градуса.
__________________
Дети не должны знать о своих родителях Последний раз редактировалось Tails; 07.08.2012 в 12:44. |
|
|||||
Ну да, я уже об этом упоминал. Вот думаю, есть ли другой подход к решению данного вопроса?
|
|
|||||
greep
Какой другой подход? Стрелка должна лишь отображать нашу скорость, как она это делает это её проблемы. Мы ей говорим: "Вот сейчас у нас скорость 100км/ч, отобрази её нам", то есть выглядит это примерно так: Где:
Вот в принципе и всё. То есть манипулируем мы скоростью в км/ч где то "наверху", а стрелка лишь отображает нашу скорость.
__________________
Дети не должны знать о своих родителях |
|
|||||
Регистрация: May 2008
Сообщений: 63
|
Если говорить о тахометре, то упрощенно можно записать это как:
n = k*d n - частота вращения k - некий коэфф нагрузки d - процент нажатия на педальку K я бы задал например меняется от 0,2 до 4 4 - при отсутствии нагрузки - холостой 0.2 при с прицепом и на горку и на пятой передаче))) то бишь обороты расти почти не будут - они там даж падать будут при нажатии на педаль в букву K короч надо внести кучу коэффициентов всяких, но так чтоб она менялась тока от 0,2 до 4 ... типа туда вес, мощность, сопротивление качению (покрытие-асфальт песок, какая резина злая или лысая, как накачена), уклон - тут мож силу тяжесит вклинить от угла наклона - она может даже разгонять двигатель при отпущеной педали газа, сопроитвление водзуху - которое растет по диким законам. Сначла по прямой зависимости и начиная с большой скорости зависимости пропорциональна квадрату скорости. еще аэродинамический коээф - это к сопротивлению воздуха. все данные для разных форм и тачек примерно в инете можно найти. сопротивление трансмиссии - у нивы оно например просто неепическое - при отпускании педали газа тормозит сильна. То есть примерно 10-15% мозности уходит на трение в трансмисии. БМВ недавно хвасталось что потери в трансмиссии достигди у нее всего 1-2 л.с. то есть ваще почти никаких. если движок убит и плохо отрегулирован, то реакция на педаль газа будет замедленной - нажмешь , а двиг сначала "думает" пару секунд, потом набирает неспеша, потом срывается в резкий набор, либо ваще если резко нажать то проваливается и теряет обороты, а потом начинает набирать. При плавном нажатии плавно набирает. типа грубо говоря кривые мощности по передача и скорость тачки. Черные жирные это обычный спокойный дачниковый разгон тачки до 70 в час. Красные это типа *****стритрейсер форсит на повышеных оборотах и разгоняется резво до 80 в час. Кривые показывают и рост мощности от оборотов и рост момента силы и скорость изменения оборотов в этом месте на этой передаче. Они немного будут отличаться друг от друга по кривизне но в целом похожи. У чоперов например момент силы кривая оч сглажена – момент силы на низких и высоких оборотов достаточно высок и изменяется не сильно. У спортбайков момент силы на холостых ваще никакой но высокий только на пике оборотов – оч крутая кривая будет. По графику еще можно рассмотреть если все предсатвить (представит ькак тыв ездишь и переключаешься) в какие моменты выгодно например с четвертой переключиться на третью – чтоб перейти на более высокие обороты и более высокую мощность когда в гору едешь например. |
|
|||||
2 PsixokoT: Серьезный подход) Вы очень доходчиво объяснили сам принцип работы тахометра. Тем не менее в данном контексте не очень понятен подход в реализации... Не могли бы Вы интерполировать ваши выкладки в контексте поставленных условий?
|
|
|||||
Регистрация: May 2008
Сообщений: 63
|
Ну тут как бы итак все понятно. Вам не нужно запомнать там какие то промежуточные значения.
Выше вам уже написали, что тахометр это просто вьюха которая показывает обороты. Как оно показывает это элементарные преобразования угол = <значение оборотов>*<коэффициент деления тахометра>; А вот что бы вычислять значение оборотов в текущую единицу времени, выше я описал факторы влияющие на это значение. Пример электродвигателя которому наплевать на все окружающие факторы, работающий всегда на максимальной мощности. 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; } } |
|
|||||
То есть, вы предлагаете в коде тахометра описать реальный принцип работы двигателя?) Но мне вего лишь нужна анимация движения стрелки =) Принцип, которым я воспользовался — очень прост. Шаг движения стрелки в градусах, замедляющий коэффициент на который каждый раз мы умножаем шаг, тем самым укорачивая его и далее шаг суммируется с текущим углом поворота стрелки. Таким образом каждый фрейм, различие в изменении поворота стрелки все меньше.
Вопрос лишь в том, как при падении стрелки, рассчитать такое значение шага, которое бы соответствовало углу стрелки при возрастании. Кажется найти ответ на мой вопрос не получится и тут... =( |
Часовой пояс GMT +4, время: 03:46. |
|
« Предыдущая тема | Следующая тема » |
|
|