¿Cómo implementar la detección de colisión de portales?


12

Por ejemplo, tome este escenario (disculpe mis horribles habilidades de dibujo): imagen

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?


Hasta donde yo sé, explican algunas de las cosas en el comentario del desarrollador de Portal 1.
Archy


@ Byte56, gracias, actualicé mi publicación. Creo que esto debería aclararlo más :)
MiJyn

1
Creo que la situación que describe es muy poco común en el portal (si alguna vez sucede) ya que los portales no son de colocación libre flotante. Se colocan en paredes y solo en paredes específicas. No recuerdo una situación en la que pude colocar un portal, pero no pude atravesarlo debido a una obstrucción en el otro extremo del portal. Me imagino que podría crear una copia temporal del reproductor en ambas ubicaciones para el período de transición.
MichaelHouse

2
@ Byte56: No debes recordar mucho. Recuerdo que esto se hizo en el Portal 1. Parece que recuerdo un área aplastante donde uno podría usar un portal para evitar morir. Chocar con cosas cerca de los portales es algo común, y el motor lo maneja fácilmente.
Nicol Bolas

Respuestas:


7

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.

ingrese la descripción de la imagen aquí


44
" usando una segunda cámara y renderizado a textura " Los comentarios de los desarrolladores en el Portal 1 dijeron explícitamente que no usan renderizado a textura, porque eso no funcionó bien para sus necesidades (especialmente al ver portales de otros portales) ) En cambio, básicamente transforman una versión del mundo al otro lado del portal y simplemente lo vuelven a renderizar a través de él.
Nicol Bolas

¡Guau, esto responde casi todo! Me pregunto, ¿funciona si el portal es un agujero con objetos dentro?
MiJyn

6

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í comoif (!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.


Hmm, está bien, ¿cómo haría esto? Tengo la parte de copiar el reproductor, pero aparte de eso, no tengo ni idea. ¿Cómo ignoraría las colisiones desde el lado opuesto? ¿Cómo combinaría los resultados?
MiJyn

He editado algunos detalles más.
Adam

gracias, pensaré en esto y responderé más tarde una vez que pueda aclarar esto en mi cabeza :)
MiJyn

Muchas gracias, su respuesta y la de Virtlink responden a mi pregunta :) Ahora para decidir cuál establecer la "respuesta correcta" para ...
MiJyn

4

¿Cómo calcularía qué tan lejos cae el jugador?

¿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.

¿Cómo conectaría los portales?

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.


When an object touches the portal, it starts potentially colliding with things on the other sidesí exactamente. ¿Cómo haría esto con un motor de física? Supongo que esa fue mi pregunta :)
MiJyn

@MiJyn: Escribes un motor de física que puede hacer eso. Valve tuvo que romper esencialmente el motor de Source para que Portal realmente funcionara. Ningún motor de física comercial o de código abierto puede hacer eso naturalmente. Hay una razón por la cual, a pesar de la popularidad de Portal, no hay decenas de clones de Portal en el mercado.
Nicol Bolas

interesante, porque hay muchos otros juegos que tienen una mecánica muy similar (ver incluso el mod TARDIS para Minecraft). Estoy seguro de que debe haber alguna forma de hacerlo fácilmente.
MiJyn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.