Arkanoid 3D krok po kroku II

26.04.2010 - Olgierd Humeńczuk
TrudnośćTrudność

Włączamy pierwsze światło

Na tym etapie jesteśmy gotowi aby użyć napisanego kodu i oświetlić nasz sześcian. Zmodyfikujemy funkcję main ustawiając parametry źródła światła o id 0.

1
2
3
4
5
6
7
8
9
{
    //dane światła
    GLfloat position[] = { 0.0f, 10.0f, 10.0f, 1.0f };
    GLfloat ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
    GLfloat diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
    GLfloat specular[] = { 0.8f, 0.8f, 0.8f, 1.0f };
    
    setPointLight( GL_LIGHT0, position, ambient, diffuse, specular );    
}

Uwaga! Pozycję światła musimy podawać w każdej renderowanej klatce. Tak jak podajemy pozycje pozostałych obiektów.

Następnie uaktywnimy przekazywanie wskaźnika na pamięć zawierającą wartości wektorów normalnych:

1
    glEnableClientState( GL_NORMAL_ARRAY );    

Zmienimy odrobinę sposób podawania wskaźnika na pozycje wierzchołków. Wartość argumentu trzeciego z 0 zmieniamy na sizeof( vertexes::value_type ). Musimy to zrobić ponieważ uzupełniliśmy strukturę wierzchołka o normalne. Zatem pozycje wierzchołków nie są w pamięci ułożone w sposób ciągły. Argument trzeci - krok - pozwala nam poradzić sobie z taką sytuacją i ustawić o ile bajtów należy "przesunąć" wskaźnik, aby znaleźć dane następnego wierzchołka. Analogicznie jest z wartościami wektorów normalnych.

1
2
3
    glVertexPointer( 3, GL_FLOAT, 
                     sizeof( vertexes::value_type ), 
                     &cubeVertexes[ 0 ] );

Wskażemy bibliotece adres, pod którym zaczynają się wartości wektorów normalnych, oraz podamy krok.

1
2
3
    glNormalPointer( GL_FLOAT, 
                     sizeof( vertexes::value_type ),
                     &cubeVertexes[ 0 ].normal );

Ostatnią rzeczą, jaką powinniśmy zrobić, jest ustawienie materiału.

1
2
3
4
5
6
7
{
    GLfloat ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
    GLfloat diffuse[] = { 1.0f, 0.0f, 0.0f, 1.0f };
    GLfloat specular[] = { 0.2f, 0.2f, 0.2f, 1.0f };
    
    setMaterial( ambient, diffuse, specular, 0.9f );    
}

Gotowe! Nasz sześcian jest oświetlony!

Na koniec dodamy jeszcze obrót sześcianu wokół jego osi X. Po części po to, aby upewnić się, że oświetlenie jest obliczane poprawnie, a po części po to, by w pełni nacieszyć się efektem jaki osiągnęliśmy. Użyjemy polecenia glRotatef. Zmodyfikujmy zatem funkcję main:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    float angle = .0f;
    
    // główna pętla
    while( processInput() )
    {
    
    .
    .
    .
    
    glRotatef( angle, 1.0f, .0f, .0f );
    
    //prędkość obrotu
    angle += 0.4f;
    
    .
    .
    .
    
    }

Co dalej?

Jak dotąd udało się nam stworzyć część kodu, który odpowiada za wizualną stronę naszej gry. Oprócz poruszania sześcianem brakuje nam kilku istotnych rzeczy. W następnej części skupimy się na:
  • zarządzaniu sceną
  • renderowaniu planszy, na której toczyć się będzie rozgrywka
oraz postaramy się wprowadzić kolejnego aktora - kulę, którą gracz będzie rozbijał rozmieszczone na planszy klocki.

Zadanie

Na zakończenie zadanie. Używając poznanych w artykule poleceń, spróbuj uzyskać:

  • obrót bryły taki jak w animacji
  • kolory takie jak w animacji
Powodzenia!!!

Pokaż/ukryj podpowiedź

Spróbujmy pomyśleć o obrocie jak o złożeniu dwóch obrotów wokół dwóch różnych osi. Kolory także można mieszać. Zauważmy jak kolory przechodzą z jednego w drugi i które z nich należy połączyć aby otrzymać fioletowy.

4.666665
Twoja ocena: Brak Ocena: 4.7 (3 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com