在OpenGL中设置相机

我一直在研究游戏引擎。 我刚刚开始使用SDL,但使用OpenGL逐渐向3D功能发展。 我所见过的大部分关于“如何完成任务”的文档都使用了GLUT,而我并未使用它。

问题是如何在OpenGL中创建一个“相机”,我可以在3D环境中移动并正确显示3D模型以及精灵(例如,具有固定位置和旋转的精灵)。 我应该关注哪些功能以便在OpenGL相机中设置相机,以及按照什么顺序调用相机?

这里有一些背景资料可以说明为什么我需要一台实际的相机。

为了绘制一个简单的精灵,我从SDL表面创建一个GL纹理,并将其绘制到(SpriteX-CameraX)和(SpriteY-CameraY)的坐标上的屏幕上。 这工作得很好,但是当转向实际的3D模型时,它并不适用。 相机位置是一个自定义向量类(即不使用标准库),包含X,Y,Z整数分量。

我有一个由三角形组成的3D立方体,我可以绘制并旋转它,实际上可以通过在绘制模型并使用该组件时传递相机位置来移动立方体(虽然以一种尴尬的方式)的位置矢量来计算模型的位置。 当我旋转模型时,这种方法会出现问题。 模型的起源不是模型本身,而是似乎是屏幕的起源。 一些谷歌搜索告诉我,我需要保存模型的位置,旋转它的原点,然后将模型恢复到原始位置。

我想通过计算新的顶点来传递相机的位置并计算视图中应该绘制的东西的位置,而不是通过计算新的顶点来创建OpenGL“相机”,所以我需要做的就是传入我的相机对象的坐标到OpenGL相机,它会自动翻译视图。 如果你使用GLUT,这个任务似乎非常简单,但我不确定如何使用OpenGL设置摄像头。

编辑#1(在一些评论之后):按照一些建议,这是在我的程序中被调用的更新方法。 它已更新以创建透视图和视图矩阵。 所有绘图都在调用之前发生。 当OpenGL执行时,会执行一组类似的方法(减去缓冲区交换)。 x,y,z坐标是相机及其位置矢量的直线。 如果摄像机处于(256,32,0),则256,32和0会传入Update方法。 目前,z被设置为0,因为目前没有办法改变该值。 所绘制的3D模型是位置X = 320,Y = 240,Z = -128处的一组顶点/三角形+法线。 当程序运行时,这是在FILL模式下绘制的,然后在LINE模式下绘制,另一个在移动后在FILL中绘制,当我将相机向右移动一点时。 它喜欢可能正常可能是原因,但我认为它还有更多的事情需要我去思考一些非常重要的事情,或者不完全了解glFrustum的NEAR和FAR参数实际上做了什么。

在我实施这些更改之前,我正在使用glOrtho并正确渲染了多维数据集。 现在,如果我切换回glOrtho,一张脸会呈现(绿色),旋转非常奇怪 - 可能是由于翻译。 立方体有6种不同的颜色,每边各一个。 红色,蓝色,绿色,青色,白色和紫色。

int VideoWindow::Update(double x, double y, double z)
{
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();

    glFrustum(0.0f, GetWidth(), GetHeight(), 0.0f, 32.0f, 192.0f);


    glMatrixMode( GL_MODELVIEW );

    SDL_GL_SwapBuffers();  
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glRotatef(0, 1.0f, 0.0f, 0.0f);
    glRotatef(0, 0.0f, 1.0f, 0.0f);
    glRotatef(0, 0.0f, 0.0f, 1.0f);
    glTranslated(-x, -y, 0);

    return 0;
}

编辑最终:问题原来是glFrustum的近论和远论以及glTranslated的Z值的问题。 虽然改变这些值已经解决了这个问题,但我可能不得不更多地了解这两个函数之间的关系。


你需要一个视图矩阵和一个投影矩阵。 你可以通过以下两种方式之一来完成:

  • 在使用自己的库计算矩阵后,使用glMatrixMode()glLoadMatrixf()自己加载矩阵。

  • 使用glMatrixMode(GL_MODELVIEW)glTranslate() / glRotate()的组合创建视图矩阵,使用glMatrixMode(GL_PROJECTION)glFrustum()创建投影矩阵。 请记住 - 您的视角矩阵是您的相机位置的负向平移(因为它是您应该将世界相对于相机原点移动的位置)以及所应用的任何旋转(俯仰/偏转)。

  • 希望这有助于,如果我有更多的时间,我会给你写一个适当的例子!


    您必须使用矩阵堆栈来实现对象层次结构,

    但相机位于层次结构内部,因此在绘制对象之前必须将反变换放到堆栈上,因为openGL仅使用3D到相机的矩阵。


    如果你还没有检查过,那么可能会看看下面的项目,将详细解释“tsalter”在他的帖子中写到的内容。

    来自OGL SDK(CodeColony)的相机

    另请参阅红皮书,了解有关观看的解释以及模型视图和投影矩阵如何帮助您创建相机。 它开始于实际摄像机和与OpenGL API相对应的很好的比较。 第3章 - 查看

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

    上一篇: Setting up a camera in OpenGL

    下一篇: Stack Overflow