2009-02-26 17 views
5

Tengo un automóvil y al acelerar quiero que la velocidad aumente "lentamente" ...XNA MathHelper.SmoothStep? ¿Como funciona?

Después de mirar algunos sitios llegué a la conclusión de que el método SmoothStep podría utilizarse para hacer eso?

¡Sé cómo mover texturas y cosas, así que un ejemplo donde smoothstep se usa para aumentar el valor en una carroza o algo así, sería extremadamente útil!

Gracias de antemano :)

creo que es triste Tampoco hay ejemplos para todos los métodos en la biblioteca MSDN.

Respuesta

12

SmoothStep no lo ayudará aquí. SmoothStep es una función de interpolación de dos valores. Hace algo similar a una interpolación sinusal. Se acelerará lentamente, tendrá una velocidad aguda alrededor de x = 0.5 y luego ralentizará la llegada (x = 1.0).

como la siguiente:

smoothstep_approx

Esta es aproximada, la función real no tiene estos números exactos.

Sí, podría usar x = 0..0.5 para lograr el efecto que desee, pero con muy poco control sobre la curva de aceleración.

Si realmente quieres acelerar un automóvil o cualquier otro objeto, lo mejor que puedes hacer es realizar un seguimiento de la aceleración y la velocidad por ti mismo.

class Car : GameComponent 
{ 
    public override void Update(GameTime time) 
    { 
     velocity += acceleration * time.ElapsedGameTime.TotalSeconds; 
     position += velocity * time.ElapsedGameTime.TotalSeconds; 
    } 

    Vector3 position; 
    Vector3 velocity; 
    Vector3 acceleration; 
} 

posición, velocidad y aceleración siendo Vector2 o Vector3 dependiendo de cuántos dimensión de su estado de juego está utilizando. Además, tenga en cuenta que esta forma de integración es propensa a pequeños errores matemáticos.

5

De this documentation parece que SmoothStep toma 3 argumentos - los dos valores que desee para moverse entre la cantidad y entre ellos, que probablemente tiene que estar entre 0 y 1.
Así que supongamos que tiene un flotador f que se incrementa linealmente desde 0 a la velocidad de destino durante un período de tiempo. en lugar de utilizar f directamente como la velocidad, utilizando SmoothStep se vería así:

float speed = MathHelper.SmoothStep(0, destSpeed, f/destSpeed); 

Es realmente increíble lo mal que esta documentación es.

0

Sitio muy útil que encontré mientras tanto. http://johnnygizmo.blogspot.com/2008/10/xna-series-basic-ai.html

+0

Cuando necesita interpolar números discretos en números reales y necesita que la pendiente de los puntos clave sea cero. Digamos que quería que su auto comenzara lentamente en un momento preciso y luego se detuviera lentamente en un momento muy preciso, luego SmootStep lo ayudaría. – Coincoin

+0

También podría ser muy útil para todo tipo de transiciones de animación, como los menús. – Coincoin

+0

si tiene ejemplos, por favor publique :) – Moulde