• Viernes 29 de Marzo de 2024, 00:08

Autor Tema:  Colisiones 3D  (Leído 5199 veces)

elcraked

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Colisiones 3D
« en: Domingo 30 de Mayo de 2010, 10:43 »
0
Hola a todos! En la universidad me han mandado hacer un juego de tenis con OpenGl y c++. Mi problema es que nosé cómo hacer las colisiones en 3D con la raqueta, porque las tengo hechas en 2D y claro, si la raqueta está quieta si que golpea a la pelota, pero en cuanto se mueve hacia delante (eje z) parece que es invisible y no la da. Se que tengo que hacer la distancia de un punto a un plano (cuadrilatero en este caso al ser la raqueta) pero nosé como implementarlo en c++, si alguien me ayudara se lo agradeceria mucho. Un saludo y gracias de antemano.
Diego

best_guitar

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Colisiones 3D
« Respuesta #1 en: Sábado 5 de Junio de 2010, 22:06 »
0
Hola,
no tengo mucha experiencia en 3D, y por eso te pregunto a tí. ¿No es posible utilizar la colision 2D, previa consulta de la posicion Z de la raqueta y de la pelota?
Saluts!

elcraked

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Colisiones 3D
« Respuesta #2 en: Sábado 5 de Junio de 2010, 22:12 »
0
Se puede utilizar pero hay un problema al avanzar en la posicion del eje z ya que por ejemplo, en mi caso yo pulso la tecla para avanzar hacia delante y me avanza 0.8 posiciones, es decir que en el momento que pulso la raqueta ya está mas adelantada que antes y el sistema no coge la posicion de la pelota con respecto a la raqueta y por eso parece que es transparente. Una solucion es poner que avance de poco en poco, por ejemplo 0.1 pero asi, se mueve muy despacio...
Al final lo he conseguido arreglar poniendo que la bola rebote cuando esté a 0.8 de la raqueta, no es una manera muy ortodoxa pero... funciona.
Ahora tengo otro problema, y es que no se como hacer el movimiento de la raqueta si alguien pudiera ayudarme...
Espero haberme explicado bien.
Un saludo

best_guitar

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Colisiones 3D
« Respuesta #3 en: Domingo 6 de Junio de 2010, 09:00 »
0
hola,
yo pienso que yo pondria que la pelota pudiera rebotar si está entre -1 y +1 (valor arbitrario segun el realismo) de la raqueta en cuanto al eje Z. Quiero decir ir comparando la posicion Z del extremo de la pelota mas cercano a la raqueta, y la posicion Z de las cuerdas de la raqueta.

en cuanto al movimiento de la raqueta, tal vez, con una simple rotación sobre el eje Y del centro de la raqueta (si la tienes dibujada en horizontal, O== ), por ejemplo de 10 grados a cada scan, hasta unos 120 grados, y volver a retroceder hasta los grados iniciales, tendrias una solucion.

Saluts!

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Colisiones 3D
« Respuesta #4 en: Domingo 6 de Junio de 2010, 10:18 »
0
Yo usaría el valor de colisión de acuerto a un baremo de 'tensión del cordaje de la raqueta' , es decir el cordaje muy tenso podría tener un valor 5 y el cordaje menos tenso un valor de -5 por ejemplo , así tendrías 11 niveles de tensión. Este mismo valor serviría para determinar luego la fuerza de rebote, la exactitud del ángulo del rebote y por tanto la capacidad de 'efectos'.

Cuánto más tensa, con mayor fuerza devuelve la pelota también con mayor precisón resulta el ángulo pero la posibilidad de efecto es nulo y al revés cuanto menos tensa (-5) con menos fuerza devuelve la pelota, la precisión del ángulo de rebote es menor pero hay grandes posibilidades de hacer efectos

