如何在不破坏每个实体单一类型的一个组件的情况下,为每个实体使用多个网格?


11

我们只是从基于层次的游戏引擎切换到基于组件的游戏引擎。我的问题是,当我加载具有网格层次结构的模型时,我的理解是,基于组件的系统中的实体不能具有相同类型的多个组件,但是每个组件都需要一个“ meshComponent”在模型中进行网格划分。那么我该如何解决这个问题。

他们在此站点上实现了基于组件的游戏引擎:http : //cowboyprogramming.com/2007/01/05/evolve-your-heirachy/


我认为这太本地化了。
jcora 2012年

4
我认为这是一个普遍的问题。游戏对象可以具有同一组件的多个实例吗?
MathiasHölzl2012年

是的,它可能已经过,如果有人问这样的。在我看来,他似乎正在寻找一个非常具体的问题的答案。
jcora 2012年

4
“ ...基于组件的系统中的实体不能具有相同类型的多个组件...”-为什么不呢?
2012年

我不认为它太本地化了。例如在UE3中,SkeletalMeshActor只有一个SkeletalMeshComponent。这是一个常见问题,可以通过许多不同方式解决。
sam hocevar

Answers:


13

您的Position组件可能具有“父/子”逻辑,其中任何具有Position的实体都可以具有父级,并且其位置是相对于其父级的。您可以在一个实体上创建多个实体,而不是在一个实体上具有多个网格,每个实体都有自己的网格并将它们链接在一起。您甚至可以使子实体听其父事件(或实体之间进行通信的任何系统)并做出相应的反应。


因此,我具有实体的层次结构,这些实体具有组成部分并链接到gheter。那它是否仍然是一个基于组件的游戏引擎=)
MathiasHölzl2012年

@MathiasHölzl是一个问题吗?这种层次结构与OOP中有问题的层次结构不同。这只是一个图形层次结构,子实体不会从其父级那里继承功能,而给您带来麻烦,通常还是要这样做(要渲染一棵树)。您也可以使用Asakeron回答您的问题,并列出网格,我认为这没有问题。也许我不明白你的问题?
路加B.

-1不确定这是否是正确的方法。如果您需要的是一个处理网格层次结构的组件,那么为什么不ModelComponent包含一个包含网格层次结构的组件呢?仅为此拆分实体听起来像是对问题的错误解决方案。请参阅Asakeron和Byte56的答案。
Laurent Couvidou 2012年

@LaurentCouvidou我不明白为什么使用多个实体是错误的,对于我来说这似乎是一个很好的解决方案。我只是想给网格列表以外的其他选择,尽管我同意网格列表也将是一个很好的解决方案。
路加B.

@LukeB。因为这组网格可以整体上对应于一个实体,其组件依赖于此,例如AI,声音,物理...因此,您最终得到了一个场景图及其所有怪癖。
劳伦·库维杜

8

您的meshComponent可能包含一个网格列表。我不确定您如何实现引擎,但是系统可以轻松地迭代所有网格并简单地绘制它们。


1
网格还具有变换,物理,图形等组成部分
MathiasHölzl2012年

1
那么网格是一个实体吗?还是一切都是一个组成部分?我的观察方式,变换,物理和图​​形应该是实体中的组件,而不是网格中的对象,网格只是顶点的描述。
路加B.

1
是的,它应该是一个组件,但是组件不能具有组件,因此很难实现模型的层次结构。
MathiasHölzl2012年

1
我相信您应该提供有关打算如何构建引擎的更多信息,以便获得更好的答案。实体组件系统可以通过多种方式实现,有关更多信息,请查看Kylotan的答案
Asakeron,2012年

4

我将使用网格对象列表创建网格组件。每个网格对象都具有网格数据以及偏移量。绘制时,绘制系统从位置组件获取位置,然后在位置+偏移处绘制网格组件中的每个网格。

您可以在网格组件内部拥有多个网格,同时仍然要对每个实体使用单个网格组件。


1

TLDR:首先使组件包含多个网格。

我同意Asakeron / Byte56 / Laurent的观点,即在网格/材质对与实体本身之间还需要另一个间接层次。与其将GraphicsComponent视为顶点和材质,不如将其视为最终栅格上的像素斑点-它/它们如何到达那里是实现细节,仅此而已。

我为我的项目考虑了很多,我认为最佳的解决方案是使GraphicsComponent成为更高级别的组件,包含传统的“模型”对象的许多功能-因为此功能不是可选的!要渲染这些多边形,不仅需要缓冲区数据和着色器,例如:

  • 您提到的位置
  • 蒙皮/动画数据
  • 当前通行证(例如,如果使用两个通行证alpha)
  • 阴影投射信息(如果正在执行)
  • 有关如何的信息以及何时更新资料的信息
  • 剔除功能

而且这仅用于3D资产,而没有考虑粒子系统,广告牌等。但是所有这些都仅与图形/渲染代码相关-它不影响物理,声音或脚本,因此应该将其放置在其中图形/渲染组件。

我最终得到了:

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

在此:

  • 模型是具有图形组件的任何游戏资产。

  • ModelComponent与传统的Model类似,实际上是针对3D资产的。GraphicsComponent控制器(如果使用Model-View-Controller模式)负责确定图形资产的类型并正确绘制(注意ModelComponent是GraphicsComponent的子类)。

为了简化和向后兼容,在我的系统中也有一些折衷,例如每个GraphicsComponent也是一个Entity,并且Entity直接存储Position数据,因此仅在一个位置计算它,但是想法是相同的:GraphicsComponent处理什么是绘制项目所需的-所有所需的内容-不仅限于建模者提供的内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.