如何在场景中放置 3D 对象?

How to place 3D objects in a scene?

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

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

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

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

这样就不必自己定义一大堆转换,在绝大多数情况下,这些转换都与我描述的方式类似。因此,通过以这种方式表示您的 models/scene,您可以节省很多工作。

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

A description of Scene Graphs

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

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

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

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

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

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

祝你好运,