Hay una docena de formas en que podría formular esta pregunta, pero para mantener mis pensamientos en línea, lo estoy formulando de acuerdo con mi problema en cuestión.
Así que estoy creando una plataforma flotante que me gustaría poder simplemente viajar de un punto designado a otro, y luego regresar al primero, y simplemente pasar entre los dos en línea recta. Sin embargo, solo para hacerlo un poco más interesante, quiero agregar algunas reglas a la plataforma.
- Lo estoy codificando para viajar múltiplos de valores de mosaico completos de datos mundiales. Entonces, si la plataforma no es estacionaria, entonces viajará al menos un ancho o altura de mosaico completo.
- Dentro de una longitud de mosaico, me gustaría acelerar de una parada a una velocidad máxima dada.
- Al llegar a la distancia de una pieza de mosaico, me gustaría que se detuviera en una coordenada de mosaico dada y luego repetir el proceso en reversa.
Las dos primeras partes no son demasiado difíciles, esencialmente estoy teniendo problemas con la tercera parte. Me gustaría que la plataforma se detuviera exactamente en una coordenada de mosaico, pero dado que estoy trabajando con la aceleración, parece fácil comenzar simplemente a aplicar la aceleración en la dirección opuesta a un valor que almacene la velocidad actual de la plataforma una vez que alcance la longitud de un mosaico de distancia (suponiendo que el mosaico está viajando más de una longitud de mosaico, pero para mantener las cosas simples, supongamos que lo es), pero entonces la pregunta es ¿cuál sería el valor correcto para que la aceleración se incremente y produzca este efecto? ¿Cómo encontraría ese valor?
acceleration = desired_velocity - currentVelocity
luego aplique esa aceleración como lo haría normalmente. Crearé una respuesta un poco más mostrando lo que hago.Respuestas:
Usando estos comportamientos de dirección como guía. Mirando el comportamiento de llegada:
Podemos crear una función "llegar a" como algo similar a esto:
Esto actualizará la aceleración que necesitamos usar para aplicar al objeto en movimiento.
fuente
Eche un vistazo a esta página: http://sol.gfxile.net/interpolation/index.html
Parece que quieres un efecto igual que el paso suave:
Si tiene el punto más a la izquierda, el punto más a la derecha que debe alcanzar la plataforma, y el tiempo que debe usar para hacer una secuencia completa, algo como esto puede estar bien:
marco foreach:
Si está utilizando un motor de física, puede hacerlo con impulsos, no debería ser tan difícil de traducir. Si desea un proceso aún más suave, puede aumentar el nivel de paso suave.
fuente
Puede usar XnaTweener que proporciona funciones de flexibilización que interpolan valores de un punto a otro de una manera fácil ...
Aquí hay una respuesta con un código basado en el proyecto Xna Tweener y un video que muestra cómo funciona ...
https://gamedev.stackexchange.com/a/26872/8390
[EDITAR]
Debería tener una secuencia de teclas que defina el movimiento de la plataforma, así:
Y luego puedes manejar el movimiento de esta manera:
"DefaultPosition" es la posición de inicio, "Traslation" acumula el movimiento de varias teclas y cada traducción de teclas es relativa a la tecla anterior, por lo que cuando la multiplica por un factor de proporción [0..1] devuelve la traducción relativa interpolada caminada para alcanzar esa clave de la clave anterior ...
Aquí tienes otro video que muestra un movimiento de plataforma definido como se describe aquí ...
http://www.youtube.com/watch?v=ZPHjpB-ErnM&feature=player_detailpage#t=104s
He rehecho este código para que sea fácil de entender ... tal vez tiene algún error ... el código original maneja varias instancias del mismo movimiento pero con algunos retrasos entre cada instancia ... Estoy seguro de que este código puede ser rediseñado para ser más fácil ...
fuente