使用gluLookat()的OpenGL

时间:2011-12-17 02:54:57

标签: opengl glu glulookat

我需要帮助gluLookAt()。我打算在调用glOrtho()之后尝试使用它(我相信这是正确的),试图从y轴上略微抬高的视图向下看z轴。根据我对gluLookAt()的理解,前三个参数是视图来自或“眼睛”,接下来的三个是眼睛看的地方,最后三个是视角?

我尝试了很多不同的设置,无法在屏幕上呈现任何内容,所有尝试都会导致黑屏空白。 我在网上搜索了它的使用实践的全部例子,除了功能的解释之外找不到任何东西(我认为我理解但无法开始工作)。

我不打算发布我尝试过的任何代码,因为我尝试了太多不同的方法,现在我总是留下一堆乱七八糟的代码,坦白说我不想要让任何人眼睛流血。

我的问题是,任何人都可以更好地发布或描述一个使用gluLookAt()工作的小程序的例子

这是我目前的糟糕代码(仅用于测试):

#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
#include <GL/glu.h>
#include <windows.h>

void init_ortho(int width, int height)

{

SDL_Init(SDL_INIT_EVERYTHING);
SDL_SetVideoMode(width,height,32,SDL_OPENGL);
SDL_WM_SetCaption( "OpenGL Test", NULL );

glClearColor( 0, 0, 0, 0 );
glViewport(0, 0, 640, 480);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0, width , height , 0, 0, 20 );
glMatrixMode( GL_MODELVIEW );
gluLookAt(0,0,0, 300,300, 5, 0,1,0);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);

}

int Check(int keystroke, int x)

{

if (keystroke == 65)
x += 10;

return x;

}

int main(int argc, char **argv)
{
init_ortho(640, 480);

glLoadIdentity();

int x = 300;
bool quit = false;

while (quit == false)

{

for (int i = 0; i < 300; i++)
{



if (GetAsyncKeyState(i) == -32767)
{

    x = Check(i, x);
if (x > 400)
quit = true;
    glTranslatef(x,300,10);
glColor4f(1.0,1.0,1.0,1.0);

glBegin(GL_QUADS);
glVertex3f(0,  0,0);
glVertex3f(100, 0,0);
glVertex3f(100,100,0);
glVertex3f(0, 100,0);
glEnd();

glLoadIdentity();

SDL_GL_SwapBuffers();

glClear( GL_COLOR_BUFFER_BIT );

}
}

}



SDL_Quit();

return 0;
}

1 个答案:

答案 0 :(得分:0)

  

最后三个是视角?

错误。最后的参数定义了摄像机“直立”的方向。想象一下你把一根棍子放在它上面的相机。坚持它的是向上传播。


很抱歉告诉你这个,但是:你做这一切的方式是非常错误的。

首先,您没有propper事件处理循环。您需要在某个地方拨打SDL_WaitEventSDL_PollEvent。对于某些动画,在程序主循环中有一个for 0...300循环也没有意义。

然后你的gluLookAt将创建一个视图变换,使渲染三角形看起来很边缘。

无法修复代码。我说从头开始,并采取适当的教程。