Por ejemplo, tome este escenario (disculpe mis horribles habilidades de dibujo):
Esto se basa en el "Portal", donde el stickman atraviesa el portal azul (que está vinculado al portal rojo), pero hay una pared que lo detiene en el portal rojo. Por lo tanto, no puede pasar completamente por el portal.
Entonces mi pregunta es la siguiente: ¿Cómo hago la detección de física / colisión con ellos? ¿Corto el reproductor? ¿Hay alguna manera de vincularlos? ¿Hay algún motor de física que lo permita? Si no, ¿cómo haría uno?
Respuestas:
El juego Portal tiene una buena manera de resolver este problema:
El jugador se pega a través del portal de origen (azul) y se ve sobresaliendo del portal de destino (naranja). El jugador se copia en el portal de destino y se lo ve pasar a través de él. El juego renderiza la imagen que ves cuando miras a través del portal de origen usando una segunda cámara y renderizado a textura.
Sin embargo, la copia del jugador en la ubicación objetivo no interactúa con la física. Solo está allí para fines de representación. En cambio, hacen objetos virtuales de colisión en el otro lado del portal de origen, y hacen que el jugador choque con eso. Esto mantiene la física simple.
Solo necesita esos objetos virtuales hasta donde el jugador pueda alcanzar sin pasar completamente por el portal. Tan pronto como el jugador pase completamente por el portal, la situación se revierte.
Una imagen para ilustrar : el portal azul es el portal de origen, el portal naranja el portal de destino. El cuadro blanco discontinuo es el objeto de colisión virtual, mientras que el cuadro real es el objeto renderizado. El jugador (con el punto rojo) solo interactúa con los objetos directamente a su alrededor. Los objetos en el portal naranja se ignoran por completo.
fuente
Así es como lo intentaría y lo haría.
Mientras esté dentro de un portal, habrá dos copias del jugador en el motor de física. Cada copia ignora todas las colisiones que se encuentran en el lado opuesto del portal, y luego combina los resultados y aplica los resultados de la simulación a ambos modelos.
Idealmente, aplicaría la gravedad por separado para cada mitad del jugador, pero podría salirse con la suya simplemente aplicándola al lado del portal en el que se encuentra el centro de masa del jugador.
Para ignorar esas colisiones, debe configurar un volumen apropiado y probar si hay un punto dentro de él. Un cilindro (posiblemente estirado verticalmente) parece ser una buena opción. La prueba es entonces algo así como
if (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();
Creo que la mayoría de los motores de física tienen un sistema para filtrar con qué puede chocar un objeto, por lo que debería ser posible utilizando un motor de física estándar. Por ejemplo, http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering
Para combinar los resultados, la opción más simple probablemente sería agregar algún tipo de restricción inflexible entre los dos, y dejar que el motor de física lo maneje.
fuente
¿Por qué quieres hacerlo? No necesita calcular qué tan lejos "cae" un jugador; descubrirá qué tan lejos llega a medida que el objeto pasa por la simulación.
Un portal, desde una perspectiva puramente en el juego, es poco más que un teletransportador elaborado que se mete con la colisión para convertir los objetos colisionables en objetos no colisionables. Cuando un objeto toca el portal, comienza a colisionar potencialmente con cosas del otro lado. Cuando el objeto pasa "lo suficientemente lejos" a través del portal, efectivamente lo teletransportas al otro, cambiando instantáneamente su posición y orientación.
La física simplemente procede de manera normal.
fuente
When an object touches the portal, it starts potentially colliding with things on the other side
sí exactamente. ¿Cómo haría esto con un motor de física? Supongo que esa fue mi pregunta :)