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.
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
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
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é...
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 :(
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.
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
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)
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.
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
...
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 :)
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
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.
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
y=y-1;
vale perdona el cachondeo, en realidad seria:
y--;
Pues tendre que implementar el tema de la elasticidad para que no "vote" demasiado, la verdad es que queda bien con eso, pero al no ser real tenia mis dudas por si me llebava un dia una sorpresa.
[Contestando a BeRSeRKeR]
Tampoco ahi que pasarse con el tema de la rotacion de la esfera y demas, por ahora con que vote casi vale.
[Contestando a todos]
Parece que en esto tendremos todos que tropezarnos... :)
Gracias.
[aquien pueda interesar]
Al final en lugar de implementar el tema de la elasticidadpara que cuando vote pierda fuerza, e decidido experimentar con la friccion, el resultado es bueno.Para implementar la friccion lo unico que e hecho es aplicar una fuerza en direccion contraria a la que se mueve la esfera, pero eso si, de muy poca fuerza.
En fin gracias a todos, y hasta otra.
Adios.
Solo por curiosidad, si no tenias elasticidad ni friccion como se paraba la pelota?
En respuesta a uno de los primeros posts (si, ya se q llego tarde xD) la v de la formula de la posicion se refiere a la velocidad inicial
Enga, espero q te sirva
Sobre la v de la formula tienes razon y no la tienes. En la formula si es la inicial, pero eso solo vale si la aceleracion es constate en todo el movimiento.
Lo que creo que se hace es ir cambiando el origen de tiempo a cada frame (como si empezara el movimiento a cada instante), asi V0 pasa a ser Vanterior y 't' pasa a ser el tiempo desde el ultimo frame (como he dicho se cambia el origen de tiempo al frame anterior). Con esto y cambiando la aceleración en cada frame segun convenga (la gravedad y el rozamiento es constante pero puedes querer darle una patada a la pelotita o apretar el acelerador del coche) consigues un movimiento con aceleracion variable.
¿Que tal me he esplicado? :loco:
Hmmm en lugar de tener un tiempo universal usar tiempos locales... eso no lo había pensado, aunque no sé entonces cómo "coordinar" todas las físicas del entorno. O eso o usar un tiempo universal que se reinicie al acabar de calcularse las físicas.
Xtrai2, mi pregunta no era qué era la v0, sino cómo obtenerla conociendo sólo la posición y la aceleración, pero ya lo hemos ido desgranando poco.
Pues nada, igual el día que me ponga a implementar todo eso os lo mando como CDLS :ojo:
ya jpastor, eso es la formula del MRUA, y como mars attacj hablo de la gravedad, que es un MRUA, pos se lo intentaba aclarar.
Mars, no se de que es tu juego pero igual encuentras formulas mas especificas de parabolas y esas cosa...
No es para ningún juego en particular, sólo quiero programar físicas para que un objeto se comporte más o menos de acuerdo con la realidad. Las fórmulas las sé, no hay nada que no esté en los apuntes de BUP o COU, pero a la hora de pasarlas a código surgen algunos problemas, como el tema de usar velocidades anteriores y ese tipo de cosas que, obviamente, no pasan en las derivadas o diferenciaciones de las ecuaciones de físicas.
Pero gracias por tu interés :) Creo que de momento, si consigo implementar lo que ya tengo, irá bien la cosa (tengo que ajustar todo eso a vectores, y probablemente aplicar alguna rotación o algo para conseguir algunos efectos de giro o de caída en picado).
a ver si esto te sirve:
http://www.enreos.com/ilogicgames/laborato.../polyinter2.htmComo estamos cambiando el server igual no funciona, si es asi simplemente ve a
http://www.ilogicgames.com :flecha: laboratorio :flecha: Moverse por la malla 3D - Colisiones: 2ª Parte
taluego
Está estupendo, me ha solucionado problemas que aún no tenía y seguro que a Grey le hace mucho servicio también :D
Hey Ionicboy! gracias por esos links!