OpenGL - 对象转换和VBO

时间:2012-03-12 19:43:07

标签: c++ opengl sfml vbo

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

然而,我不知道如何通过太空移动我的网格。谷歌搜索倾向于找到消息来源要么告诉我用glRotatef()等旋转对象,要么使用glRotatef()及其兄弟姐妹是一个坏主意,因为它们已被弃用。也许我没有使用正确的搜索词,但我找不到那么多看起来像是一个很好的起点。我看到对矩阵数学的模糊引用,但我不知道如何使用它以及采用什么方法。其他消息来源说我应该应用顶点着色器来转换对象。

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

那么我该如何独立于全局空间来操作存储在VBO中的网格呢?在学习的过程中我应该使用哪些资源?

1 个答案:

答案 0 :(得分:10)

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

无需重新计算您的顶点位置!这正是这些矩阵旨在帮助您避免的。而且它们存储在VBO中的事实对你来说无关紧要 - 手动传递给OpenGL的顶点处理完全相同。

你可能想查看this question,并将其transformation article接受的答案链接到 - 如果你仍然有一些转换和矩阵堆栈,它们将非常有用。 / p>

希望有所帮助!

编辑:堆栈有用的简单示例。假设你正在画一个简单的场景:一个人在海上的木筏上(带着帆)。

首先,您需要设置摄像机角度,因此请进行设置所需的任何转换。你不需要 - 实际上不需要想要 - 在这里推送和弹出矩阵,因为这些转换适用于场景中的所有内容(在OpenGL中,移动相机=移动整​​个世界。很奇怪,但你已经习惯了。)。

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

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

画出木筏。然后,之前你将那个矩阵从堆栈中弹出,画出木筏上的东西 - 那个家伙和帆。由于它们随着木筏一起移动,所有适用于木筏的变形应该应用于它们。来自。

说你先画出你的被抛弃者。但是他也感动了 - 他正在跳到空中。因此,您将另一个矩阵推入堆栈,应用“跳跃”转换,然后渲染您的人。如果有任何东西应该与这个人一起移动 - 如果他拿着任何东西,比如说 - 你也会在这里画画。但他不是。所以从堆栈中弹出“跳跃”矩阵。

现在你又回到了“筏”背景中。由于您将“跳跃”转换应用于副本,因此“漂移”转换未被触及堆栈级别。现在划船,它将在木筏的顶部,就在它应该的位置。

然后你完成了木筏,所以你也可以从堆栈中弹出那个矩阵。你回到平原相机变换。绘制更多静态几何 - 岛屿或其他东西。

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

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