3d图形引擎的这个属性的名称和最常见的实现是什么?

时间:2009-06-04 01:03:57

标签: physics 3d

我想说“不受限制的参照系”或“空间相关的独立子环境”,但我不认为这些是正确的。

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

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

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

每艘船都是一个独立的三维环境,它与更大的全球环境中的其他自足环境相互作用。

我看到两种可能的实现。

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

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

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

3 个答案:

答案 0 :(得分:7)

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

儿童的位置是相对于父母的。这使得“移动”船只变得微不足道,因为你只是移动船只,它的孩子随之移动(就他们而言,没有改变他们的位置)。

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

OpenSceneGraph Quick Start Guide对这个概念进行了很好的讨论。


编辑:

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

答案 1 :(得分:3)

延伸里德的答案。这是旧版Unreal Technology Feature list.

的摘录
  

动态场景图技术

     

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

     

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

  • 镜面。
  • 半反射材料,例如部分反射光的大理石表面。
  • 通过传送器观看非欧几里德,可重定向的“扭曲”门户效应。
  • 透过窗户进入一个无限的天空区域,在这个区域内建造了天空,行星,山脉和其他物体。
  • 具有独立坐标系统的独立平移和旋转的天空和背景。
  

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

     

虚幻的动态场景图技术是一个基本构建模块,将在未来的技术版本中进行扩展,以融入下一代效果,例如在各个级别之间查看,在互联网上查看多个服务器以及折射水。

答案 2 :(得分:1)

我无法告诉你它的确切名称,但我认为使用openGL实现起来非常容易 - 当你绘制每个宇宙飞船时,你会将该宇宙飞船转换到3d世界中的正确位置。然后当你绘制该船内的所有物体时,不要重置你的世界矩阵 - 保持平移不变,并且所有东西都将相对于船的位置绘制。