Los efectos serían la diferencia que hay entre un 'tiro tenso' y un 'tiro parabólico', el efecto lo calcularíamos como la variación de la posición de la raqueta cuando el valor de colisión es (pongamos 200) y  cuando alcanza el valor de colisión para la tensión elegida por el usuario teniendo en cuenta la velocidad de la pelota.  un ejemplo de suposición, cuando la posición de  la pelota para una colisión es 200, o menos tomamos la posición de la raqueta, calculamos el ángulo de la pelota con la raqueta y le llamamos 'angulo de llegada' cuando la pelota impacta (el valor de colisión determinado según el nivel de tensión de la cuerda) tomamos nuevamentela posición de la raqueta para determinar el 'ángulo de impacto'. Ahora con el ángulo de llegada, el ángulo de impacto, la velocidad de la pelota y la tensión de la cuerda debes determinar una trayectoria de rebote y una velocidad de rebote. Adicionalmente podrías alterar estos valores en función de la distancia al centro de la raqueta donde impacte la pelota, le daría más realismo pero tus cálculos serían un poco más complejos.

Por supuesto los mismos valores: angulo de llegada, ángulo de impacto, velocidad de la pelota y tensión de las cuerdas (no hemos considerado tensión de la raqueta (la fuerza con que se sujeta la raqueta), ni aceleración de la raqueta (diferencia de tiempo que transcurre entre el cálculo del angulo de llegada y el angulo de impacto, es decir acerco la raqueta a la pelota, mantengo la distancia o alejo la distancia?, el cual influye en la fuerza de rebote) ni como decíamos antes, lugar de impacto sobre la raqueta (no es lo mismo que pegue en el centro que próximo a un extremo)) podrías usarlo para calcular el movimiento de la raqueta.

Calcular los valores:
* Velocidad de la pelota: Velocidad de salida de la pelota (desde el jugador contrario) menos la pérdida unitaria por distancia en base a la trayectoria seguida. también podrías calcularla como velocidad de salida de la pelota - tiempo transcurrido. Este valor en todo caso se calcula cuando la pelota está a una distancia de colisión de 200 o menos. (distancia de precolisión y que asociamos con el material de la raqueta cuando el golpe va a proceder con la raqueta y con el tipo de pista y escenario cuando rebota en el suelo). Al hablar más abajo de tensión de pista, se explica más sobre esto.
* Angulo de llegada: Angulo formado entre el centro de la raqueta y el centro de la pelota cuando esta en distancia de precolisión.
* Angulo de impacto: angulo formado entre el centro de la raqueta y el centro de la pelota cuando ésta hace colisión.
* Tensión de las cuerdas: ya vimos que este valor es una constante elegida por el jugador y que va asignada a la tensión de las cuerdas de la raqueta. Es una propiedad de la raqueta.


Si los añades ...:
* Tensión de Pista: para simular rebotes en el suelo .... es equivalente a considerar un jugador excepto en 2 cosas el cálculo es más simple porque no hay , elementos de cálculo 'extra' (los que se detallan debajo). El valor de distancia de precolisión, en vez de 200, podría variar según sea un suelo de tierra o hierba y además variar ligeramente estos valores según la pista donde se juegue: por ejemplo Roland Garrós: tierra = 230, Hierba = 200, Sidney; Tierra= 240, hierba = 180; Winbledon Tierra= 210, hierba= 170..etc... quédate con la idea, no con los valores.

Otra cosa para calcular rebotes de pista, la velocidad de precolisión aumenta con la gravedad, por lo que aquí importa el valor y máximo alcanzado, pero incluso más que el valor y importa la relación xy, distancia x entre el jugado que golpeó entre la altura máxima alcanzada. Este valor lo calculas como un factor de suma para la velocidad de salida del rebote, deberás probar una constante que se multiplica por dicho factor calculado, para ver que tenga un efecto lo más realista posible sin encarecer tus cálculos. Es decir si tu calculaste una velooocidad de rebote de 80Km/h este factor podría darte un valor a sumar en un rango +- 10%, 10% cuando salió un 'globo' y -10% cuando se hizo una dejada cerca de la red y una altura no mayor de 2 metros (por poner un ejemplo). Fíjate como un valor 0, prácticamente sería cuando se golpea desde la línea de fondo y la pelota no supera los 2 metros de altura, luego un valor negativo será cuando x sea un valor menor y será un valor positivo cuando la pelota tienda a subir más alto de 2 metros  y cuanto más cerca de la red... esto te da una idea aproximada de como hallar un valor eficaz.

