Resultados 1 al 3 de 3

Física en videojuegos

  1. #1
    Fecha de ingreso
    Aug 2011
    Mensajes
    14

    Unhappy Fisica en videojuegos

    Hola, bueno hace rato no público ni nada, pero como buscando y buscando vi a varios que saben mucho de programación, tal vez me puedan/quieran ayudar, ahí va:
    Estamos haciendo (para la Facu) el típico juego de proyectiles de tiro oblicuo (suponete que sea el engry birds), con gravedad. Trabajamos con sfml y en C++.

    Lo que tengo es esto y noce que es lo que me está faltando para hacer andar.
    Código:
    //tomamos el tiempo total de la aplicación tt_total += app->getframetime (), tdelta_t = app->getframetime (), t//calculamos vix, viy, posix, posiy tvix = velocidad * cosf(ángulo), tviy = velocidad * sin(ángulo), tposix = vix * t_total, tposiy = posiy + viy * delta_t - 0.5 * (g) * (delta_t * delta_t), tbala->setposition(posix, posiy), tviy = viy - G * delta_t;
    Bueno aclaremos un poco.

    T_total: es el tiempo total de la aplicación.

    Delta_t: es el tiempo descompuesto, es para usarlo como integrador numérico.

    Vix: es la velocidad inicial en x.

    Viy: es la velocidad inicial en y.

    Posix: es la posición inicial en x.

    Posiy: es la posición inicial en y.

    Bala: es el sprite de una bala y la seteamos en (posix, posiy).

    Viy: ahora es afectada por la gravedad lo que debería hacerla disminuir su velocidad.
    "No permitas que nadie diga que eres incapaz de hacer algo, ni si quiera yo. Si tienes un sueño, debes conservarlo. Si quieres algo, sal a buscarlo, y punto. ¿Sabes?, la gente que no logra conseguir sus sueños suele decirles a los demás que tampoco cumplirán los suyos"
    Will Smith

  2. #2
    Fecha de ingreso
    Feb 2004
    Mensajes
    4,832

    Fisica en videojuegos

    Buenas. Supongo que quieres usar las fórmulas del movimiento parabólico. El problema es que no te vale el tiempo total de la aplicación como variable de tiempo, pues el segundo tiro sería igual que el primero, y así sucesivamente. Por tanto, cada bala tiene que tener su propio contador, o bien resetear el contador para cada nuevo tiro. Eso es lo primero, por lo tanto, no te vale el t_total, a no ser que lo resetes (igualar a 0) cada vez que haya un nuevo tiro.
    (A partir de ahora asumiré que en t_total tenemos el tiempo correcto, en base a lo comentado arriba).

    Por otra parte, te estas armando un lío con las variables:
    -Lo que tú llamas posix y posiy no son la posición inicial, sino la posición actual, pues dependen del tiempo. O sea, que has mezclado la posición inicial y la actual, necesitas otras dos variables. Así pues, una vez calculadas vix y viy, calculas la posición para el nuevo instante de tiempo.

    Para la posición x utilizas el tiempo absoluto (t_total) y para el y el diferencial (delta_t). Esto no tiene mucho sentido. Si utilizas t_total como te he comentado arriba debes usar t_total en ambos casos.

    La última línea sobra, la viy (velocidad inicial) no se modifica, pues es la inicial.

    En resumen, si quieres utilizar t_total reseteándolo para cada tiro:
    Código:
    tt_total += app->getframetime (), // lo ponemos a 0 para cada nuevo tiro o disparo tdelta_t = app->getframetime (), // no lo necesitamos en realidad tvix = velocidad * cosf(ángulo), tviy = velocidad * sin(ángulo), tpx = (vix * t_total) + posix; // posición en el instante t_total tpy = posiy + viy * total_t - 0.5 * (g) * (total_t * total_t), tbala->setposition(posix, posiy).
    Donde:
    Vix, viy: velocidad inicial, es una constante.

    Pix, piy: posición inicial, es una constante.

    Px, py: posición actual. Se calcula cada frame.

    La alternativa es usar el diferencial de tiempo (delta_t), lo cual yo creo que sería lo más apropiado. Si es eso lo que quieres, dímelo y te lo explico. Un saludo.

  3. #3
    Fecha de ingreso
    Aug 2011
    Mensajes
    14

    Fisica en videojuegos

    Muchas gracias por la respuesta, ya lo había solucionado me quedo de la siguiente manera, por si alguien lo necesita:
    Código:
    viy = viy + (g * delta_t), vix = vix + (viento * delta_t), posix = posix + (vix * (delta_t)) + 0.5 * viento * ((delta_t) * (delta_t)), posiy = posiy - (viy * (delta_t)) - 0.5 * g * ((delta_t) * (delta_t)), //aquí cambiamos los sign ya que tenemos la g negativa sprite. Setposition(posix, posiy),
    Donde viento afecta a la pelota sobre el eje X y g sobre el eje y, y delta_t es el tiempo que pasa entre cada frame, se lo multiplico por 10 para que sea más rápido, y me quedo de 10. Saludos.

    Posdata: entiendo lo que me quieres decir, pero posiy y posix, los nombro como posición inicial porque son así cuando empiezan, después obviamente que no son más iniciales, pero como la formula es esa.
    "No permitas que nadie diga que eres incapaz de hacer algo, ni si quiera yo. Si tienes un sueño, debes conservarlo. Si quieres algo, sal a buscarlo, y punto. ¿Sabes?, la gente que no logra conseguir sus sueños suele decirles a los demás que tampoco cumplirán los suyos"
    Will Smith

Temas similares

  1. 3dsMax Física matemáticas y Maxscript
    Por promineo en el foro Animación y Rigging
    Respuestas: 18
    : 12-02-2008, 00:21
  2. Hardware PhysX acelerador de física
    Por durruty en el foro Hardware
    Respuestas: 6
    : 13-06-2006, 07:27
  3. Engine de física sorprendente
    Por Quel en el foro Programas de Diseño 3D y CAD
    Respuestas: 4
    : 26-01-2006, 15:14
  4. Hardware Física y RV
    Por dreamaker en el foro Hardware
    Respuestas: 5
    : 20-06-2004, 22:27
  5. Simulación física con péndulo
    Por spardaknight_xd en el foro Programas de Diseño 3D y CAD
    Respuestas: 3
    : 30-04-2003, 21:30