我需要帮助与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;
}
最后三个是视角?
是错误的。最后一个参数定义了相机"直立"的方向。想象一下,你把一根棍子放在相机上面。上面的棍子就是向上的向量
很抱歉地告诉你,但是:你做这一切的方式是非常错误的。
首先你没有适当的事件处理循环。你需要在某处调用SDL_WaitEvent
或SDL_PollEvent
。此外,对于某些动画,在程序的主循环中使用for 0...300
循环是完全没有意义的。
然后你的gluLookAt将创建一个视图转换,它将在渲染的三角形上使look边缘。
没有办法修复代码。我建议从头开始,并接受适当的指导。