Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Implementacion de gravedad...

Iniciado por _Grey, 12 de Enero de 2003, 04:01:07 AM

« anterior - próximo »

_Grey

                                He estado buscando paginas con documentacion sobre como implementar la gravedad, pero me encuentro con que parecen esplicar la mitad del asunto o algo asi, parece que te explican como variar la velocidad del objeto pero sin cambiar la direccion, como si la velocidad se incrementara igual tanto si el objeto va hacia arriba como si va hacia abajo!? :-?

Alguien sabe de alguna url que creais que lo tengan mas o menos claro!?
gracias.

Por ultimo queria exponer alguna duda estranbotica.... en la implementacion que tengo actualmente, la pelota parece botar demasiadas veces antes de quedarse en el suelo, tendria que reducirle la fuerza en el momento del rebote??haciendolo parece tener un movimiento mas real, pero fisicamente hablando no parece lo correcto... (quiza en el vacio si rebotaria tantas veces por la falta de aire!?)

gracias.                                

Mars Attacks

                                PuessssssSsSsSsssSSsss... a ver...
Dentro de poco intentaré echarle un cable a AgeR con las físicas, así que llevo algunos días calentándome también la cabeza sobre cómo hacer eso. Como bien dices, la gravedad lo que hace es decrementar la posición del objeto en 9'8 unidades por tiempo al cuadrado. Si el objeto está en movimiento rectilíneo, causará una trayectoria parabólica. Si el objeto sube: si sube con una aceleración de más de 9'8 ascenderá realmente; si sube con una aceleración de 9'8 permanecerá en la misma altura; si sube con menos de 9'8 bajará algo más suavemente.
Desde luego, si baja, la aceleración se le sumará a la de la gravedad.
Esta gravedad debería ir aplicada al centro de masas del objeto (aunque no sé muy bien todavía cómo hacer eso). Al dejar caer tu pelota, ésta llegará al suelo con una cierta aceleración. La reacción hará subir la pelota con la misma aceleración pero en sentido inverso, pero a la vez tendrá a la gravedad "empujando" hacia abajo, y así sucesivamente hasta que se iguale la fuerza de la gravedad con la tensión que ejerza la superficie sobre el objeto. Si tu objeto rebota demasiado (no hemos hablado de coeficientes elásticos, es complicarse mucho la vida pero creo que te haría falta eso) debería multiplicar la aceleración de reacción (con la que rebota de los sitios) por un factor de elasticidad entre 0 y 1 (0 totalmente inelástico, 1 totalmente elástico), de forma que lo puedas ajustar para que no rebote tanto al caer.
Pues nada, que me explico con los pies, pero en fin... seguramente dentro de algunas semanas sea yo quien pregunte por aquí XD                                

ethernet

Tiendo en cuenta q la gravedad solo se aplica en una direccion no es necesario especificar sentido, eso ira en funcion de otras variables como la  componente de la velocidad en la dicreccion de la gravedad. Las formulas son las de fisica de primero de bach :DD

saludos

Mars Attacks

                                Yo en ese aspecto tengo un problema. Veamos, la ecuación de la posición es

e=e0+v*t+(a*t^2)/2

De esa ecuación yo conozco el e0 (espacio inicial), que es donde cargo el objeto, y la aceleración que le aplicaré porque será una variable que modificaré por teclado (con las teclas w y s aumento y decremento la aceleración que le aplico al cuerpo).
Pero ¿qué hago con la velocidad v?¿de dónde la saco/cómo la calculo? He pensado en algunas formas, pero no me convence ninguna. ¿Lo hago a la cuenta de la vieja? es decir:
en el instante 0, e0=0, v=0, a=0, luego e=0
después incremento la a, y por tanto e0=0, v=0, e=(a*t^2)/2
despuéssss reincremento la a, y por tanto e0=e(anterior), v=a(anterior) y la aceleración igual, con lo que e=e(anterior)+a(anterior)*t+(a*t^2)/2

