2010-03-03 3 views
1

У меня есть значение с плавающей точкой X, которое анимируется. Когда в остальном это на нуле, но иногда внешний источник может изменить его где-то между -1 и 1.Плавно сделать число приближается к нулю

Если это произойдет, я хочу, чтобы идти гладко до 0. Я в настоящее время сделать что-то вроде

addToXspeed(-x * FACTOR); 

// below is out of my control 
function addToXspeed(bla) { 
xspeed += bla; 
x += xspeed; 
}

каждый шаг в анимации, но это только приводит к колебаниям X. Я хочу, чтобы он опирался на 0.

(я объяснил проблему в аннотации. Конкретная вещь, которую я пытаюсь сделать, это сделать прыжки игры персонаж балансировать себя прямо в воздухе, применяя вращательное усилие)

+1

ФАКТОР должен быть между 0 и 1. – abc

+1

Какой тип 'x'? В любом случае числа плавающей точки могут быть недостаточно точными. Кстати, ваш код «x = x-x * f', который совпадает с« x = (1-f) x'. Это немного назад определение «Фактор». – Kobi

+0

В контексте, можете ли вы запрограммировать? У вас есть переменные (если да, то можно определить, когда значение изменено)? Если '0,5' займет половину времени, чем' 1', чтобы достичь нуля или даже времени? – Kobi

ответ

0

Написание вопроса влияет на результаты в реализации ответа.

targetxspeed = -x * FACTOR; 
addToXspeed(targetxspeed - xspeed); 

// below is out of my control 
function addToXspeed(bla) { 
xspeed += bla; 
x += xspeed; 
}

Так просто слишком

1

х = х * ФАКТОР

Это должно сделать трюк, когда фактор между 0 и 1.

Чем меньше коэффициент, тем быстрее вы будете идти к 0.

+0

Я думаю, что это сработает, но у меня есть следующая проблема: я не могу назначить x, я могу только вызвать функцию addToX (bla). Работа над преобразованием заявления ... –

+0

На самом деле я неправильно записал, что происходит. Я редактировал свой вопрос. –

0

Почему вы не определите фиксированный шаг к декрементироваться от x?

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

0

Если вы хотите масштабировать его, но могу только добавить, то вы должны выяснить, какое значение для добавления, чтобы получить желаемое масштабирование:

Скажем x = 0.543 , и мы хотим заставить его быстро перейти к 0, т. е. сбросив его на 95%.

Мы хотим сделать:

scaled_x = x * (1.0 - 0.95); 

Это оставит й на 0,543 * 0,05, или 0.02715. Разница между этим значением и оригиналом, то, что вам нужно добавить, чтобы получить это значение:

delta = scaled_x - x; 

Это сделало бы дельту равно -0,51585, что и вам нужно добавить, чтобы имитировать масштабирование на 5%.

2

Интересная проблема. То, что вы просите за это стабилизация следующей линейной системы с дискретным временем:

|  x(t+1)| = | 1 dt | |  x(t)| + | 0 | u(t) 
|xspeed(t+1)| | 0 1 | |xspeed(t)|  | 1 | 

где dt время выборки и u(t) это количество вы addToXspeed(). (Кроме того, система подвержена случайным возмущениям по первой переменной x, которую я не показываю в приведенном выше уравнении.) Теперь, если вы «установите управляющий вход равным линейной обратной связи состояния», т.е.

u(t) = [a b] |  x(t)| = a*x(t) + b*xspeed(t) 
       |xspeed(t)| 

то система «замкнутый контур» становится

|  x(t+1)| = | 1 dt | |  x(t)| 
|xspeed(t+1)| | a b+1 | |xspeed(t)| 

Теперь, для того, чтобы получить «асимптотическую устойчивость» системы, мы предусматриваем, что собственные значения матрицы замкнутой размещены «внутри сложного единичного круга», и мы делаем это, настраивая a и b. Поместим собственные значения, скажем, в 0.5. Поэтому характеристический полином матрицы замкнутой, который является

(s - 1)(s - (b+1)) - a*dt = s^2 -(2+b)*s + (b+1-a*dt) 

должна равняться

(s - 0.5)^2 = s^2 - s + 0.25 

Это легко достигается, если мы выбираем

b = -1 a = -0.25/dt 

или

u(t) = a*x(t) + b*xspeed(t) = -(0.25/dt)*x(t) - xspeed(t) 
addToXspeed(u(t)) 

, который более или менее то, что появляется в вашем собственном ответе

targetxspeed = -x * FACTOR; 
addToXspeed(targetxspeed - xspeed); 

где, если мы попросили разместить собственные на 0,5, мы должны установить FACTOR = (0.25/dt).

+0

А теперь в программировании-говорите ... –

+0

Хихи, извините, я не удержался. Кроме того, я думаю, что если вы выберете FACTOR слишком большим, вы можете фактически дезабилизировать систему, т. Е. Частица будет становиться все дальше и дальше от нуля. И я также думаю, что колебательное поведение его предыдущей политики можно объяснить в этом контексте ... –

+0

Вау ... обширный. В следующий раз у меня есть что-то вроде этого, но сложнее я вернусь и получу этот ответ в глубину :) –