Por exemplo, considere este cenário (desculpe minhas horríveis habilidades de desenho):
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?
Respostas:
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.
fonte
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 como
if (!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.
fonte
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.
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.
fonte
When an object touches the portal, it starts potentially colliding with things on the other side
sim, exatamente. Como eu faria isso com um mecanismo de física? Eu acho que foi a minha pergunta :)