¿eso funcionaría? Además tendría que añadirle la gravedad (en el apartado de a, subdividirla en la suma vectorial de la a que yo le aplico y la a de la gravedad) y quizás un factor de inercia (también la suma vectorial entre ese subproducto y el vector dirección que llevara antes).

Ay, no sé, no sé...                                

Mars Attacks

                                Y un factor fricción, que podría hacerse multiplicando la a resultante por alguna constante de fricción entre 0 y 1 (0 fricción total, 1 sin fricción) para que el objeto se desacelerara cuando deja de recibir el empuje.
¿Alguien tiene alguna forma mucho más sencilla? además, todo esto debería calcularlo para cada componente de la dirección  :(                                

Mars Attacks

                               
CitarTiendo en cuenta q la gravedad solo se aplica en una direccion no es necesario especificar sentido

Dirección: eje perpendicular al suelo. Sentido: hacia abajo.

Se aplica en dirección y sentido. Lo que resultará modificada será la resultante con respecto a las otras fuerzas.

Ya, ya lo sé, soy un tiquismiquis.                                

ethernet

La frase tienes razon esta mal, me referia a q tu especificas la direccion q es perpendicular al suelo, despues el sentido te lo da el signo del vector velocidad (bueno, su componente perpendicular al suelo).

saludos :DD

jpastor

                                Mars, a ver si esto te vale. Las formulas son:

e = e0 + v*t + (a*t^2)/2   --  ( la que tu has puesto)

v = de/dt = v0 + a*t   --  (con esto calcula la velocidad a cada instante)                                

Mars Attacks

                                Sí, vale, me había dejado un *t en la ecuación que había puesto al principio al decir v=a(anterior)*t
(y el +v0 también, gracias).
Supongo que con eso y un ocho, puesss me como un bizcocho.                                

Mars Attacks

                                aún así no me acaba de gustar lo que tengo:

e=e(anterior)+v(anterior)*t+a(anterior)*t^2+(a*t^2)/2

...                                

Mars Attacks

                                A ver, a ver si me aclaro:

Supongamos un objeto C con las siguientes variables y funciones:

C.pos
C.aceleracion
C.velocidad
C.antaceleracion
C.fisicas(&pos,a,&v,&anta,t)

y que C.fisicas hace

v=(v+a*t)*factorfriccion
aux_a=a+g+anta       /*la resultante de los vectores aceleración gravedad e inercia; ¿debería haber calculado v después de este cambio?*/
pos=pos+v*t+(aux_a*t^2)/2
anta=aux_a       /* ¿o sólo debería poner anta=a? */

qué jaleooooooo llevo :)                                

x-alien

                                programar formulas matematicas y fisicas es complejillo si no se tiene practica, creo k para hacer la gravedad en el dx habria k usar sus funciones matematicas de vectores para las fuerzas, y las de matrices para los objetos... hay k comerse el coco bastante... y creo k antes de k se programa la gravedad deberia haber colisones.
en el sdk del dx9 hay un sample k tiene gravedad y colisones, el del sistema particulas de chispitas de fuego, recomiendo se eche un ojo.


salu2                                
oy Grafista, no Programador, aun así programo mejor que un 'programador'

Mars Attacks

                                Oh, no lo quiero para ningún API específico. Sólo físicas en abstracto, algo que luego se pueda adaptar a cualquier API.                                

BeRSeRKeR

                                Jeje, es evidente que si no hay detección de colisiones, no se sabe qué dirección tomaría, por ejemplo un pelota que cae por su propio peso y colisiona sobre una superficie...así que la detección de colisiones es imprescindible a no ser que el plano de colisión fuese siempre el mismo, lo cual es poco probable en una aplicación real...

Por cierto, ya puestos a implementar una física real, también habría que tener en cuenta las fuerzas de torsión (dinámica del sólido rígido) ya que una pelota al colisionar con algo, no sólo cambiará su posición sino también su rotación...

Saludos                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

seryu

                                y=y-1;



vale perdona el cachondeo, en realidad seria:

y--;                                






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.