5

我需要一些关于 OpenGL 中旋转任务的最佳方法的指示。我知道如何使用四元数在 3D 空间中旋转对象,我可以翻译它们,一切都很好。

但我想知道将不同对象的集合视为单个实体以进行旋转的最佳方法。例如,假设您有一张桌子,上面有物品。每个都有自己的平移和旋转,但现在我想旋转整个桌子和上面的所有东西,同时让房间里的其他物体保持原位。这意味着桌子外边缘的物体会旋转并围绕桌子的中心平移,而中心的物体可能会旋转但不会保持原位,或者根本不会平移太多,这取决于它们与桌面的距离。旋转轴。

似乎一个相当不雅的方法是单独旋转和平移桌子上的每个对象,以及桌子本身,知道旋转轴在哪里。也许这是唯一的好方法,但有没有一种技术可以为此目的“组合”不同的对象?

4

2 回答 2

3

您正在寻找的是转换层次结构。桌面上的对象是相对于桌面定位的,或者换句话说是在桌面的坐标系中。因此,让我们指定M_Desk为定义桌子位置及其局部坐标系的变换。接下来让我们来看看M_Pencilbox站在桌子上的铅笔盒相对于桌子的变换。并且铅笔盒中的铅笔将相对于铅笔盒放置。

所以铅笔经历了一系列的转变。请记住,在 OpenGL 使用的列主要符号中,事物“流动”通过从最后一个转换到第一个(或写下来时从右到左)的转换链。

例如,每个变换M_Desk都是一个 4×4 矩阵,可以按通常的方式构造:旋转、平移、缩放等。

因此,要转换铅笔的顶点,您将应用以下转换

… · M_Desk · M_Pencilbox · v_Pencil

当然,桌子本身可能与不同的东西有关,比如房间。在该转换链的最开始将是视图转换。因此,我们在这里有效地构建了一个模型视图矩阵。

就现代 OpenGL 而言,每次遇到转换层次结构中的分支(想想文件系统中的目录)时,您都会创建迄今为止构建的转换链的副本,这样您就不必从头开始对于每个分支。

如果您需要进一步澄清,请告诉我。

于 2013-03-22T09:23:31.817 回答
3

这通常是通过使用某种包含变换层次结构的场景图来完成的。

一个简单的最小版本是有一个树,其中每个节点都包含一个对象、一个变换和一个子节点列表。变换是相对于父节点的。

所以桌子上的对象将是桌子本身的孩子。

任何给定对象的变换是该对象的变换与其在树中的所有父对象的串联。有很多方法可以做到这一点,但“老派”的 GL 功能为此提供了一个矩阵堆栈。您在一个节点的局部矩阵中相乘,为该节点绘制几何图形,递归地绘制所有子节点,然后将矩阵弹出。

于 2013-03-22T09:23:48.043 回答