Gracias Gracias:  0
Resultados 1 al 3 de 3

Tema: Fisica en videojuegos

  1. #1
    Miembro Nuevo
    Fecha de ingreso
    Aug 2011
    Ubicación
    Reconquista
    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 programacion, 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 esta faltando para hacer andar

    Código:
    //Tomamos el tiempo total de la aplicacion
    	t_total += App->GetFrameTime();	
    	delta_t = App->GetFrameTime();
    
    	//Calculamos Vix, Viy, Posix, Posiy
    	Vix = Velocidad * cosf(Ángulo);
    	Viy = Velocidad * sin(Ángulo);
    	Posix = Vix * t_total;
    	Posiy = Posiy + Viy * delta_t - 0.5 * (G) * (delta_t * delta_t);
    	Bala->SetPosition(Posix, Posiy);
    	Viy = Viy - G * delta_t;
    Bueno aclaremos un poco,

    t_total: es el tiempo total de la aplicacion
    delta_t: es el tiempo descompuesto, es para usarlo como integrador numerico

    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
    Vampiro Giovanni Avatar de Pepius
    Fecha de ingreso
    Feb 2004
    Ubicación
    Guadassuar, Valencia
    Mensajes
    4,998

    Re: 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 tanto no te vale el t_total, a no ser que lo resetees (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 lio con las variables:

    - Lo que tu 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 reseteandolo para cada tiro:
    Código:
    	t_total += App->GetFrameTime();	// Lo ponemos a 0 para cada nuevo tiro o disparo
    	delta_t = App->GetFrameTime(); // No lo necesitamos en realidad
    
    	
    	Vix = Velocidad * cosf(Ángulo);
    	Viy = Velocidad * sin(Ángulo);
    	Px = (Vix * t_total) + Posix; // Posicion en el instante t_total
    	Py = Posiy + Viy * total_t - 0.5 * (G) * (total_t * total_t); 
    	Bala->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
    Miembro Nuevo
    Fecha de ingreso
    Aug 2011
    Ubicación
    Reconquista
    Mensajes
    14

    Re: 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));			//Aca 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 rapido.. y me quedo de 10! saludos

    P.D: entiendo lo que me quieres decir, pero Posiy y Posix, los nombro como posición incial porque son así cuando empiezan, después obviamente que no son más inciales, 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. Sistema de Fisica Cloth
    Por 3dpoder en el foro Blender
    Respuestas: 0
    Último mensaje: 11-01-2009, 14:34
  2. Fisica, Matematicas y maxscript
    Por promineo en el foro Animación y Rigging
    Respuestas: 18
    Último mensaje: 12-02-2008, 02:21
  3. Centro de Rehabilitacion fisica
    Por javim en el foro Trabajos Finalizados
    Respuestas: 4
    Último mensaje: 01-11-2007, 22:42
  4. fisica y rv
    Por dreamaker en el foro Hardware
    Respuestas: 2
    Último mensaje: 20-06-2004, 23:27
  5. fisica y rv
    Por dreamaker en el foro Hardware
    Respuestas: 2
    Último mensaje: 18-06-2004, 19:09

Actualmente estos son sus permisos de publicación en el foro.

  • -No puedes crear nuevos temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes responder temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes subir archivos adjuntos al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes editar tus mensajes al no estar registrado o no haber iniciado sesión en el foro.
  •