* La tensión de la raqueta: es una suma a la tensión de las cuerdas, pero digamos que la tensión de las cuerdas es constante y la tensión de la raqueta podría definirse para el jugador en cada movimiento (golpe), si quiere hacer una dejada cerca de la red, tendrá que tener una tensión de raqueta muy baja con respecto a si quiere hacer una dejada estando lejos de la red.
*  El lugar de impacto en la raqueta: De modo similar, es una suma para ese 'golpe' a la tensión de las cuerdas, influye también en el ángulo de salida.
* La velocidad de movimiento de la raqueta (en busca de la pelota):, también es un valor a sumar a la tensión de las cuerdas, éste valor influirá en la velocidad de devolución y en ciertos efectos en el eje x/z  é y/z (normalmente más en uno que en otro).

Nota: yo he puesto un valor de 200 (2 metros) como distancia de precolisión, pero en la práctica tendrás que probar, la idea es simplemente establecer el concepto, más que el valor.... y recuerda que ese valor puede y debería ser también un factor unido a la raqueta podrías reflejarlo como una propiedad del material de la raqueta, madera, plástico, metal y por tanto variar entre una gama de valores....
Calcular un valor para la precolisión debería ser basado en el tiempo y las distancias empleadas, supongamos que empleas distancias en cm. y que la pista tiene  24 metros, entonces deberíamos definir un tiempo de reacción del usuario que puede ser aproximadamente de menos de 1 segundo, luego la precolisión va relacionada con la distancia que la pelota sería capaz de recorrer en ese tiempo, como no es una situación real, podriamos conformarnos con que este valor sea fijo para una distancia o para un tiempo, si lo haces para el tiempo resultará más practico calcularlo en el temporizador pero posiblemente no sea tan eficaz ya que subyugas la veocidad de respuesta del jugador tanto si la pelota va a 150km/h como si va a 30km/h, basarlo en distancia es más realista, pero complica los cálculos, entonces el tiempo de reacción del oponente dependerá de la velocidad de la pelota, que efectivamente es más realista aunque tampoco exacto. Sin embargo utilizar inicialmente un valor basado en el tiempo te permite experimentar con mayor comodidad y te ayudará a encontrar un valor óptimo basado en la distancia, por eso no desprecies usar en pruebas un valor basado en el tiempo de reacción por ejemplo 1 segundo para empezar a probar estaría muy bien... pero naturalmente tendrías que ir reduciendo hasta llegar posiblemente a tiempos de 50-300milisegundos. (no pases por alto la jugabilidad aunque suponga falsificar al alza estos valores, si no resultará un juego muy difícil).
Un valor de 150 km/h (como valor de saque) es una velocidad de 41'6 m/sg luego a esa velocidad la pelota tarda apenas medio segundo en cruzar la pista de extremo a extremo, esa velocidad va decayendo, de modo que debe actualizarse constantemente, luego el resto del peloteo alcanza velocidades mucho menores también influídos por las distancias a recorrer.

Nota 2: la colisión debe estar sincronizada con el 'avance mínimo' del movimiento de la raqueta, por ejemplo si tu avance es 0'8 (como indicas que tienes) la colisión  sobre las cuerdas debe estar en el rango -0'4 a + 0'4 (para una tensión de cuerdas igual a 0, para una tensión de cuerdas igual a 3 debería estar entre 2'6 y 3'4), y la precolisión (usando por ejemplo el valor de 200) un valor 10 veces mayor en: 196 a 204. (8 cm de recorrido)

