如何组为他们旋转作为一个单元的目的的多个对象?(How to group multiple obje

2019-08-17 21:02发布

我需要对在OpenGL旋转任务的最佳方法一些指点。 我知道如何使用四元数,我可以翻译它们,一切都很好旋转在三维空间的物体。

但我想知道对待不同对象的集合作为旋转的目的,在单个实体的最佳途径。 例如,假设你有与它的对象书桌。 每个人都有自己的平移和旋转,但现在我想旋转就可以了整个办公桌和一切,而在地方保持在房间里的其他对象。 这意味着在书桌上的外边缘对象将旋转并翻译围绕桌子的中央,而在中心对象可能只需旋转否则留在原地,或者根本就没有之多,翻译取决于从他们的距离旋转轴线。

如此看来,相当不雅的方式做,这是单独旋转和平移办公桌上的每个对象,以及书桌本身,知道在哪里的旋转轴。 也许,这就是做唯一的好办法,但有一种技术,“组”不同的对象为这个目的是什么?

Answer 1:

什么你要找的是改造hierachies。 你的办公桌上的对象相对桌,或者换句话说桌子的坐标系中的定位。 因此,让指定M_Desk作为转换定义的办公桌它的局部坐标系中的位置和。 接下来,让我们成为M_Pencilbox铅笔盒站在桌子上相对于台的改造。 而在铅笔盒铅笔将被放置在相对于铅笔盒。

所以铅笔经过转换的层次结构。 请记住,在通过变换链从上次的变换使用OpenGL的东西“流”到第一(或从右到左的时候写下来)列主要符号。

每个变换,像M_Desk例如,是可以构成通常的方式的4×4矩阵:旋转,平移,缩放等

因此,要改变铅笔的顶点,你会采用以下改造

… · M_Desk · M_Pencilbox · v_Pencil

当然,书桌本身可能是相对于不同的东西,就像一个房间。 在这种转变链的最开始就认为转型。 因此,有效地我们在这里建立一个模型视图矩阵。

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

让我知道如果你需要进一步clearification。



Answer 2:

这通常是通过使用某种场景图的其结合了变换分层实现。

一个简单的最低版本将有一棵树,其中每个节点包含一个对象,变换,和子节点的列表。 所述变换是相对于父节点。

所以在桌子上的物体将是桌子本身的儿童。

变换对于任何给定的对象是对象的级联,其所有的父母在树变换。 有许多方法来实现这一点,但“老派” GL功能,为此提供了一个矩阵堆栈。 您可以在本地矩阵乘法的节点,得出该节点的几何形状,递归绘制所有的子节点,然后在弹出的矩阵后退。



文章来源: How to group multiple objects for purpose of rotating them as a unit?