我需要对在OpenGL旋转任务的最佳方法一些指点。 我知道如何使用四元数,我可以翻译它们,一切都很好旋转在三维空间的物体。
但我想知道对待不同对象的集合作为旋转的目的,在单个实体的最佳途径。 例如,假设你有与它的对象书桌。 每个人都有自己的平移和旋转,但现在我想旋转就可以了整个办公桌和一切,而在地方保持在房间里的其他对象。 这意味着在书桌上的外边缘对象将旋转并翻译围绕桌子的中央,而在中心对象可能只需旋转否则留在原地,或者根本就没有之多,翻译取决于从他们的距离旋转轴线。
如此看来,相当不雅的方式做,这是单独旋转和平移办公桌上的每个对象,以及书桌本身,知道在哪里的旋转轴。 也许,这就是做唯一的好办法,但有一种技术,“组”不同的对象为这个目的是什么?
什么你要找的是改造hierachies。 你的办公桌上的对象相对桌,或者换句话说桌子的坐标系中的定位。 因此,让指定M_Desk
作为转换定义的办公桌它的局部坐标系中的位置和。 接下来,让我们成为M_Pencilbox
铅笔盒站在桌子上相对于台的改造。 而在铅笔盒铅笔将被放置在相对于铅笔盒。
所以铅笔经过转换的层次结构。 请记住,在通过变换链从上次的变换使用OpenGL的东西“流”到第一(或从右到左的时候写下来)列主要符号。
每个变换,像M_Desk
例如,是可以构成通常的方式的4×4矩阵:旋转,平移,缩放等
因此,要改变铅笔的顶点,你会采用以下改造
… · M_Desk · M_Pencilbox · v_Pencil
当然,书桌本身可能是相对于不同的东西,就像一个房间。 在这种转变链的最开始就认为转型。 因此,有效地我们在这里建立一个模型视图矩阵。
在现代的OpenGL而言,每次你遇到的转型层次结构的分支(文件系统将目录的),你会创建迄今为止建造的变换链的副本,这样你就不必从头开始重新启动每个分支。
让我知道如果你需要进一步clearification。
这通常是通过使用某种场景图的其结合了变换分层实现。
一个简单的最低版本将有一棵树,其中每个节点包含一个对象,变换,和子节点的列表。 所述变换是相对于父节点。
所以在桌子上的物体将是桌子本身的儿童。
变换对于任何给定的对象是对象的级联,其所有的父母在树变换。 有许多方法来实现这一点,但“老派” GL功能,为此提供了一个矩阵堆栈。 您可以在本地矩阵乘法的节点,得出该节点的几何形状,递归绘制所有的子节点,然后在弹出的矩阵后退。