Detecção e resposta de colisão em um sistema de entidades

12

Mais diversão com um ES ...

Atualmente, tenho alguns sistemas:

  • Renderizador (atributo Renderizável, atributo Transformar)
  • Movimento (atributo Movable, atributo Transform, atributo Renderable [para caixas delimitadoras, etc])
  • Entrada (atributo InputReceiver)
  • etc.

Estou adicionando detecção de colisão. Meu primeiro pensamento foi adicionar um novo sistema que realiza colisão. Faz sentido para mim manter isso isolado do Motionsistema, pois nem todas as coisas que se movem ou são animadas necessariamente participam da detecção de colisão - câmeras, neblina etc. -, mas parece que são Collisione Motionsão interdependentes.

Quando Motionmove uma entidade, a transformação precisa ser validada Collisione o movimento cancelado ou ajustado (saltando, parando em uma parede, etc.).

Uma alternativa seria criar um atributo Collidable que mantenha uma referência a um objeto de colisão - kd-tree, octree, etc. compartilhado entre entidades que podem colidir entre si. O Motionsistema verificaria esse atributo e o usaria para verificar ou ajustar o movimento.

De uma perspectiva de código, essa é uma solução aceitável. No entanto, do ponto de vista da arquitetura do ECS, parece que ele está empurrando a lógica para o Motionsistema que não se aplica a todas as entidades que possuem um Movableatributo.

Eu também poderia armazenar um vetor de movimento no Movableatributo e Colliderajustar o sistema Transformconforme necessário, mas isso envolverá a duplicação da funcionalidade entre Motione Collider, ou um retorno de chamada de Colliderpara Motionalguns dados sobre o local da colisão e os dados da superfície para rejeição / reflexão, etc. .

Isso pode se enquadrar no título "caso especial hack", mas eu gostaria de obter algumas informações daqueles que lidaram com isso antes sem criar uma tonelada de código de caso de borda.

A pergunta Qual é uma boa maneira de evitar um acoplamento rígido entre os sistemas de movimento e colisão quando parece que eles exigem conhecimento um do outro?

3Dave
fonte
1
Qual é a pergunta?
jcora
@Bane, o que é um bom lugar para colocar a lógica de detecção de colisões, mantendo o movimento de colisão + o mais separado possível e mantendo as interdependências entre os sistemas no mínimo. Meu post foi um pouco de um passeio ...
3Dave
1
Ótimo, agora coloque isso em sua pergunta, em negrito . :)
jcora

Respostas:

7

Você está pensando demais. No meu mecanismo, que também usa um sistema de componente de entidade, todos GameObjectpodem ter um ponteiro para a ModuleCollision.

O que acontece quando o jogo é atualizado:

  • Cena atualiza todos os objetos que contém. Ele chama a Updatefunção para cada um GameObject.
  • Dentro da Updatefunção, cada um GameObject apenas atualiza sua velocidade e direção, não sua posição.
  • GameObjectcarrega sua posição atual, velocidade e direção para sua ModuleCollision, se houver uma disponível.
  • A cena verifica a colisão com ModuleCollisionbase.
  • Cena chama a UpdatePostfunção em cada um GameObject. Se o objeto tiver um módulo de colisão, ele buscará a posição, velocidade e direção atualizadas do módulo de colisão. A posição é atualizada com a velocidade e direção.
  • Ele GameObjectconstrói uma matriz 3x3 final fora de sua posição e posição.

Sim, há alguma duplicação de estado, mas tudo bem. Fazer o manuseio de colisões a ModuleCollisioné a melhor maneira de fazer isso, porque, caso contrário, você teria que verificar cada um GameObjectpara ver se ele possui um ModuleCollisionidentificador.

knight666
fonte
2
Então, ao invés de se preocupar com a posição de retorno em caso de colisão, você está dividindo a velocidade / aceleração da tradução, alterando as baseadas em colisões detectadas e, em seguida, essas alterações são propagadas em uma segunda atualização especializada no mesmo quadro? Parece bastante limpo. Obrigado.
precisa saber é o seguinte
3

Eu faria assim ...

Tem três sistemas:

  1. Sistema de movimento
  2. Sistema de aceleração
  3. Sistema de colisão

O sistema de movimento aplica velocidades às posições. O sistema de aceleração aplica forças às velocidades. O sistema de colisão detecta colisões e aplica as forças nas direções corretas ou, se você quiser colisões brutas, altera diretamente as velocidades.

Por exemplo, você pode calcular o ângulo entre as colisões usando atan2 e, em seguida, usá-lo para aplicar as forças / velocidades corretas dos corpos.

Faça com que o sistema de detecção de colisão transmita mensagens, se necessário também.

jcora
fonte