Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: cybersersupremo en 29 de Septiembre de 2008, 10:16:24 PM

Título: choque inelastico
Publicado por: cybersersupremo en 29 de Septiembre de 2008, 10:16:24 PM
Tengo este codigo que me funciona en todos los choques escepto cuando el coche 1 le da por detras al enemigo. Hay algun fallo en la formula?

he puesto todas las combinaciones de signos a la hora de igualar a fx y fy y no funciona nunca, sin embargo en la velocidad de x si k funciones poniendo en un signo + y en otro coche el -, pero nunca en y, solo funciona un coche o ninguno. un saludo



   cr=0.8;
   mass1=1;
   mass2=1;
   this.reparacion -= Math.abs(this.speed*0.1);
   _root.enemigo.reparacion -= Math.abs(this.speed*0.09);

   
   dx=this._x-_root.enemigo._x;
           dy=this._y-_root.enemigo._y;
            d=Math.sqrt(dx*dx+dy*dy);
                                 
           // unit vector in the direction of the collision           
           var ax:Number=dx/d , ay:Number=dy/d;
                                   
           // projection of the velocities
           va1=( this.speedx*ax+this.speedy*ay),
           vb1=(-this.speedx*ay+this.speedy*ax),
         va2=( _root.enemigo.speedxreal*ax+_root.enemigo.speedyreal*ay),
         vb2=(-_root.enemigo.speedxreal*ay+_root.enemigo.speedyreal*ax);
                           
           // new velocities after collisions 


           var vap1:Number=va1+(1+cr)*(va2-va1)/(1+mass1/mass2),
           vap2:Number=va2+(1+cr)*(va1-va2)/(1+mass2/mass1);

                 
           // undo the projections (new velocities after collision)

           this.fuerzax-=vap1*ax-vb1*ay;
           this.fuerzay-=vap1*ay+vb1*ax;
           _root.enemigo.fuerzax+=vap2*ax-vb2*ay;
           _root.enemigo.fuerzay+=vap2*ay+vb2*ax;




Título: Re: choque inelastico
Publicado por: AK47 en 30 de Septiembre de 2008, 02:42:22 PM
Hombre, no preguntaste lo mismo en forocoches? Tendras que explicar un poco mas que es lo que quieres conseguir y en que contexto :)
Título: Re: choque inelastico
Publicado por: cybersersupremo en 30 de Septiembre de 2008, 02:51:20 PM
si, peor ya sabes las respuestas alli ::).

Yop tengo dos coches con una velocidad en x y una velocidad en y, simplemente quiero hacer un choque realista mas o menos, y he intentado usar la formula de choque inelastico, pero funciona cuando le dan por la derecha, cuando le das por la izkierda, cuando te dna por detras, pero no cuando te dan por delante, cambiando el signo mas y menos he conseguido, que funciones por derecha, izkierda, pero no delante y detras a la vez. siempre o funciona delante o funciona detras. un saludo
Título: Re: choque inelastico
Publicado por: Mars Attacks en 01 de Octubre de 2008, 01:41:08 PM
Estás hablando de un juego de coches visto desde arriba y en 2D, ¿no?
Título: Re: choque inelastico
Publicado por: cybersersupremo en 01 de Octubre de 2008, 11:23:59 PM
si, haber si alguien me hace el favor de decirme donde está el error ya que llevo dias y soy incapaz de solucionarlo  :grrr:. Gracias
Título: Re: choque inelastico
Publicado por: Hechelion en 03 de Octubre de 2008, 04:20:56 AM
Cita de: cybersersupremo en 30 de Septiembre de 2008, 02:51:20 PM
... pero funciona cuando le dan por la derecha, cuando le das por la izkierda, cuando te dna por detras, pero no cuando te dan por delante...

Eso se debe a que estas usando un coche macho y necesitas un coche hembra.

He estado revizando tu código y para ser sincero me cuesta interpretarlo desde la perspectiva fisica, en una colisión perfectamente inestalica lo importante es que la suma total del momentun sea 0 o sea

P1 + P2 = Pf

donde P = m * v (la masa es escalar y la velocidad debería ser vectorial)

asumo que estas trabajando el caso perfectamente inestalico, pues no veo en ningún lado un coeficiente de restitución.

fijate que la formula SIEMPRE es suma, pero recuerda que las velocidades deberían ser un vector referidos a un único sistema.


   dx=this._x-_root.enemigo._x;
           dy=this._y-_root.enemigo._y;
            d=Math.sqrt(dx*dx+dy*dy);
                                 
           // unit vector in the direction of the collision           
           var ax:Number=dx/d , ay:Number=dy/d;


