如何将多个对象分组以便将它们作为一个单元旋转?

joh*_*ers 5 opengl 3d graphics transformation opengl-es

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

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

似乎这样做的一种相当不优雅的方法是单独旋转和翻译桌面上的每个对象,以及桌子本身,知道旋转轴的位置.也许这是唯一的好方法,但有没有一种技术可以为此目的"分组"不同的对象?

dat*_*olf 3

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

\n\n

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

\n\n

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

\n\n

因此,要变换铅笔的顶点,您需要应用以下变换

\n\n
\xe2\x80\xa6 \xc2\xb7 M_Desk \xc2\xb7 M_Pencilbox \xc2\xb7 v_Pencil\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

如果您需要进一步说明,请告诉我。

\n