Como posso usar várias malhas por entidade sem quebrar um componente de um único tipo por entidade?

11

Estamos apenas mudando de um mecanismo de jogo baseado em hierarquia para um mecanismo de jogo baseado em componentes. Meu problema é que, quando carrego um modelo que possui uma hierarquia de malhas, e da maneira que eu entendo, é que uma entidade em um sistema baseado em componente não pode ter vários componentes do mesmo tipo, mas preciso de um "meshComponent" para cada malha em um modelo. Então, como eu poderia resolver esse problema.

Neste site, eles implementaram um mecanismo de jogo baseado em componentes: http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

Mathias Hölzl
fonte
Eu acho que isso é muito localizado.
jcora
4
Eu acho que é uma pergunta geral. Um objeto de jogo pode ter várias instâncias do mesmo componente?
Mathias Hölzl 16/10/12
Sim, poderia ter sido, se fosse perguntado assim. Para mim, parece que ele estava procurando uma resposta para um problema muito específico.
jcora
4
"... entidade em um sistema baseado em componentes não pode ter vários componentes do mesmo tipo ..." - por que não?
Den
Não acho que seja muito localizado. Por exemplo, no UE3, SkeletalMeshActorpossui apenas um SkeletalMeshComponent. É um problema comum que pode ser tratado de várias maneiras diferentes.
31712 Samurai Hocevar

Respostas:

13

O componente Posição pode ter uma lógica "pai / filho", em que qualquer Entidade com uma Posição pode ter um pai e sua posição é relativa ao pai. Em vez de ter várias malhas na mesma entidade, você pode criar mais de uma entidade, cada uma com sua própria malha e vinculá-las. Você pode até fazer com que as entidades filhas ouçam seus eventos pai (ou qualquer sistema que você tenha para comunicação entre entidades) e reaja de acordo.

Luke B.
fonte
Então, eu tenho uma hierarquia de entidades e essas entidades têm componentes e estão ligadas entre si. É então ainda um componente baseado motor de jogo =)
Mathias Hölzl
@ MathiasHölzl é uma pergunta? Esse tipo de hierarquia não é o mesmo que a hierarquia problemática no POO. Essa é apenas uma hierarquia gráfica; as entidades filhas não herdarão a funcionalidade de seus pais e não causarão problemas; isso geralmente é feito de qualquer maneira (com uma árvore de coisas para renderizar). Você também pode acompanhar a resposta da Asakeron para o seu problema, tendo uma lista de malhas, não vejo como isso é problemático. Talvez eu não entenda sua pergunta?
Luke B.
-1 Não tenho certeza se esse é realmente o caminho a percorrer. Se o que você precisa é de um componente que lide com uma hierarquia de malhas, por que não ter um ModelComponentque contenha uma hierarquia de malhas? Dividir uma entidade apenas para isso parece a solução errada para o problema. Veja as respostas de Asakeron e Byte56.
18712 Laurent Couvidou
@LaurentCouvidou Não vejo por que usar mais de uma Entidade estaria errado, parece uma boa solução para mim. Eu só queria dar uma alternativa diferente a ter uma lista de malhas, apesar de concordar que uma lista de malhas também seria uma boa solução.
Luke B.
@LukeB. Como esse grupo de malhas pode corresponder a uma entidade como um todo, com componentes que dependem disso, por exemplo, IA, som, física ... Ao fazer isso, você acaba com um gráfico de cena e todas as suas peculiaridades.
Laurent Couvidou
8

Seu meshComponent pode conter uma lista de malhas. Não tenho certeza de como você está implementando seu mecanismo, mas um sistema pode facilmente percorrer todas as malhas e simplesmente desenhá-las.

Asakeron
fonte
1
A malha tem também componentes como transformar, física, gráfico ...
Mathias Hölzl
1
Então uma malha é uma entidade? Ou tudo é um componente? Do jeito que eu vejo, transformar, físico e gráfico, devem ser componentes da entidade e não da malha, uma malha é apenas uma descrição dos vértices.
Luke B.
1
Sim, ele deve ser um componente, mas os componentes não podem ter componentes, por isso é difícil implementar a hierarquia do modelo.
Mathias Hölzl 16/10/12
1
Acredito que você deve fornecer mais informações sobre como pretende construir seu mecanismo para obter melhores respostas. Os sistemas de componentes de entidades podem ser implementados de várias maneiras; verifique esta resposta da Kylotan para obter mais informações sobre isso.
Asakeron
4

Eu criaria meu componente de malha com uma lista de objetos de malha. Cada objeto de malha possui os dados da malha junto com um deslocamento. Ao desenhar, o sistema de desenho toma a posição do componente de posição e desenha cada malha no componente de malha na posição + deslocamento.

Você pode ter várias malhas dentro do seu componente de malha, enquanto diz isso com um único componente de malha por entidade.

MichaelHouse
fonte
1

TLDR: Ao fazer o componente consistir em várias malhas, para começar.

Eu concordo com Asakeron / Byte56 / Laurent em que outro nível de indireção é necessário entre os pares de malha / material e a própria entidade. Em vez de ver o GraphicsComponent como vértices e materiais, pense nele como uma gota de pixels na varredura final - como ele chega lá é um detalhe de implementação e nada mais.

Eu pensei muito sobre isso no meu projeto e acho que a solução ideal é tornar o GraphicsComponent um componente de nível muito mais alto, abrangendo grande parte da funcionalidade do objeto tradicional 'Model' - porque essa funcionalidade não é opcional! Para renderizar esses polígonos muito mais do que apenas os dados do buffer e o sombreador, são necessários:

  • Posição que você mencionou
  • Dados de esfola / animação
  • O passe atual (por exemplo, se estiver usando dois passes alfa)
  • Informações de projeção de sombra (se você estiver fazendo isso)
  • Informações sobre como e quando atualizar o material
  • Funcionalidade de descarte

E isso é apenas para recursos 3D, sem considerar sistemas de partículas, outdoors etc. Mas tudo isso é pertinente apenas ao código de gráficos / renderização - não afeta a física, o som ou o script, por isso faz sentido que ele se encaixe o componente Gráficos / Renderização.

Acabei com:

Model : Entity, IHasGraphicsComponent, IHasSkeleton, IHasAnimationStore     //This is the 'game object' - it is passed to the GraphicsController
    ModelComponent : GraphicsComponent                      //This is the actual graphics component, used by the GraphicsController in the context of the game object.
        ModelComponentPart : GraphicsComponent              //This is also a graphics component
            Mesh                                        //These are implementation details
            Material
        ModelComponentPart : GraphicsComponent
            Mesh
            Material
    Skeleton
    Animations

Nisso:

  • Modelo é qualquer ativo do jogo que possui um componente gráfico.

  • O ModelComponent é análogo ao modelo tradicional e, de fato, é para ativos 3D. O controlador GraphicsComponent (se você usar o padrão Model-View-Controller) é responsável por descobrir que tipo de ativo gráfico é e desenhá-lo corretamente (observe que ModelComponent é uma subclasse de GraphicsComponent).

Havia também alguns compromissos meus por questões de simplicidade e compatibilidade com versões anteriores, como cada GraphicsComponent também é uma Entidade, e a Entidade armazena os dados de Posição diretamente para que sejam calculados apenas em um lugar, mas a ideia é a mesma: GraphicsComponent lida com o que é necessário para desenhar o item - tudo o que é necessário - e não apenas o que vem do modelador.

sebf
fonte