2009-11-04 98 views
4

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

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

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

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

通过计算新顶点来计算应该在视口中绘制事物的位置,而不是通过计算新顶点的位置,我想创建一个OpenGL“相机”来为我做这些,所以我只需要do是将我的Camera对象的坐标传递给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 after movement模式下绘制另一个图像时,将相机向右移动一点。它喜欢可能正常可能是原因,但我认为它还有更多的事情需要我去思考一些非常重要的事情,或者不完全了解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值的问题。尽管改变这些值已经解决了这个问题,但我可能不得不更多地了解这两个函数之间的关系。

回答

4

您需要一个视图矩阵和一个投影矩阵。你可以做的两种方式是一个:

  1. 装入矩阵本身,使用glMatrixMode()glLoadMatrixf(),你用你自己的库来计算矩阵之后。

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

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

+0

感谢您在正确的方向推动。如果您可以查看我的代码和屏幕截图,我在帖子中进行了编辑。有些东西并不完全正确:) – 2009-11-04 12:54:54

+0

实际上,问题确实与我选择的近距离和远距离参数对glFrustum的值以及传递到glTranslated中的Z值有关。谢谢。 – 2009-11-04 13:33:45

2

您可以选择使用矩阵堆栈作为对象层次做到这一点,

但相机是层级里面,所以你必须把堆栈上的逆变换绘制对象和OpenGL仅使用矩阵前从3D到相机。

1

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

Camera从OGL SDK(CodeColony)

也看红书的解释上观看和如何模型视图和投影矩阵将帮助您创建相机。它开始于实际摄像机和与OpenGL API相对应的很好的比较。 Chapter 3 - Viewing