我正在开发一个简单的渲染引擎作为宠物项目。 到目前为止,我能够从Wavefront .obj文件加载几何数据并分别在屏幕上渲染它们。我知道存储在这些文件中的顶点坐标是在模型空间中定义的,并且正确地将它们放置在场景中我需要将模型到世界的变换矩阵应用到每个顶点位置(我甚至在这里更正?)。
但是如何为每个对象定义这些矩阵?我是否需要为场景合成开发一个单独的工具,我将在其中移动对象,“工具”将根据翻译,旋转等计算适当的模型到世界矩阵?
答案 0 :(得分:2)
关于创建这些矩阵,您需要做的是从创作包中导出场景。 该软件可以与您首先对物体进行建模相同,Maya,Lightwave ...... 现在你的对象彼此独立。
因此,使用您选择的包,或者找到一种文件格式,允许您通过将每个网格定位到您想要的位置来导出您将要创建的场景,如FBX或GLTF,或者自己制作。
无论哪种方式,都有一个场景结构,包含模型,变换,灯光,相机,以及引擎中所需的一切。
之后你必须解析那个结构。 您将在此处找到有关如何构建以下内容的一些解释: https://nlguillemot.wordpress.com/2016/11/18/opengl-renderer-design/
祝你好运,答案 1 :(得分:1)
我会研究“场景图”数据结构。它本质上是一棵树,其中节点(可能)定义它们相对于其父节点的变换。这样想吧。每个手指都相对于手移动。移动您的手,旋转或缩放它也需要在您的手指上进行相同的转换。
因此,将所有这些相对变换作为相对变换相互作用是有益的,并将trhem结合起来确定模型中每个单独部分的整体变换。因此,您不仅要定义直接模型来查看转换,而是定义从每个部分到其父部分的转换。
这节省了必须自己定义一大堆变换,这绝大多数情况下我所描述的方式类似。因此,通过以这种方式表示模型/场景,您可以节省大量的工作。
这些相对变换中的每一个通常是4x4仿射变换矩阵。将这些组合起来只是将它们相乘以获得所有这些组合的问题。
为了在场景图中为对象设置动画,您需要在树中指定相对于其父对象的变换。例如,汽车的纺车需要相对于汽车底盘旋转。这些转换在很大程度上取决于您希望展示的动画类型。
所以我猜你问题的答案是“大部分都是”。如果事情看起来不错,您需要为场景中的每个对象定义转换。但是,将场景变为树形结构会使这个过程更容易处理。