Используя значение эпсилон, чтобы определить, если мяч в игре не движется?

голоса
2

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

Сейчас мои шары COR для моих шаров +0,80. Таким образом, после многих отказов моих шаров «остановился» прокатка, потому что их скорость была стать каким-то смехотворно малым числом.

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

Должен ли я определить константу эпсилон и сделать что-то вроде:

if Math.abs(velocity.x) < epsilon then velocity.x = 0

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

Кроме того, что было бы разумным значением эпсилон, если я использую поплавки для моего вектора скорости?

Задан 10/12/2008 в 01:02
источник пользователем
На других языках...                            


4 ответов

голоса
1

Вместо эпсилона для функции IsStillMoving, может быть, вы могли бы использовать функцию UpdatePosition, запланированную на основе объектно-по-объект на основе его скорость.

Я хотел бы сделать что-то вроде этого (в моем собственном макияже он-до-как-вы-го псевдокода):

void UpdatePosition(Ball b) {

   TimeStamp now = Clock.GetTime();
   float secondsSinceLastUpdate = now.TimeSince(b.LastUpdate).InSeconds;

   Point3D oldPosition = b.Position;
   Point3D newPosition = CalculatePosition(b.Position, b.Velocity, interval);
   b.MoveTo(newPosition);

   float epsilonOfAccuracy = 0.5; // Accurate to one half-pixel
   float pixelDistance = Camera.PixelDistance(oldPosition, newPosition);
   float fps = System.CurrentFramesPerSecond;
   float secondsToMoveOnePixel = (pixelDistance * secondsSinceLastUpdate) / fps;
   float nextUpdateInterval = secondsToMoveOnePixel / epsilonOfAccuracy;

   b.SetNextUpdateAt(now + nextUpdateInterval);
}

Шары движутся очень быстро будет обновляться на каждом кадре. Шары двигаться более медленно может обновлять каждые пять или десять кадров. И шары, которые прекратили (или почти прекратили) обновит только очень очень редко.

Ответил 10/12/2008 в 01:43
источник пользователем

голоса
1

Разумное значение эпсилон будет зависеть от ограничений системы. Если вы представляете мяч графически, то ваш эпсилон может соответствовать, скажем, скорость .1 пикселей в секунду (обеспечение того, чтобы ваше понятие остановки соответствует опыт пользователя из экранных объектов остановочных). Если вы делаете моделирование физики, вы хотите, чтобы настроить его с точностью, к которой вы пытаетесь измерить вашу систему.

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

Ответил 10/12/2008 в 01:23
источник пользователем

голоса
0

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

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

Ответил 10/12/2008 в 01:49
источник пользователем

голоса
0

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

Ответил 10/12/2008 в 01:14
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more