【问题标题】:Placing Camera at different positions in world space将相机放置在世界空间的不同位置
【发布时间】:2014-05-18 09:18:23
【问题描述】:

当相机在世界空间中的两个不同位置时,有没有办法操纵相机的视野?

例如,在第一个位置,多个网格部分在原点(相机所看到的位置)的不同方向上进行变换,直到它们形成一个网格。这是通过在 vbo 中加载顶点之前调用 glm::translate()、glm::rotate() 等来完成的。

在第二个位置,我想变换整个网格(从上方)。由于我已经将所需的所有内容加载到 vbo 中并绘制了模型,因此我无法绘制新的转换网格。有没有办法在不将顶点再次加载到 vbo 的情况下绘制我的新转换网格?

而且,如果我必须再次加载我的 vbo,我该怎么做,因为加载 vbo 取决于网格被分成多少部分。

【问题讨论】:

    标签: opengl 3d camera mesh glm-math


    【解决方案1】:

    将顶点数据加载到 VBO 并对其进行转换与无关 - 像 glm::translate()glm::rotate 这样的东西不会对缓冲区内容产生任何影响 - 唯一的改变是矩阵。只要在您将数据上传到缓冲区时不应用一些转换,就不会对其进行顶点数据处理,其他任何人都不会这样做。通常,这些变换矩阵在绘制对象时使用(由 GPU 上的顶点着色器),因此可以拥有移动的对象和移动的相机,而无需重新指定几何数据。

    因此,在您的情况下,只需更改投影和视图矩阵并使用这些新矩阵再次绘制对象就足够了。

    【讨论】:

    • 关于 vbos 的解释很好,但是我创建了新的投影和视图矩阵,但它仍然不起作用,这就是为什么我认为我需要对 vbos 做一些事情。我所做的是在绘制网格之后,我调用 glm::rotate 和朋友来转换整个事物的值,然后我将投影和视图矩阵的乘法发送到着色器。这是错误的做法吗?
    • 是的,这是错误的。 GL 是一个状态机。仅仅为着色器设置新矩阵是不够的——着色器是通过 draw call 调用的。所以你要先设置好你要绘制的矩阵,然后再重新绘制,这样新设置的矩阵才能有任何效果。 GL 不是场景图 API,它不记得场景中有哪些对象,它只是一个渲染 API,你必须告诉它要渲染什么以及如何渲染。
    • 你是绝对的救星。 :)
    猜你喜欢
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多