p.d.: Como necesitas un timer para ir actualizando el avance de la pelota, debes establecer 2 comparaciones, si la pelota toca el suelo antes de la red o no, una vez sobrepasada la red, ahora empezamos a comparar el momento en que la pelota alcance la distancia de precolisión para calcular  los valores previos para el cáclulo de un rebote sea del jugador o del suelo, si se produce un rebote en el suelo ahora, es claro que el movimiento de avance sigue pero con valores actualizados por el rebote. sobrepasar la red para entrar en la pista del jugador contrario por tanto es un buleano:

Operativa del temporizador:
Código: Text
  1.  
  2. actualizar avance pelota
  3. actualizar desplazamiento de jugadores (raquetas) si hubiere lugar
  4. si red false luego (la pelota aún está en el campo del que saca)
  5.          si precolision luego
  6.                  colision igual calcular si colisión en suelo
  7.                  si colision suelo luego  
  8.                          punto perdido para el jugador, botó en su propio campo
  9.                           esto implica: parar temporizador, actualizar puntos, pelota en manos del jugador correspondiente para saque
  10.                 fin si                
  11.          no precolision
  12.                  precolision igual calcular si precolisión en suelo
  13.                  si precolision luego        
  14.                          calcular condiciones de llegada
  15.                  fin si
  16.          fin si
  17.          red igual calcular si red (si se sobrepasó la red consultando el valor x),  según el turno del jugador  
  18. si red true luego
  19.          si precolision luego
  20.                  colision igual calcular si colisión en suelo
  21.                  si colision suelo luego
  22.                          si botes igual 0 luego
  23.                                  si botó dentro campo luego
  24.                                           recalcular trayectoria
  25.                                           botes igual 1
  26.                                           colision igual false
  27.                                           precolision igual 0
  28.                                  si botó fuera de campo
  29.                                          punto perdido para último jugador que golpeó pelota
  30.                                  fin si
  31.                          si botes igual 1 luego
  32.                                 punto ganado para último jugador que golpeó pelota
  33.                          fin si        
  34.                  si colision jugador luego
  35.                           calcular Rebote
  36.                  fin si
  37.          no precolision
  38.                  precolision igual calcular si precolisión en suelo o jugador
  39.                  si precolision luego   (sea un tipo u otro): precolisión=0 no hay presolisión, precolisión=1 precolisión de suelo, precolision= 2 precolisión de jugador, precolisión= 3 precolisión de suelo y jugador (la colisión determinará que sucede al final si jugador o suelo).      
  40.                          calcular condiciones de llegada
  41.                  fin si
  42.          fin si
  43. fin si
  44.  
«Ma non troppo»
----> ModoVacaciones = False<----

satmon

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Colisiones 3D
« Respuesta #5 en: Martes 8 de Junio de 2010, 01:44 »
0
en mi opinion, el rebote de lapelota tiene que ver con el angulo de incidencia de la pelota de la raqueta, con la velocidad vectorial de la raqueta, no se trata de calcular cuando la pelota coliciona con la raqueta, sino de cuando la pelota va a colicionar con la raqueta, es decir, hay que calcular de antemano en que momento la pelota va a chocar con la raqueta, para detenernos en el momento exacto y cambiar el movimiento de la pelota de acuerdo con su movimiento.

Otra cosa: no se trata de la distancia de un punto a un plano,  si no de la distancia de una esfera a un plano,.

Suponiendo que la pelota parte de un punto Op y se mueve en dirección  V

la funcion de la posicion de la pelota es=

P(t)= Op + V*t

Y suponiendo que la raqueta es un plano R de origen Or y normal N, la funcion de la distancia con signo es:


D(p)=N.p + C

donde C= -(N.Or)

//si la distancia es positiva, el punto esta delante de la raqueta, de lo contrario esta detras

Despues de un monton de pasos se llega a la ecuacion del momento en el recorrido de la pelota de radio r sobre V cuando colisiona con la raqueta:

t0=(r-D(Op))/(N.V)
//para cuando la pelota choca

t1=(-r-D(Op))/(N.V)
//cuando la pelota deja de colisionar