Como implementar a detecção de colisão de portais?


12

Por exemplo, considere este cenário (desculpe minhas horríveis habilidades de desenho): imagem

Isso é baseado em "Portal", onde o stickman está passando pelo portal azul (que está vinculado ao portal vermelho), mas há uma parede para ele no portal vermelho. Portanto, ele não pode passar completamente pelo portal.

Portanto, minha pergunta é a seguinte: como faço a detecção de física / colisão com eles? Eu corto o player? Existe uma maneira de vinculá-los? Existe algum mecanismo de física que suporte isso? Se não, como eu faria um?


Tanto quanto eu sei que eles explicar algumas das coisas no comentário desenvolvedor do Portal 1.
Archy


@ Byte56, obrigado, atualizei meu post. Eu acho que isso deve esclarecer-lo mais :)
MiJyn

1
Eu acho que a situação que você descreve é ​​muito incomum no portal (se isso acontecer), pois os portais não são de posicionamento flutuante livre. Eles são colocados em paredes e somente em paredes específicas. Não me lembro de uma situação em que consegui colocar um portal, mas não consegui passar por isso devido a uma obstrução na outra extremidade do portal. Eu imagino que você possa criar uma cópia temporária do player nos dois locais para o período de transição.
Michaelhouse

2
@ Byte56: Você não deve se lembrar muito. Lembro que isso foi feito no Portal 1. Parece que me lembro de uma área de esmagamento em que alguém poderia usar um portal para evitar a morte. Colidir com coisas perto de portais é uma ocorrência comum, e o mecanismo lida com facilidade.
Nicol Bolas

Respostas:


7

O jogo Portal tem uma ótima maneira de resolver esse problema:

O jogador passa pelo portal de origem (azul) e é visto saindo do portal de destino (laranja). O jogador é copiado para o portal de destino e visto entrando nele. O jogo renderiza a imagem que você vê ao olhar através do portal de origem usando uma segunda câmera e renderizar para textura.

No entanto, a cópia do jogador no local de destino não interage com a física. Ele está lá apenas para fins de renderização. Em vez disso, eles criam objetos de colisão virtual do outro lado do portal de origem e, em vez disso, fazem o jogador colidir com ele. Isso mantém a física simples.

Você só precisa desses objetos virtuais até o ponto em que o jogador possa alcançar sem passar completamente pelo portal. Assim que o jogador passa completamente pelo portal, a situação é revertida.

Uma imagem para ilustrar : O portal azul é o portal de origem, o portal laranja o portal de destino. A caixa branca tracejada é o objeto de colisão virtual, enquanto a caixa real é o objeto renderizado. O jogador (com o ponto vermelho) interage apenas com os objetos diretamente ao seu redor. Os objetos no portal laranja são completamente ignorados.

insira a descrição da imagem aqui


4
" usando uma segunda câmera e renderização em textura " Os comentários dos desenvolvedores no Portal 1 explicitamente disseram que não usam renderização em textura, porque isso não funcionava bem para as necessidades deles (especialmente ao ver portais de outros portais ) Em vez disso, eles basicamente transformam uma versão do mundo para o outro lado do portal e apenas são renderizados novamente através dele.
Nicol Bolas

Uau, isso responde quase tudo! Só estou me perguntando, isso funciona pelo portal sendo um buraco com objetos dentro?
MiJyn

6

Aqui está como eu tentaria fazê-lo.

Enquanto você estiver dentro de um portal, haverá duas cópias do jogador no mecanismo de física. Cada cópia ignora todas as colisões que estão no lado oposto do portal e, em seguida, você combina os resultados e aplica os resultados da simulação nos dois modelos.

Idealmente, você aplicaria a gravidade separadamente para cada metade do jogador, mas poderá aplicá-la apenas ao lado do portal em que o centro de massa do jogador está.

Para ignorar essas colisões, você precisa configurar um volume apropriado e testar se há um ponto nele. Um cilindro (possivelmente esticado verticalmente) parece ser uma boa opção. O teste é então algo comoif (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();

Acredito que a maioria dos mecanismos de física possui um sistema para filtrar com o que um objeto pode colidir; portanto, deve ser possível usar um mecanismo de física padrão. Por exemplo, http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering

Para combinar os resultados, a opção mais simples provavelmente seria adicionar algum tipo de restrição inflexível entre os dois e deixar o mecanismo de física lidar com isso.


Hmm, ok, como eu faria isso? Eu entendo a parte de copiar o player, mas além disso, eu não tenho noção. Como eu ignoraria as colisões do lado oposto? Como eu combinaria os resultados?
MiJyn

Eu editei em mais alguns detalhes.
Adam

obrigado, eu vou pensar sobre isso e responder mais tarde uma vez que pode definir esta reta na minha cabeça :)
MiJyn

Muito obrigado, sua resposta e de Virtlink responder a minha pergunta :) Agora, para decidir qual para definir a "resposta correta" para ...
MiJyn

4

Como eu calcularia até que ponto o jogador desce?

Por que você iria querer? Você não precisa calcular até que ponto um jogador "desce"; você descobrirá o quão baixo ele vai à medida que o objeto passa pela simulação.

Como eu conectaria os portais?

Um portal, de uma perspectiva puramente dentro do jogo, é pouco mais que um teleportador elaborado que mexe com a colisão para transformar objetos colidíveis em objetos não colidíveis. Quando um objeto toca o portal, ele começa a colidir com objetos do outro lado. Quando o objeto passa "suficientemente longe" pelo portal, você efetivamente o teleporta para o outro, alterando instantaneamente sua posição e orientação.

A física simplesmente prossegue como normal.


When an object touches the portal, it starts potentially colliding with things on the other sidesim, exatamente. Como eu faria isso com um mecanismo de física? Eu acho que foi a minha pergunta :)
MiJyn

@ MiJyn: Você escreve um mecanismo de física que pode fazer isso. A Valve teve que essencialmente interromper o mecanismo de origem para fazer o Portal realmente funcionar. Nenhum mecanismo de física comercial ou de código aberto pode naturalmente fazer isso. Há uma razão pela qual, apesar da popularidade do Portal, não existem dezenas de clones do Portal no mercado.
Nicol Bolas

interessante, porque existem muitos outros jogos com mecânica muito semelhante (veja até o mod TARDIS para minecraft). Tenho certeza de que deve haver alguma maneira de fazer isso facilmente.
MiJyn
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.