OpenGL с использованием gluLookat () - PullRequest
0 голосов
/ 17 декабря 2011

Мне нужна помощь с gluLookAt (). Я пытаюсь использовать его после моего вызова glOrtho () (который я считаю правильным) в попытке сделать вид вниз по оси z от слегка приподнятого вида по оси y. Из того, что я понимаю в функции 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 голосов
/ 17 декабря 2011

с последними тремя углами обзора?

Неверно.Последние параметры определяют, в каком направлении камера находится в вертикальном положении.Представьте себе камеру, в которую вы положили палку.Эта палка сверху - это верхний вектор.


Извините, что говорю вам это, но: то, как вы все это делаете, ужасно неправильно.

Сначала вы нене может быть циклов обработки событий.Вам нужно позвонить SDL_WaitEvent или SDL_PollEvent куда-нибудь.Также не имеет никакого смысла иметь цикл for 0...300 в главном цикле программы для анимации.

Тогда ваш gluLookAt создаст преобразование вида, которое будет смотреть на рендеринг треугольника.

Нет способа исправить код.Я говорю начать с нуля, и взять правильный учебник.

...