freeman |
Wysłany: Sob 18:16, 29 Paź 2005 Temat postu: |
|
No dobra, pora wprowadzić nieco ruchu do naszej sceny. W tym celu musimy stworzyć funkcję, która będzie wywoływana zawsze kiedy system nie będzie zajęty, umieszczamy ją zaraz przed main'em:
void Idle()
{
glRotatef( 0.1f, 1.0f, 1.0f, 1.0f); //wektor obrotu sceny
Render();
}
Trzeba jeszcze zarejestrować tą funkcję w main'ie:
glutIdleFunc(Idle);
Wstawiamy tą linijkę po Init(), a przed zarejestrowaniem funkcji Render.
main po zmianach powinien wygladać tak:
int main(int argc, char **argv)
{
glutInitDisplayMode(GLUT_DOUBLE);
glutCreateWindow("Program_OpenGL");
Init();
glutIdleFunc(Idle);
glutDisplayFunc(Render);
glutMainLoop();
return EXIT_SUCCESS;
}
Aha wartości wektorów, czy kolorów wprowadzamy za pomacą odpowiedniej reprezentacji liczb double w OpenGl np. 1.0f
Jeśli chcemy wyświetlić dodatkowo inne obiekty to odpowiednie instrukcje umieszczamy w funkcji Render()
glutWireSphere( 0.1, 30.0, 30.0)
glutWireCube(0.3)
glutWireCone( 0.04, 0.3, 20, 20);
glutWireTorus( 0.03, 0.1, 20, 20);
glVertex3f( 0.0f, 0.0f, 0.0f ) - tworzy wierzchołek w punkcie przestrzeni
Definicje wierzchołków umieszczamy w środku instrukcji glBegin:
glBegin( GL_POINTS );
glColor3f( 0.0f, 1.0f, 0.0f );
glVertex3f( 0.0f, 0.0f, 0.0f );
glColor3f( 0.0f, 0.0f, 1.0f );
glVertex3f( 0.5f, 0.0f, 0.0f );
glColor3f( 1.0f, 1.0f, 0.0f );
glVertex3f( 0.5f, 0.5f, 0.0f );
glColor3f( 1.0f, 0.0f, 0.0f );
glVertex3f( 0.0f, 0.5f, 0.0f );
glEnd();
Przed każdym wierzchołkiem możemy ustawić jego kolor funkcją glColor3f. Atrybut GL_POINTS w funkcji glBegin oznacza, że podajemy wierzchołki, z których każdy będzie punktem w przestrzeni. Inne atrybuty jakie możemy użyć to:GL_LINES GL_TRIANGLES (liczba wpisanych wierzchołków musi być wielokrotnością liczby 3) albo GL_QUADS (każde 4 wierzchołki to prostokąt) |
|
freeman |
Wysłany: Sob 17:58, 29 Paź 2005 Temat postu: |
|
Opis ważniejszych części kodu:
void Keyboard( unsigned char key, int x, int y)
{
if (key == 27) exit(EXIT_SUCCESS);
}
Funkcja keyboard służy do obsługi klawiatury. Na razie wprowadzona obsługa klawisza Esc, aby wyjść z programu.
void Init()
{
glClearColor(0.2f, 0.2f, 0.4f, 1.0f); // kolor tla
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); //bryła obcinania
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST); //test głebi
glutFullScreen(); //pełny ekran
glutKeyboardFunc(Keyboard); //rejestrowanie funkcji Keyboard
}
Funkcja Init odpowiedzialna jest za początkowe parametry okna renderowania. Kolejnosą tam polecenia, które ustawiają:
- kolor tła w formacie RGBA
- bryłę obcinana w rzutowaniu prostokątnym (trójwymiarowa bryła, w której efekty renderowania są widoczne; poza tym obszarem scena nie jest renderowana)
- test głebi (obiekty renderowane przysłaniają te dalsze)
Potem definiujemy główną funkcję renderującą:
void Render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f( 0.0f, 1.0f, 0.0f ); //ustawienie koloru (dzbanka)
glutWireTeapot( 0.4 ); //funkcja renderująca dzbanek (rozmiar)
glutSwapBuffers();
}
- funkcja glClear czyści ekran
- glutSwapBuffers() (jest ściśle związane z instrukcją glutInitDisplayMode(GLUT_DOUBLE);, która umożliwia ustawienie parametrów początkowych okna renderowania). Włącza ona podwójne buforowanie - rysujemy na "niewidocznym ekranie" (buforze), a po zakończeniu renderowania ekran staje się widoczny (ekran z pamięci (dane z bufora) ze wszystkimi narysowanymi obiektami jest wysyłany na monitor) Dzięki temu nie widać procesu renderingu (jak pojawiają się kolejne cześci dzbanka) tylko od razu cały dzbanek. Zamiany buforów dokonuje właśnie funkcja glutSwapBuffers.
W funkcji main też są komendy odpowiedzialne za tworzenie okna glutCreateWindow, wywołanie Init, rejestracja funkcji Render glutDisplayFunc(Render);. Funkcja glutMainLoop wprowadza program w nieskończoną pętlę zapobiegając wyjściu z programu. |
|