Estou tentando criar um jogo 3D simples e preciso restringir o jogador dentro dos limites do mundo do jogo. Quando o jogador atinge os lados do mundo, quero que a nave do jogador ricocheteie um pouco.
Na verdade, estou tentando prender o jogador dentro de uma caixa e impedi-lo de escapar pelos lados ...
Consegui definir os limites do mundo do jogo como uma coleção de aviões, com normais e distâncias da origem. O jogador tem uma esfera delimitadora esférica e, seguindo este site http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php , consegui detectar colisões.
Agora não consigo entender o que fazer quando uma colisão é detectada. O melhor que consigo controlar é o jogador ficar preso no avião, atravessá-lo diretamente ou saltar repetidamente em um ritmo muito rápido.
O senso comum me diz que preciso calcular o ângulo refletido do avião, usando o normal e aplicá-lo à velocidade do jogador, no entanto, acho que preciso primeiro ver se o jogador passou pelo avião, o que não é possível. exercite-se.
fonte
distance = speed * time
geralmente com uma pequena distância extra para evitar erros) e, em seguida, atualizar sua velocidade para qual é o resultado da colisão.F = ma ou a = F / m. Calcule o ponto de colisão entre a esfera e o plano. Geralmente é o centro da esfera - raio normal *. Se você quiser mais precisão, calcule até que ponto a esfera penetrou no plano e ajuste seu cálculo. Isso é amplamente opcional, é claro, a menos que você queira uma física realmente precisa. Agora calcule a velocidade relativa ao longo do normal. Para um plano estático, este é: Vball Dot N. Em seguida, multiplique VballDotN por -1 e multiplique por massa. Na física, nesta fase, você também multiplicaria isso pelo coeficiente de restituição (fator de rejeição). Multiplique esse escalar por N e você terá sua força.
Ao ajustar o Vball, divida a força pela massa novamente e você terá a aceleração final; basta adicionar isso à velocidade e sua velocidade final após a colisão.
Este método é preciso para as fórmulas de resposta a colisões. Se você quiser ainda mais precisão, leve em consideração o atrito, o que fará com que a bola gire, mas não sei se você quer isso no seu jogo. Nesse caso, é assim que você calcula a força tangencial:
Certifique-se de calcular Ft antes de aplicar efeitos lineares, ou o atrito não será preciso.
fonte
vec3 F = -CollisionNormal * (1.0f+Ball.getRestitution())*vDotN;
:?Eu sugeriria calcular primeiro a distância do avião; e então quando a distância <= ao raio realiza a reação de colisão.
Você pode alterar isso para calcular a distância e se a distância for menor que o raio (o que significa que o objeto está sobreposto) muda a posição das bolas e, em seguida, executa a reação de colisão.
fonte