gluLookAt() не смотрит куда надо

Я не понимаю, что именно делает функция glLookAt().

У меня есть объект в положении x,y,z . Я хочу поместить камеру в положение x+20,y+20,z+20, когда объект движется, чтобы он выглядел как неподвижный. Однако это не тот случай: когда я делаю следующий код, я вижу крест, который медленно движется вправо и даже выходит из окна!

while (keystate[SDLK_ESCAPE] == false) {

SDL_PollEvent(&event);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

n+=0.1;
float x = 10;
float y = 10+n*n;
float z = 10;

// drawing an object at x,y,z (here a cross)
glBegin(GL_LINES);
glColor3ub(200,0,0);
glVertex3f(x-2,y,z);
glVertex3f(x+2,y,z);
glVertex3f(x,y-2,z);
glVertex3f(x,y+2,z);
glEnd();

// looking at the object
glMatrixMode( GL_MODELVIEW );
glLoadIdentity( );
gluLookAt(x+20,y+20,z+20,x,y,z,0,0,1);

glFlush();
SDL_GL_SwapBuffers();

}

Если камера правильно смотрела на x,y,z, крест всегда должен появляться в центре?

Если я укажу y = 10 + n, объект выглядит неподвижно. При y = 10 + n * n объект движется с постоянной скоростью, а при y = 10 + n * n * n объект движется и ускоряется.

Я тоже сделал

gluPerspective(70,(double)640/480,1,1000);

в начале моего кода.

Заранее спасибо!:S

1 ответ

Решение

OpenGL - это конечный автомат, а не библиотека графов сцен. Он не помнит объекты, которые вы нарисовали. С помощью своего кода вы сначала рисуете объект (с какими бы текущими матрицами не было), а после этого устанавливаете новую матрицу представления. Это не повлияет на объект, уже нарисованный в этом кадре.

Когда приведенный выше код выполняется в цикле, это приводит к тому, что камера всегда смотрит на позицию объекта с последнего кадра, и чем быстрее движется ваш объект, тем больше он удаляется от камеры.

Установите матрицы, прежде чем рисовать объект.

Другие вопросы по тегам