Aún no logro entender para que estas haciendo eso, ¿para que necesitas el vector posición en la determinación de la velocidad resultante?.

En lo personal sería lo más simple posible

vf = (v1*m1 + v2*m2) / (m1+m2)
Título: Re: choque inelastico
Publicado por: Mars Attacks en 03 de Octubre de 2008, 09:06:20 PM
Cuando gestionas las colisiones, ¿eres capaz de detectar dónde han colisionado contigo (si ha sido por delante, por detrás, por un lado) o sólo que han colisionado contigo?

En muchos juegos de coches se tienen al menos dos "puntos" desde los que se calcula el movimiento del coche (normalmente, el centro de los dos ejes de las ruedas), para permitir además hacer cosas como derrapes y similares. Si puedes saber en qué parte ha sido la colisión (atrás, alante, por algún lateral trasero o frontal) podrás hacer lo que quieres. Si no... difícil lo veo, porque estarás tratando cada coche como un punto en un sistema de dos dimensiones.
Título: Re: choque inelastico
Publicado por: cybersersupremo en 04 de Octubre de 2008, 01:07:23 AM
Cita de: Hechelion en 03 de Octubre de 2008, 04:20:56 AM
Cita de: cybersersupremo en 30 de Septiembre de 2008, 02:51:20 PM
... pero funciona cuando le dan por la derecha, cuando le das por la izkierda, cuando te dna por detras, pero no cuando te dan por delante...

Eso se debe a que estas usando un coche macho y necesitas un coche hembra.

He estado revizando tu código y para ser sincero me cuesta interpretarlo desde la perspectiva fisica, en una colisión perfectamente inestalica lo importante es que la suma total del momentun sea 0 o sea

P1 + P2 = Pf

donde P = m * v (la masa es escalar y la velocidad debería ser vectorial)

asumo que estas trabajando el caso perfectamente inestalico, pues no veo en ningún lado un coeficiente de restitución.

fijate que la formula SIEMPRE es suma, pero recuerda que las velocidades deberían ser un vector referidos a un único sistema.


   dx=this._x-_root.enemigo._x;
           dy=this._y-_root.enemigo._y;
            d=Math.sqrt(dx*dx+dy*dy);
                                 
           // unit vector in the direction of the collision           
           var ax:Number=dx/d , ay:Number=dy/d;


Aún no logro entender para que estas haciendo eso, ¿para que necesitas el vector posición en la determinación de la velocidad resultante?.

En lo personal sería lo más simple posible

vf = (v1*m1 + v2*m2) / (m1+m2)


hola, la verdad es que no tengo ni idea de porque uso esa formula, solo la uso porque lo vi en otra programaicon que hacian los choques asi, y funcionan, osea que el problema es mas bien en que cada frame yo vuelvo a calcular la velocidad en x y la velocidad en y dependiendo de la rotiaicon del coche y la velocidad total. ahi está el problema. Respecto a la formula que pones

vf = (v1*m1 + v2*m2) / (m1+m2) , es la velocidad final de 1 o la velocidad final de 2, supongo que al ser toalmente inelastica debe ser que se van los dos juntos. un saludo

Título: Re: choque inelastico
Publicado por: cybersersupremo en 04 de Octubre de 2008, 01:08:56 AM
Cita de: Mars Attacks en 03 de Octubre de 2008, 09:06:20 PM
Cuando gestionas las colisiones, ¿eres capaz de detectar dónde han colisionado contigo (si ha sido por delante, por detrás, por un lado) o sólo que han colisionado contigo?

En muchos juegos de coches se tienen al menos dos "puntos" desde los que se calcula el movimiento del coche (normalmente, el centro de los dos ejes de las ruedas), para permitir además hacer cosas como derrapes y similares. Si puedes saber en qué parte ha sido la colisión (atrás, alante, por algún lateral trasero o frontal) podrás hacer lo que quieres. Si no... difícil lo veo, porque estarás tratando cada coche como un punto en un sistema de dos dimensiones.

Asi lo tenia al principio por partes pero sin formula, si la parte de atrás choca con la de alante tal, si la de alante toca con la de atrás tal, pero noe s muy real.

La velocidad la calculo en un punto, podrias explicarme mejor como se hace eso enlos dos puntos, o algun ejemplo de ocdigo dond elo pueda ver para ver como se hacne bien los derrapes! Gracias
Título: Re: choque inelastico
Publicado por: Mars Attacks en 04 de Octubre de 2008, 06:07:32 PM
Si no recuerdo mal, en este mismo foro puedes encontrar algo del tema usando el buscador (si funciona bien, claro). La idea general es usar dos puntos de referencia a priori con físicas independientes y obtener la resultante como movimiento total del coche.