Skip to content

RoySceneNode

我们已经来到了场景组织的骨架部分——RoySceneNode。3D场景往往以树形结构来组织,而RoySceneNode正是树形结构的节点,其主要功能有:

  • 有父节点和子节点列表,用来形成一颗树
  • transform信息(translate、rotation、scale),这里注意的是,引擎采用Y轴向上的右手坐标系,如果和其他软件或者引擎不一致,在导入其他引擎的数字资产时需要做必要的转换。
  • 包围盒,本地包围盒和世界包围盒。
  • 附着组件,即RoyComponent,一个RoySceneNode上面可以挂在任何多个相同以及不同类型的RoyComponent,拥有对RoyComponent增删改查的能力。

需要注意的是,RoySceneNode只是一个树状容器,除了计算坐标系以外并不再具有太多的功能,也就是说RoySceneNode仅仅标记了3D空间中的一个点,额外的功能都是由RoyComponent承担的。

还记得绘制一个自定义立方体中的RoyMeshComponent吗,RoyMeshComponent继承自RoyComponent,代表了一个网格模型,是挂到一个RoySceneNode上的,一旦这个网格模型挂到了RoySceneNode上,那么它就在3D世界空间中有了一个具体的位置,引擎就知道它如何渲染了

由此可见,表达功能的组件并不在RoySceneNode上,而是在RoyComponent的派生类上。除了RoyMeshComponent表达一个网格模型,可以附着到RoySceneNode上以外,还有哪些对象呢?一些常见的对象有:

  • RoyCameraComponent:相机对象,将一个摄像机挂到场景,场景看到的图片就是以这个相机为视角所渲染出来的。
  • RoyLightComponent:灯光对象,挂到场景节点上,在对应的位置上照亮周围的物体。

还记得加载Gltf/Glb模型中的GlbLoadComponent吗,这是一个加载的组件,也被挂接到RoySceneNode上了,其本身是一个逻辑对象,并不需要3D空间中的位置信息,但是也可以作为组件挂接,在遵循RoyComponent必要的属性定义之后就可以这样操作,由此可见,万物皆可附着于RoySceneNode,来增强这个RoySceneNode的能力。

以上被成为以Object-Component的形式来组织引擎数据,RoySceneNode就是那个Object,RoyComponent及其派生类就是Component。这样引擎节点的能力可以无限扩展,衍生无限可能。在自定义插件中,也是期望更多的使用扩展RoyComponent来丰富能力和实现功能。