Pregunta

estoy poniendo en práctica un pequeño juego y estoy teniendo problemas para conseguir la física que trabajan correctamente. En este juego, hay una bola (un círculo que se mueve de cuadro a cuadro, y puede cambiar de radio) y varias paredes (segmentos de línea que también cambian y se mueven de cuadro a cuadro). Puedo detectar colisiones correctamente, y hacer que la pelota rebote en la dirección correcta es ningún problema.

surgen

Dificultades en situaciones en que el balón se cruza una línea en una trama, a continuación, se cruza de nuevo en la trama posterior, causando un doble rebote. Podía mover el balón hacia atrás a lo largo de la normal de la línea hasta que se encuentra en una posición válida, pero esto hace que realmente el comportamiento extraño cuando la línea en cuestión está siendo golpeado a lo largo de su eje (imagine una pelota de ping pong cayendo sobre un palillo de dientes en posición vertical y de repente el cambio de lado de modo que está en un lado del palillo de dientes ...). También hay algunos problemas cuando la pelota cruza más de una línea en una trama dada (cuatro líneas imaginar juntos haciendo un rectángulo y la pelota intersección de la esquina de dicho rectángulo) - en qué dirección debe rebotar? ¿En qué dirección debería cambiar?

Realmente no tengo una pregunta específica, pero estoy buscando consejo o algunos tutoriales útiles. Todos los 2D he conseguido encontrar hasta ahora sólo intersecciones cubierta de rectángulo.

Estoy usando XNA si hace alguna diferencia.

Gracias,
Cameron

¿Fue útil?

Solución

Este es un problema universal con la mayoría de las bibliotecas de la física. Si Google de "profundidad de penetración" (junto con la "física", sugiero, o usted podría encontrar algo totalmente diferente: D). Encontrará que incluso estas bibliotecas utilizan trucos como la suya

Hay dos soluciones a este:

El barata es aumentar su frecuencia de actualización. Mover objetos en 10 pasos más pequeños en lugar de a una sola grande y tendrá una menor penetración, por lo que la fijación compensando el balón lejos de la pared será menos visible.

El uno costosa es la detección de colisiones continua. Hay algoritmos que pueden decir, dado un movimiento y un objeto fijo, el punto exacto en el tiempo ambos se cortará. Google "esfera barrida rectángulo intersección" para encontrar algunos de estos.

A continuación, puede actualizar la siguiente manera: bola tiene que moverse en 1,0 unidades. Compruebe si hay colisión. Colisión se produce después de 0,25 unidades, así que mueva balón en 0,25 unidades, calcular vector de reflexión (para que la pelota rebota en la pared), repetir prueba de colisión con 0,75 unidades restante (hasta que sepa la posición final de la bola). Esto evita penetraciones e incluso si su bola se mueve tan rápido que normalmente saltar por encima del muro en una sola actualización, serán detectados por completo la colisión.

Otros consejos

Es generalmente aceptado que, debido al paso de tiempo sus colisiones se cruzarán más allá de un punto aceptable entre actualizaciones.

Básicamente, usted tiene que volver a interpolar el punto entre la última y actual marco donde la colisión ocurrió realmente, mover el objeto de nuevo a ese punto, y luego calcular las fuerzas, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top