¿Usar un valor épsilon para determinar si una pelota en un juego no se está moviendo?

votos
2

Tengo bolas rebotando alrededor y cada vez que chocan su velocidad, el vector se reduce por el coeficiente de restitución.

En este momento, mi bolas CoR para mis bolas es .80. Así que después de muchos rebotes, mis bolas han parado de rodar porque su velocidad se ha convertido en un número ridículamente pequeño.

¿En qué etapa es apropiado verificar si un valor de velocidad es lo suficientemente pequeño como para simplemente llamarlo cero (para que no tenga el loco tintineo de las bolas reaccionando a sus microvelocidades). He leído en algunos foros antes que las personas a veces usan una constante épsilon, un número pequeño y no lo ven así.

¿Debo definir una constante épsilon y hacer algo como esto?

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

¿Cada vez que actualizo la velocidad y la posición de las bolas? ¿Es esto lo que generalmente se hace? ¿Sería razonable colocar eso en mis ajustadores de clases Vector para xey? O debería hacerlo fuera de mi clase vectorial cuando estoy calculando las velocidades.

Además, ¿cuál sería un valor épsilon razonable si estuviera usando flotadores para mi vector de velocidad?

Publicado el 10/12/2008 a las 01:02
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
1

En lugar de un épsilon para una función IsStillMoving, tal vez podría usar una función UpdatePosition, programada objeto por objeto en función de su velocidad.

Haría algo como esto (en mi propio pseudocódigo de "make-it-up-as-you-go"):

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);
}

Las bolas que se mueven muy rápido se actualizarán en cada cuadro. Las bolas que se mueven más lentamente pueden actualizarse cada cinco o diez cuadros. Y las pelotas que se han detenido (o casi detenido) se actualizarían solo muy raramente.

Respondida el 10/12/2008 a las 01:43
fuente por usuario

votos
1

Un valor razonable para épsilon dependerá de las limitaciones de su sistema. Si representas gráficamente la bola, entonces tu épsilon podría corresponder, digamos, a una velocidad de .1 píxeles por segundo (asegurándote de que tu noción de parar concuerde con la experiencia del usuario de que se detengan los objetos de la pantalla). Si está haciendo una simulación de física, querrá sintonizarla con la precisión con la que está tratando de medir su sistema.

En cuanto a la frecuencia con la que compruebas, eso también depende. Si está simulando algo en tiempo real, el cheque adicional puede ser costoso, y querrá comprobar cada 10 actualizaciones o una vez por segundo o algo así. O el rendimiento puede no ser un problema, y ​​puedes consultarlo con cada actualización.

Respondida el 10/12/2008 a las 01:23
fuente por usuario

votos
0

Epsilon por naturaleza es el incremento más pequeño posible. Desafortunadamente, las computadoras tienen diferentes incrementos "mínimos" propios dependiendo de la representación del punto flotante. Sería muy cuidadoso (e incluso podría ir más allá de lo que calcularía solo por seguridad) jugando con eso, especialmente si quiero que un código sea portátil.

Es posible que desee escribir una función que descubra el incremento mínimo en sus carrozas en lugar de usar un valor mágico.

Respondida el 10/12/2008 a las 01:49
fuente por usuario

votos
0

IMO tu aproximación épsilon está bien. Simplemente experimento para ver qué aspecto o qué se siente natural en la animación del juego.

Respondida el 10/12/2008 a las 01:14
fuente por usuario

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