Gar*_*ckW 2 c++ opengl vbo sfml
所以我编写了一个使用顶点缓冲区对象渲染网格的程序,让我可以移动相机.我现在想要使对象独立于相机/视图移动.
但是,我不知道如何通过空间移动我的网格.谷歌搜索倾向于找到消息来源要么告诉我用glRotatef()等旋转对象,要么使用glRotatef()及其兄弟姐妹是一个坏主意,因为它们已被弃用.也许我没有使用正确的搜索词,但我找不到那么多看起来像是一个很好的起点.我看到对矩阵数学的模糊引用,但我不知道如何使用它以及采用什么方法.其他消息来源说我应该应用顶点着色器来转换对象.
我想我可以手动重建我的网格每一帧,但这似乎是一个可怕的想法(网格经常有超过50k三角形,我想至少有几十个),我真的不需要如果它们已经存储在VBO中,那么顶点会在我的内存中不断使用......对吗?
那么我该如何独立于全局空间来操作存储在VBO中的网格呢?我应该学习哪些资源来学习?
Xav*_*olt 10
您应该使用ModelView矩阵将变换应用于顶点.要将转换应用于特定对象/网格而不是整个屏幕,请将ModelView矩阵的副本推送到堆栈,应用转换,绘制对象,然后关闭该矩阵以返回到旧的ModelView矩阵.
无需重新计算顶点位置!这正是这些矩阵旨在帮助您避免的.并且它们存储在VBO中的事实对您来说无关紧要 - 手动传递给OpenGL的顶点处理完全相同.
你可能想看一下这个问题,以及它接受的答案链接到的转换文章 - 如果你仍然有一些变换和矩阵堆栈,它们将是有用的.
希望有所帮助!
编辑:堆栈有用的简单示例.假设你正在画一个简单的场景:一个人在海上的木筏上(带着帆).
首先,您需要设置摄像机角度,以便进行设置所需的任何转换.你不需要 - 事实上也不想 - 在这里推送和弹出矩阵,因为这些转换适用于场景中的所有内容(在OpenGL中,移动相机=移动整个世界.想想的很奇怪,但是你习惯它.).
然后你画你的海洋.无需转换它,因为它是一个静态对象,并且不会移动.
然后你画你的木筏.但你的木筏已经移动了!它沿着X轴漂移.现在,由于筏是一个独立的物体,并且适用于筏的转换不适用于较大的世界,因此将矩阵推入堆栈.这将复制现有的ModelView矩阵.所有这些相机变换都已应用; 你在木筏上的"漂移"转换是你在堆叠较低层进行的转换的补充.
画木筏.然后,在将该矩阵从堆叠中弹出之前,绘制木筏上的东西 - 那个家伙和帆.由于它们随着木筏移动,所有适用于木筏的变形应该应用于它们.
假设你先画出你的被抛弃者.但是他也感动了 - 他正在跳到空中.因此,您将另一个矩阵推入堆栈,应用"跳跃"转换,然后渲染您的人.如果有任何东西应该与这个人一起移动 - 如果他拿着任何东西,比如说 - 你也会在这里画画.但他不是.所以从堆栈中弹出"跳跃"矩阵.
现在你又回到了"筏"的背景中.由于您将"跳跃"转换应用于副本,因此"漂移"转换未被触及堆栈级别.现在划船,它将在筏的顶部,就在它应该的位置.
然后你完成了木筏,所以你也可以从堆栈中弹出那个矩阵.你回到平原相机变换.绘制更多静态几何 - 岛屿或其他东西.
这就是矩阵堆栈有用的原因.这也是人们将更复杂的场景场景构建为"场景图"的原因 - 因此他们可以跟踪转换的嵌套.它在骨骼动画中也很有用,其中手腕的位置取决于肘部的位置,这取决于肩部的位置,等等.
这比我预期的要长 - 但希望有用.干杯!
| 归档时间: |
|
| 查看次数: |
2741 次 |
| 最近记录: |