对象转换和维也纳组织

所以我写了一个使用顶点缓冲区对象渲染网格的程序,并让我移动相机。 我现在想让对象独立于摄像机/视图而移动。

但是,我不知道如何去移动我的网格在太空中。 谷歌搜索往往会发现消息来源要么告诉我用glRotatef()等旋转对象,要么使用glRotatef()及其兄弟是一个坏主意,因为它们已被弃用。 也许我没有使用正确的搜索条件,但我没有找到那么多,这似乎是一个很好的起点。 我看到矩阵数学的模糊引用,但我不知道如何使用它以及采取什么方法。 其他消息来源说,我应该应用顶点着色器来转换对象。

我想我可以手动重建每一帧的网格,但这似乎是一个可怕的想法(网格经常有超过5万个三角形,我想至少有几十个),而且我并不需要如果他们已经存储在VBO中,那么我的内存中的顶点会一直在使用......对吗?

那么,我该如何操纵独立于全球空间而存储在VBO中的网格呢? 我应该使用什么资源来学习这样做?


您应该使用您的ModelView矩阵将变换应用于顶点。 要将转换应用于特定对象/网格而不是整个屏幕,请将ModelView矩阵的副本压入堆栈,应用转换,绘制对象,然后弹出该矩阵以返回到旧的ModelView矩阵。

无需重新计算顶点位置! 这正是这些矩阵旨在帮助您避免的原因。 事实上,它们存储在VBO中并不重要 - 手动传递给OpenGL的顶点将完全相同。

你可能想看看这个问题,以及它接受的答案链接到的转换文章 ​​- 如果你仍然得到一堆转换和矩阵堆栈,它们将非常有用。

希望有所帮助!

编辑:为什么堆栈有用的一个简单例子。 假设你正在绘制一个简单的场景:一个在海上的木筏(帆)。

首先,你需要设置摄像机角度,所以你需要做任何你需要的转换来设置它。 您并不需要 - 实际上也不想 - 在这里推送和弹出矩阵,因为这些转换适用于场景中的所有内容(在OpenGL中,移动摄像头=移动整个世界。奇怪的是想想,但是你习惯它。)。

然后你画你的海洋。 不需要转换,因为它是一个静态对象,不会移动。

然后你画你的木筏。 但是你的木筏已经移动了! 它沿着X轴漂移。 现在,由于木筏是一个独立的物体,适用于木筏的转换不适用于更大的世界,因此可以将矩阵推入堆栈。 这会复制现有的ModelView矩阵。 所有这些相机转换已经应用; 你在木筏上的“漂移”转变除了你在较低层次上进行的转换之外。

画筏。 然后,在将该矩阵从堆栈中弹出之前,先画出筏上的东西 - 人和帆。 由于他们随着木筏移动,所有适用于木筏的转换应该适用于他们。

假设你先画出你的被抛弃物。 但他也感动 - 他跳到空中。 所以你把另一个矩阵推到栈上,应用一个“跳跃”转换,然后渲染你的人。 如果有什么东西要跟这个人一起移动 - 如果他拿着任何东西,说 - 你也会在这里画。 但他不是。 因此,从堆栈中弹出“跳跃”矩阵。

现在你回到了“木筏”的背景下。 由于您将“跳跃”转换应用于副本,因此“漂移”转换不会受到堆栈级别的影响。 现在画出帆,它会在木筏的顶部,就在它应该在的地方。

然后你就完成了木筏,所以你可以把这个矩阵从堆栈中弹出来。 你已经回到了简单的相机转换。 画更多的静态几何 - 岛屿或其他东西。

这就是为什么矩阵堆栈很有用。 这也是为什么人们将更复杂的场景场景构建为“场景图” - 以便他们可以跟踪变换的嵌套。 它在骨骼动画中也很有用,手腕的位置取决于肘部的位置,这取决于肩部的位置,等等。

这比我预想的要长 - 但希望有用。 干杯!

链接地址: http://www.djcxy.com/p/81747.html

上一篇: Object Transformations and VBOs

下一篇: Ray picking with gluUnProject()