3

我想说“不受限制的参考框架”或“空间相关的独立子环境”,但我认为这些都不对。

想象一下,两艘长长的圆柱形宇宙飞船在同一方向的水平面上并排漂浮。每艘船都有自己的房间和走廊,玩家可以在第一人称环境中自由移动。透过窗户看,每艘船的船员都可以微笑着向另一艘船的船员挥手。

第一艘船发射推进器并在第二艘船下方移动。两艘船靠岸,气闸打开。第一艘船的船员现在需要爬上第二艘船。气闸关闭,船只分离。

第一艘船再次移动,只是这次它停靠在第二艘船的顶部。气闸打开,这一次第一艘船的船员需要向下移动到第二艘船。

每艘船都是一个独立的 3d 环境,它与更大的全球环境中的其他独立环境交互。

我看到了两种可能的实现。

1)“推动者”。每艘船都对其内部的每个物体施加力。当第一艘船相对于第二艘船移动时,该运动被转化为船员以改变他们的全球空间位置。这似乎在计算上很昂贵......

2)“骗子”。每艘飞船的窗口都显示来自虚拟全局空间的模拟输出,但飞船及其内容并没有真正相对于彼此移动。船之间的连接是一个动态的门户,它以正确的方向连接两个船“房间”。

该属性的名称是什么?我在哪里可以找到真实 3d 引擎中的示例?

4

3 回答 3

7

许多 3D 引擎通过场景图来处理这个问题。在大多数场景图中,您将拥有每个包含子节点的父“节点”,在这种情况下,每艘船都是一个节点,而船内的人、房间、家具等都是子节点。

孩子的位置是相对于他们的父母指定的。这使得“移动”这艘船变得微不足道,因为你只是移动了这艘船,它的孩子也跟着它移动(就他们而言,不改变他们的位置)。

在您的示例中,向上和向下部分只是在本地向上或向下移动的问题。在某些时候,当您通过气闸时,您会将孩子从一个父母(船)移动到下一个父母(另一艘船),并改变它的位置(即:从船的底部 0,0 ,-20 到 0,0,20 等船 2 的“顶部”)。

OpenSceneGraph 快速入门指南对此概念进行了很好的讨论。


编辑:

作为一个相关的补充,许多面向游戏的 3D 引擎,例如Ogre ,也提供了在其场景图中处理自定义空间分区的方法。例如,开箱即用的 Ogre 允许您在场景中使用 Bsp 和 Octree 分区器,这就是他们如何处理一艘船上的人看不到(更重要的是,甚至不尝试渲染)第二艘船如果有一堵墙等。对于像你的例子这样的事情,如果你想在复杂的场景中保持高帧率,使用空间分区来剔除是至关重要的。

于 2009-06-04T01:11:05.833 回答
3

里德答案的扩展。这是旧的虚幻技术功能列表中的一个片段。

动态场景图技术

动态场景图(DSG)技术是门户技术的自然延伸。动态场景图由一个根节点(对应于玩家的直接环境)和一个子节点的层次树组成。

每个 DSG 节点都有一个坐标系变换、裁剪体积和其他与之相关的渲染状态。Unreal 的渲染引擎在渲染每一帧时即时构建动态场景图。随着观看者的可见性通过门户向外传播,新的场景图节点会生成。场景图节点是许多逼真效果和特殊效果的基本构建块,例如:

  • 镜面。
  • 半反射材料,例如部分反射光的大理石表面。
  • 用于透视传送器的非欧几里得、可重定向的“扭曲”传送门效果。
  • 透过窗户看到一个无限的天空区域,其中构建了天空、行星、山脉和其他物体。
  • 天空和背景具有独立的坐标系,用于独立的平移和旋转。

DSG 渲染的优势在于所有节点效果都是完全可互操作的。例如,一旦定义了镜像 DSG 节点,就会自动递归地支持镜像(对于镜像大厅类型的效果);镜子与天空一起工作;镜子与经线传送门一起使用;经线传送门与天空等一起工作。

Unreal 的动态场景图技术是一个基本构建块,将在该技术的未来版本中进行扩展,以结合诸如在关卡之间看到、在 Internet 上跨多个服务器看到以及折射水等下一代效果。

于 2009-06-04T01:15:37.693 回答
1

我不能告诉你它的确切名称,但我认为使用 openGL 很容易实现 - 当你绘制每艘宇宙飞船时,你会将该宇宙飞船转换到 3d 世界中的正确位置。然后,当您在该船内绘制所有对象时,不要重置您的世界矩阵 - 保持平移不变,所有内容都将相对于船的位置进行绘制。

于 2009-06-04T01:10:29.093 回答