我需要一些关于 OpenGL 中旋转任务的最佳方法的指导。我知道如何使用四元数在 3D 空间中旋转对象,我可以平移它们,一切都很好。
但我想知道将不同对象的集合视为单个实体以进行旋转的最佳方法。例如,假设您有一张桌子,上面放着物品。每个都有自己的平移和旋转,但现在我想旋转整个桌子及其上的所有东西,同时保持房间中的其他物体就位。这意味着桌子外边缘的物体将旋转并绕桌子中心平移,而中心的物体可能只是旋转但保持在原位,或者根本不平移那么多,具体取决于它们与桌面的距离。旋转轴。
似乎一种相当不优雅的方法是单独旋转和平移桌子上的每个物体以及桌子本身,知道旋转轴在哪里。也许这是唯一的好方法,但是是否有一种技术可以为此目的对不同的对象进行“分组”?
您正在寻找的是转换层次结构。桌子上的对象是相对于桌子定位的,换句话说,是在桌子的坐标系中定位的。所以让我们指定M_Desk
作为定义桌子位置及其局部坐标系的变换。接下来让M_Pencilbox
立在桌子上的铅笔盒相对于桌子的变换。铅笔盒中的铅笔将相对于铅笔盒放置。
所以铅笔经历了一系列的转变。请记住,在 OpenGL 使用的列主要符号中,事物通过变换链“流动”,从最后一个变换到第一个变换(或者写下来时从右到左)。
每一次转变,就像M_Desk
例如, 是一个 4×4 矩阵,可以用通常的方式构造:旋转、平移、缩放等。
因此,要变换铅笔的顶点,您需要应用以下变换
… · M_Desk · M_Pencilbox · v_Pencil
当然,桌子本身可能与不同的东西有关,比如房间。该转换链的最开始就是视图转换。我们在这里有效地构建了一个模型视图矩阵。
就现代 OpenGL 而言,每当您遇到转换层次结构中的分支(想想文件系统中的目录)时,您都会创建迄今为止构建的转换链的副本,这样您就不必从头开始对于每个分支。
如果您需要进一步说明,请告诉我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)