Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





choque inelastico

Iniciado por cybersersupremo, 29 de Septiembre de 2008, 10:16:24 PM

« anterior - próximo »

cybersersupremo

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;





AK47

Hombre, no preguntaste lo mismo en forocoches? Tendras que explicar un poco mas que es lo que quieres conseguir y en que contexto :)

cybersersupremo

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

Mars Attacks

Estás hablando de un juego de coches visto desde arriba y en 2D, ¿no?

cybersersupremo

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

Hechelion

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)

Mars Attacks

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.

cybersersupremo

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


cybersersupremo

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

Mars Attacks

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.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.