Estoy tratando de crear un juego de autos simple con cambios de marcha manuales. Sin embargo, tengo algunos problemas para implementar los cambios de marcha.
Aquí está mi código actual para el "auto":
int gear = 1; // Current gear, initially the 1st
int gearCount = 5; // Total no. of gears
int speed = 0; // Speed (km/h), initially 0
int[] maxSpeedsPerGear = new int[]
{
40, // First gear max. speed at max. RPM
70, // Second gear max. speed at max. RPM
100, // and so on
130,
170
}
int rpm = 0; // Current engine RPM
int maxRPM = 8500; // Max. RPM
public void update(float dt)
{
if(rpm < maxRPM)
{
rpm += 65 / gear; // The higher the gear, the slower the RPM increases
}
speed = (int) ((float)rpm / (float)maxRPM) * (float)maxSpeedsPerGear[gear - 1]);
if(isKeyPressed(Keys.SPACE))
{
if(gear < gearCount)
{
gear++; // Change the gear
rpm -= 3600; // Drop the RPM by a fixed amount
if(rpm < 1500) rpm = 1500; // Just a silly "lower limit" for RPM
}
}
}
Sin embargo, esta implementación realmente no funciona. La primera marcha funciona bien, pero los siguientes cambios de marcha causan la caída de velocidad. Al agregar algunos mensajes de depuración, obtengo estos valores de velocidad al cambiar en el límite de RPM:
Speed at gear 1 before change: 40
Speed after changing from gear 1 to gear 2: 41
Speed at gear 2 before change: 70
Speed after changing from gear 2 to gear 3: 59
Speed at gear 3 before change: 100
Speed after changing from gear 3 to gear 4: 76
Speed at gear 4 before change: 130
Speed after changing from gear 4 to gear 5: 100
Como puede ver, la velocidad después de cada cambio es más lenta antes del cambio. ¿Cómo tomaría en cuenta la velocidad antes del cambio de marcha para que la velocidad no disminuya al cambiar de marcha?
simulations
car
Manábreak
fuente
fuente
Respuestas:
Calcule las nuevas RPM en función de la nueva marcha y la velocidad actual del automóvil.
entonces: en lugar de:
utilizar:
La velocidad ahora será la misma antes y después del cambio de marcha, y puede acelerar / desacelerar desde allí.
editar: agregado
max(maxRPM, calc)
como quieras limitarlo. Como en un automóvil, esto debería resultar en una pérdida de velocidad bastante repentinafuente
Esto se debe a que no hay inercia en su cálculo de velocidad. solo se calcula como una consecuencia absoluta de las rpm y el engranaje del motor. pero cuando calcula las nuevas rpm después del cambio de marcha, lo baja empíricamente en pasos fijos de 3600 rpm.
Este es tu error. el menú desplegable de rpm no se fija entre engranajes. puede solucionarlo haciendo una segunda matriz que almacene el número exacto de caída de rpm entre cada marcha.
La segunda forma de solucionarlo es mediante el uso de cálculos físicos. Estás haciendo una simulación, por lo que puedes hacer una integración numérica. Usando el tiempo,
dt
y la integración euler, o integración Verlet. Esto suena complejo con nombres y todo pero en realidad no lo es.Básicamente significaría que crea una tabla de búsqueda para el par del motor a las rpm dadas. Entonces tendrías en cuenta que aumenta la resistencia del aire con el cuadrado de la velocidad. A continuación, la simulación calcularía la siguiente velocidad mediante la inversión de la segunda ley de Newton,
f=m a
.Para encontrar
a=f/m
, a continuación, la integración de Euler:speed=speed+a*dt
. elm
es aproximadamente 1200 (peso típico del automóvil).f
es la fuerza derivada del par motor, que se reduce a la caja de cambios y luego se convierte en fuerza usando la fórmula de la palanca al considerar el radio de la rueda. (un producto vectorial cruzado generalmente, pero puede simplificarse mediante la multiplicación de torque con radio. porque netwton / metros multiplicado metros = newtons).de esta manera, las rpm del motor se calculan hacia atrás, en función de la velocidad lineal del automóvil.
fuente
exact number of RPM drop between each gear
. Es una relación, como señala @Baldrickk. Y aunque es una gran idea que la salida de la transmisión sea el par en lugar de la velocidad, una discusión sobre la resistencia al viento y la integración de verlet está un poco fuera del alcance de la pregunta, ¿no?Los engranajes se utilizan como mecanismo de reducción.
Usando una transmisión simplificada con solo dos relaciones en la caja de cambios, una velocidad de entrada (el motor) y una velocidad de salida (una de las relaciones de la caja de cambios) tenemos dos relaciones de reducción diferentes.
Entonces, para un engranaje de entrada con x dientes y un engranaje de salida de x / 2 dientes, la velocidad del engranaje de salida es el doble de la velocidad del engranaje de entrada (una relación de dos a uno)
dónde:
Entonces, en lugar de limitar cada engranaje por la velocidad codificada, podemos limitarlo por relación. Luego puede calcular la velocidad para un par específico (rpm Motor, marcha) y, cuando se cambia la marcha, calcular la velocidad del motor dada la velocidad conocida y un nuevo par.
Para simplificar, usando solo un motor conectado a dos engranajes:
asi que:
al cambiar a la segunda marcha, 10000 es la velocidad, por lo que al conectarlo en la misma fórmula, ahora tenemos:
así nuestras nuevas rpm:
Ese 10000 se reduciría aún más por un diferencial (que puede resumirse como un engranaje más, búsquelo si es necesario, lo siento, puede publicar solo dos enlaces) y luego por el tamaño de la rueda para calcular la velocidad de avance en kilómetros o millas por hora .
Tendría que tener en cuenta el hecho de que cambiar a una velocidad más baja aumenta las rpm del motor, por lo que un enfoque simple es verificar las rpm máximas y limitar las rpm después del cambio a las rpm máximas, reduciendo así la velocidad del vehículo.
Básicamente, cada vez que ocurre un cambio de marcha, calcula las rpm del motor a partir de la velocidad del vehículo, la limita a las rpm máximas y luego vuelve a "normal" donde actualiza las rpm de la entrada del usuario y calcula la velocidad en función de eso.
Para una simulación realista, debe tener en cuenta al menos el par del motor (respuesta de v.oddou) y el deslizamiento del embrague, lo que combinado tendría estos efectos: - al subir, suponiendo que el cambio es lo suficientemente rápido como para que las rpm del motor no caigan , la velocidad se elevará mientras se reducen las rpm del motor hasta que se equilibren; al cambiar hacia abajo, la velocidad del vehículo se reducirá hasta que el motor se eleve a las nuevas rpm, pero esto probablemente va más allá de la implementación "simple".
fuente
Tenga en cuenta que una transmisión manual activada es un dispositivo bidireccional. El motor puede acelerar el vehículo, al igual que el vehículo (más específicamente su impulso) puede acelerar el motor.
Este fue un problema real en las primeras transmisiones manuales. El cambio descendente repentinamente patearía el motor a una rpm más alta, lo que desalinearía los ciclos de encendido y posiblemente causaría que el motor se detuviera. Esto fue compensado por una conducción experta donde el conductor tuvo que acelerar el motor a la velocidad correcta antes de soltar el embrague para activar la transmisión.
Eso fue hasta que se desarrolló el synchromesh . Es un mecanismo que evita que la transmisión se active hasta que las velocidades de entrada y salida estén sincronizadas.
Entonces, lo que sugiero es que emule la sincronización y no active la transmisión hasta que las rpm del motor y la velocidad del automóvil coincidan en sus niveles actuales.
fuente
La respuesta existente parece demasiado compleja. Para un juego, RPM es solo un indicador en la pantalla. La velocidad real es la variable real. La relación de transmisión determina cómo convierte la velocidad del motor a RPM. Cambiar de marcha cambia la relación, pero no la velocidad. Obviamente, las RPM también cambian a la inversa de la relación de transmisión.
El exceso de revoluciones (el cambio descendente más allá de su límite de 8500 RPM) es algo que implementaría por separado, pero es algo malo en los automóviles y puede dejar que sea algo malo en su juego.
fuente
Como otros han mencionado, la velocidad del vehículo debe ser el valor real y las RPM deben derivarse de eso. El cambio ascendente debería hacer que la velocidad de rotación del motor disminuya porque la relación de RPM por km / h cambiará "instantáneamente", pero la velocidad del vehículo no lo hará.
Sin embargo, sugeriría que el par del motor debería aumentar con las RPM hasta cierto límite y superarlo. La velocidad a la que acelera un vehículo debe ser proporcional al par dividido por la relación de transmisión, menos el arrastre de aire que es proporcional al cuadrado de la velocidad. Si las marchas consecutivas tienen una relación de 1: 41: 1, se producirá un cambio óptimo para la aceleración en el punto en que el par en la marcha más baja haya caído a aproximadamente el 70% de lo que sería en la próxima marcha más alta.
fuente
Basándose en @ v.oddou, utilizando
causaría que el RPMS se maximizara instantáneamente cuando se cambian los engranajes, lo que no permite una transición suave de engranaje a engranaje. La forma correcta sería resolver las RPM utilizando la variable de velocidad como una ecuación.
Resolver por rpm
Como el equipo es 1 más alto que antes, las RPM serán más bajas.
fuente