【问题标题】:How to place 3D objects in a scene?如何在场景中放置 3D 对象?
【发布时间】:2017-02-06 13:35:01
【问题描述】:

我正在开发一个简单的渲染引擎作为一个宠物项目。 到目前为止,我能够从 Wavefront .obj 文件中加载几何数据并将它们分别呈现在屏幕上。我知道存储在这些文件中的顶点坐标是在模型空间中定义的,为了将它们正确放置在场景中,我需要将模型到世界的变换矩阵应用于每个顶点位置(我在这里是否正确?)。

但是如何为每个对象定义这些矩阵呢?我是否需要为场景合成开发一个单独的工具,我将在其中移动对象,“工具”将根据平移、旋转等计算适当的模型到世界矩阵?

【问题讨论】:

  • 感谢大家的反对!你能解释一下吗?

标签: opengl 3d rendering


【解决方案1】:

我会研究“场景图”数据结构。它本质上是一棵树,其中节点(可能)定义了它们相对于父节点的转换。这样想吧。您的每个手指都相对于您的手移动。移动您的手、旋转或缩放它也涉及在您的手指上进行相同的转换。

因此,将所有这些相对变换作为相对变换的基础,并结合 trem 来确定模型中每个单独部分的整体变换是有益的。因此,您不只是定义直接模型来查看转换,而是从每个部分到其父部分的转换。

这省去了自己定义一大堆转换的麻烦,在绝大多数情况下,这些转换与我所描述的方式相似。因此,通过以这种方式表示您的模型/场景,您可以为自己节省大量工作。

这些相对变换中的每一个通常都是一个 4x4 仿射变换矩阵。组合这些只是将它们相乘以获得所有它们的组合。

A description of Scene Graphs

为了在场景图中为对象设置动画,您需要指定相对于树中其父对象的变换。例如,汽车的旋转轮需要相对于汽车的底盘旋转。这些转换在很大程度上取决于您要显示的动画类型。

所以我猜你的问题的答案是“大部分是的”。如果事情看起来不错,您确实需要为场景中的每个对象定义转换。但是,将场景组织成树状结构会使这个过程更容易处理。

【讨论】:

  • 感谢您的详细解答。我想最终我将不得不编写一个软件来以一种方便的方式处理这些图表。
  • @ПавелМуратов:您为第一个实现所做的是创建一个场景节点类,其中包含一个转换矩阵和一个子节点列表。然后根据场景的层次结构构建一个场景节点。您保留对一个根节点的引用。每一帧,你首先更新场景图。在这里,您遍历树的每个节点,更改任何必要的转换。请记住,每个转换都代表该特定节点相对于其父节点的转换。例如:在太阳系的情况下,月亮描述了它相对于其行星的移动方式,
  • (续)一颗行星描述了它是如何围绕太阳运行的。计算完变换后,您可以再次遍历整个场景图,并使用您之前为该节点计算的变换矩阵渲染每个对象。
  • 非常感谢,伙计!对于像我这样的新手来说,这是一个很有价值的信息。
【解决方案2】:

关于创建这些矩阵,您必须从创作包中导出场景。 该软件可以与您最初用于建模对象的软件相同,Maya,Lightwave ...... 现在,您的对象彼此独立。

因此,使用您选择的包,您可以找到一种文件格式,让您可以通过将每个网格放置在您想要的位置(如 FBX 或 GLTF)导出场景,或者自己制作。

无论哪种方式,都有一个场景结构,包含模型、变换、灯光、相机,以及您在引擎中想要的一切。

之后,您必须解析该结构。 你会在这里找到一些关于如何构建它的解释: https://nlguillemot.wordpress.com/2016/11/18/opengl-renderer-design/

祝你好运,

【讨论】:

  • 感谢您的反馈!一定会研究您提出的文章。
猜你喜欢
  • 1970-01-01
  • 2019-06-26
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多