[Kurs OpenGL, C++] III Def

background image

Strona główna

Kursy

Artykuły

Forum

Pliki

Promuj Nas!

[Kurs OpenGL, C++] III. Definiowanie sceny 3D

http://kursy.ddt.pl/?LessonId=181

1 z 9

2010-04-30 14:22

background image

Powrót

Historia odwiedzonych stron

Poprzednia lekcja

Kurs OpenGL, C++

Następna lekcja

Autor: Janusz Ganczarski

http://januszg.hg.pl/opengl/

III. Definiowanie sceny 3D

W kolejnych programach korzystajacych z biblioteki OpenGL zajmiemy sie podstawowymi zagadnieniami,

zwiazanymi ze scena 3D: obszarem renderingu, rzutowaniem i połozeniem obserwatora. Informacje tu zawarte
stanowia podstawe do wszystkich nastepnych programów.

3.1. Obszar renderingu

W pierwszym programie obszar renderingu, który zajmował początkowo całe okno, nie był modyfikowany

podczas zmiany rozmiarów tego okna. W efekcie jedyny element sceny 3D - kwadrat - zawsze znajdował sie w
tym samym miejscu wzgledem lewego dolnego naroznika okna. W aplikacjach pracujacych w systemach
okienkowych problem zmiany rozmiaru okna jest jednak tak powszechny, ze wymaga specjalnego potraktowania.
Jednym z mozliwych sposobów jego rozwiazania jest dynamiczna

modyfikacja obszaru renderingu. Słuzy to tego funkcja:

void

glViewport (GLint x, GLint y, GLsizei width, GLsizei height)

której parametry oznaczaja:

x, y - współrzedne lewego dolnego naroznika obszaru renderingu względem lewego dolnego naroznika
okna,
width - szerokosc okna renderingu,
height - wysokosc okna renderingu.

Domyslnie obszar renderingu zajmuje całe okno udostepnione dla aplikacji OpenGL. W naszym drugim

programie w trakcie zmiany rozmiaru okna (funkcja Reshape) bedziemy modyfikowac obszar renderingu na dwa
sposoby.

Pierwszy polega na objeciu obszarem renderingu całego dostępnego okna, drugi na takim wyborze okna

renderingu aby okno zachowało pierwotny aspekt obrazu, czyli stosunek szerokosci do wysokosci. Oczywiście
przy zastosowaniu pierwszej metody kwadrat bedzie zazwyczaj zdeformowany (patrz rysunki 1 i 2). Zmiany
sposobu definiowania okna renderingu mozna dokonac w dowolnym momencie, poprzez wybranie odpowiedniej
opcji w menu podrecznym.

W funkcji Menu została uzyta do tej pory nieopisana funkcja z biblioteki GLUT:

int

glutGet (GLenum type)

O tym jakiego rodzaju informacje zwróci funkcja glutGet decyduje parametr type. W przykładowym

programie sa to szerokosc i wysokosc okna, co odpowiada parametrom opisanym stałymi GLUT WINDOW
WIDTH i GLUT WINDOW HEIGHT.

Warto jeszcze kilka słów poswiecic zagadnieniu aspektu obrazu. Typowe monitory komputerowe posiadaja

aspekt 4:3, który jest zgodny z większością popularnych rozdzielczosci roboczych (np. 640 × 480, 800 × 600,
1.024 × 768, 1.600 × 1.200), ale inna popularna rozdzielczosc 1.280 × 1.024 pikseli odpowiada aspektowi 5:4.

Rysunek 1. P rogramu K wadrat 2 - rendering na całym oknie

Rysunek 2. P rogramu K wadrat 2 - rendering z zachowaniem as pektu 1:1

3.1.1. Plik kwadrat2.cpp

P anel Logowania

dast19

Administracja

Twój profil

Wyloguj

Uż yt kowników

Obecnie aktywnych:

14

Zalogowanych:

2

Zarejestrowanych:

3855

Ostatnie 24h:

646

Non-cookie 24h:

2051

Wszystkich:

178944

O c z e kuj ąc e t e mat y

Lista jest pusta.

Pokaż wszystkie (0)

Os tatnia Aktualizacja

2010-04-29 22:01:07

(wczoraj)

O st atnio akt ywni

dast19

1 min

Piotr Szawdyński

5 min

Iname

(√ιק)

17 min

szywro5

29 min

Saiph

34 min

markon

57 min

imandre

75 min

WunM

93 min

kuba1817

2 godz

killersft

2 godz

fish13

2 godz

kizia

2 godz

Szkolenia: programowanie

Bazy danych, SQL,
projektowanie. PHP. AJAX.
Java. Python. (WAW, KRK)

akademia.linuksa.pl

Kurs programowania 699zł

50%teoria 50%praktyki - 120
godzin nauka w
centrum,male grupy 5-10 os

www.gowork.pl

[Kurs OpenGL, C++] III. Definiowanie sceny 3D

http://kursy.ddt.pl/?LessonId=181

2 z 9

2010-04-30 14:22

background image

/*
(c) Janusz Ganczarski
http://www.januszg.hg.pl
JanuszG(małpeczka)enter.net.pl
*/

#include <GL/glut.h>
#include <stdlib.h>

// stałe do obsługi menu podręcznego

enum

{
FULL_WINDOW,

// obszar renderingu - całe okno

ASPECT_1_1,

// obszar renderingu - aspekt 1:1

EXIT

// wyjście

};

// aspekt obrazu

int

Aspect = FULL_WINDOW;

// funkcja generująca scenę 3D

void

Display ()

3.2. Rzutowanie prostokątne

Rzutowaniem okreslamy odwzorowanie zawartosci trójwymiarowej sceny graficznej na płaskim ekranie

monitora. Biblioteka OpenGL oferuje standardowo dwie metody rzutowania: rzutowanie prostokatne i rzutowanie
perspektywiczne. Domyslnie stosowane jest rzutowanie prostokatne. W rzutowaniu prostokatnym (lub
ortogonalnym) proste rzutowania sa prostopadłe do rzutni, która jest reprezentowana przez obszar renderingu. Z
rzutowaniem prostokatnym scisle zwiazane jest pojecie bryły odcinania -

prostopadłoscianu, który stanowi ograniczenie sceny 3D. Obiekty znajdujące sie poza bryła odcinania nie

sa rysowane, a obiekty ja przecinajace rysowane sa tylko czesciowo. Rozmiar bryły odcinania w rzutowaniu
prostokatnym okresla funkcja:

void

glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble

top, GLdouble near, GLdouble far)

której parametry okreslaja współrzedne punktów przeciecia płaszczyzn tworzących bryłe odcinania z osiami

układu współrzednych kartezjanskich. Płaszczyzny te opisane sa nastepujacymi równaniami:

x = right
x = left
y = top
y = bottm
z = −near
z = −far

Obszar renderingu zawiera sie w płaszczyznie o równaniu z = −near. Połozenie poszczególnych płaszczyzn

tworzacych bryłe odcinania przedstawia rysunek 3. Trzeba jednak wyraznie zwrócic uwage, ze poczatek układu
współrzednych nie musi znajdowac sie wewnatrz bryły odcinania – rozmiary i połozenie bryły ograniczone sa
jedynie zakresem stosowanych liczb.

Rysunek 3. P ołozenie płas zczyzn bryły odcinania w rzutowaniu pros tokatnym

Domyslnie bryła odcinania ma postac szescianu o bokach równych 2, którego srodek pokrywa sie z

poczatkiem układu współrzednych, co odpowiada wywołaniu funkcji glOrtho (-1,1,-1,1,-1,1). Os OZ jest
prostopadła do płaszczyzny obszaru renderingu i przechodzi przez srodek tego obszaru. Dlatego rysowany w
pierwszym i drugim programie kwadrat zajmował poczatkowo czwarta czesc okna.

Funkcja glOrtho tworzy macierz rzutu prostokatnego:

która jest nastepnie mnozona przez biezaca macierz i umieszczona na szczycie stosu z biezaca macierza.

OpenGL zawiera kilka stosów macierzy, z których w przykładowym programie wykorzystamy stos macierzy

[Kurs OpenGL, C++] III. Definiowanie sceny 3D

http://kursy.ddt.pl/?LessonId=181

3 z 9

2010-04-30 14:22

background image

rzutowania oraz stos macierzy modelowania. Wybór biezacej macierzy umozliwia funkcja:

void

glMatrixMode (GLenum mode)

gdzie parametr mode moze przyjac jedna z wartosci:

GL MODELVIEW - macierz modelowania,
GL PROJECTION - macierz rzutowania,
GL TEXTURE - macierz tekstury (omówiona pózniej).

Poniewaz poczatkowa wartosc wybranej macierzy jest nieokreslona, przed wywołaniem glOrtho nalezy

biezacej macierzy przyporzadkowac macierz jednostkowa. Najłatwiej mozna to zrobic uzywajac funkcji:

void

glLoadIdentity (

void

)

Analogiczne postepowanie dotyczy macierzy modelowania. Po jej wyborze przykładowym programie (plik

szescian1.cpp) w funkcji Display macierzy modelowania takze przyporzadkowywana jest macierz jednostkowa.
Jezeli renderowana scena jest dwuwymiarowa, do ustawienia parametrów bryły odcinania w rzutowaniu
prostokatnym mozna uzyc funkcji z biblioteki GLU:

void

gluOrtho2D (GLdouble left, GLdouble right, GLdouble bottom, GLdouble

top)

której parametry left, right, bottom i top odpowiadaja parametrom funkcji glOrtho, a przednia (near) i tylna

(far) płaszczyzna obcinania maja wartosci odpowiednio -1 i 1. W przykładowym programie poczatkowa bryła
odcinania ma postac sześcianu o krawedziach długosci 4, a rysowana figura - takze szescian – ma krawedzie o
długosci 2. Centralne umieszczenie rysowanego szescianu w połaczeniu z zastosowanym rzutowaniem
prostokatnym daje w efekcie kwadrat (patrz rysunek 4). Podobnie jak w poprzednim programie mozliwy jest
wybór, czy scena ma byc rysowana z zachowaniem poczatkowego aspektu obrazu czy tez bez zachowania tej
proporcji. Jednak w tym przypadku nie jest modyfikowany obszar renderingu ale współrzedne bryły odcinania
(funkcja Reshape).

Rysunek 4. P oczatkowe okno programu Szes cian 1

3.2.1. Plik szescian1.cpp

/*
(c) Janusz Ganczarski
http://www.januszg.hg.pl
JanuszG(małpeczka)enter.net.pl
*/

#include <GL/glut.h>
#include <stdlib.h>

// stałe do obsługi menu podręcznego

enum

{
FULL_WINDOW,

// aspekt obrazu - całe okno

ASPECT_1_1,

// aspekt obrazu 1:1

EXIT

// wyjście

};

// aspekt obrazu

int

Aspect = FULL_WINDOW;

// funkcja generująca scenę 3D

void

Display ()

3.3. Rzutowanie perspektywiczne

Rzutowanie perspektywiczne daje bardziej realistyczne efekty niz rzutowanie prostokatne, stad jest szeroko

stosowane np. w grach. Parametry bryły odcinania, która przy rzutowaniu perspektywicznym ma postac

[Kurs OpenGL, C++] III. Definiowanie sceny 3D

http://kursy.ddt.pl/?LessonId=181

4 z 9

2010-04-30 14:22

background image

ostrosłupa scietego o wierzchołku znajdujacym sie w poczatku układu współrzędnych (patrz rysunek 5), okresla
funkcja:

void

glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble

top, GLdouble near, GLdouble far)

Parametry left, right, bottom i top wyznaczaja rozmiary górnej podstawy bryły odcinania (jest to obszar

bezposrednio odwzorowywany na obszar renderingu), a near i far wyznaczaja połozenie odpowiednio górnej i
dolnej podstawy ostrosłupa (przedniej i tylnej płaszczyzny odcinania), które zawieraja sie w płaszczyznach o
równaniach: z = −near i z = −far. Parametry near i far musza miec wartosci dodatnie.

Macierz rzutowania perspektywicznego, tworzona przez funkcje glFrustum i mnozona przez aktualnie

wybrana macierz, ma postac:

Warto zauwazyc, ze precyzja działania jeszcze przez nas nieużywanego z-bufora, zalezy od wartosci

stosunku parametrów near i far:

Rysunek 5. P ołozenie płaszczyzn bryły odcinania w rzutowaniu pers pektywicznym

Im wieksza wartosc r, tym mniej efektywne jest działanie z-bufora. Oczywiście near nigdy nie moze przyjac

wartosci równej 0, bowiem przednia płaszczyzna odcinania przechodziła by wówczas przez srodek perspektywy.
Alternatywny sposób okreslania rzutu perspektywicznego umozliwia funkcja z biblioteki GLU:

void

gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear,

GLdouble zFar)

gdzie parametr fovy okresla w stopniach kat widzenia obserwatora zawarty w płaszczyznie YZ (6 (top, 0,

bottom)), a aspect jest stosunkiem szerokości do wysokosci przedniej płaszczyzny odcinania, czyli górnej
podstawy ostrosłupa ograniczajacego scene 3D. Parametry zNear i zFar odpowiadaja parametrom near i far
funkcji glFrustum. Macierz rzutowania perspektywicznego, tworzona przez funkcje gluPerspective

i mnozona przez aktualnie wybrana macierz, ma postac:

Wewnetrznie funkcja gluPerspective wykorzystuje do ustawienia macierzy rzutowania perspektywicznego

funkcje glFrustum. Oto wzory przekształcenia parametrów funkcji gluPerspective na parametry glFrustum:

W kolejnym przykładowym programie (plik szescian2.cpp) do utworzenia macierzy rzutowania

perspektywicznego wykorzystamy funkcje glFrustum. Przednia płaszczyzna odcinania bedzie miała takie same
rozmiary jak w poprzednim programie. Zmianie ulegna natomiast współrzedne przedniej i tylnej płaszczyzny
obcinania - poprzednio jedna z tych płaszczyzn miała wartosc ujemna, której nie akceptuje funkcja glFrustum.
Rysowanym obiektem ponownie bedzie szescian ale próba narysowania go w tym samym miejscu jak w
poprzednim programie spowoduje, ze będzie widoczna tylko jedna jego sciana. Wszystko dlatego, ze pozostałe
sciany szescianu znajduja sie poza obszarem bryły odcinania. Mozliwe sa trzy sposoby rozwiazania tego
problemu. Pierwszy polega na zmianie współrzędnych wierzchołków szescianu w taki sposób, aby szescian
zmiescił sie w zmienionej bryle obcinania. Rozwiazanie to ma jedna zasadnicza wade – wierzchołki szescianu
trzeba bedzie modyfikowac przy kazdej zmianie parametrów sceny 3D. W przypadku jednego obiektu nie
stanowi to specjalnego problemu, ale czyni pomysł niewykonalnym przy kazdej bardziej skomplikowanej scenie
3D.

Drugie, zastosowane w programie rozwiazanie, polega na przesunieciu wierzchołków szescianu o wektor [0,

[Kurs OpenGL, C++] III. Definiowanie sceny 3D

http://kursy.ddt.pl/?LessonId=181

5 z 9

2010-04-30 14:22

background image

0,−3], czyli o -3 jednostki wzdłuz osi OZ. Realizuje to funkcja glTranslatef, która wywoływana jest bezpośrednio
po zainicjowaniu macierzy modelowania macierza jednostkowa (patrz funkcja Display). W efekcie otrzymamy
szescian przedstawiony na rysunku 6. Nalezy dodac, ze taka metoda jest czesto stosowana praktyka. Obiekty 3D
definiowane sa z róznymi współrzednymi, a nastepnie odpowiednio transformowane do docelowego połozenia w
scenie 3D. Funkcje umożliwiające takie przekształcenia poznamy blizej w nastepnym odcinku kursu. Trzecia
metoda jest modyfikacja połozenia obserwatora sceny 3D - zapoznamy się z ta technika jeszcze w tym odcinku.

Rysunek 6. P oczatkowe okno programu Szes cian 2

3.3.1. Plik szescian2.cpp

/*
(c) Janusz Ganczarski
http://www.januszg.hg.pl
JanuszG(małpeczka)enter.net.pl
*/

#include <GL/glut.h>
#include <stdlib.h>

// stałe do obsługi menu podręcznego

enum

{
FULL_WINDOW,

// aspekt obrazu - całe okno

ASPECT_1_1,

// aspekt obrazu 1:1

EXIT

// wyjście

};

// aspekt obrazu

int

Aspect = FULL_WINDOW;

// funkcja generująca scenę 3D

void

Display ()

Drugi program przedstawiajacy rzutowanie perspektywiczne (plik szescian3.cpp) stosuje funkcje

gluPerspective. Aby jednak nie powielac rozwiązań z poprzedniego programu dodamy mechanizm pokazujacy
jaki wpływ na wyglad obiektów 3D ma zmiana połozenie srodka perspektywy, realizowana

poprzez zmiane kata widzenia obserwatora (parametr fovy funkcji gluPerspective). W tym celu potrzebna

jest obsługa klawiatury. Podstawowa funkcja obsługi klawiatury (w przykładowym programie jest to funkcja
Keyboard) ma trzy parametry:

key - kod ASCII klawisza,
x, y - współrzedne kursora myszki w chwili nacisniecia przycisku klawiatury.

Aby obsługa klawiatury działała, w czesci głównej programu nalezy włączyć funkcje obsługi klawiatury

wywołujac funkcje:

void

glutKeyboardFunc (

void

(*func)(

unsigned

char

key,

int

x,

int

y))

Poczatkowe okno programu Szescian 3 zawiera rysunek 7. Przyciskając klawisze „+” i „-” mozna

modyfikowac kat patrzenia obserwatora, który poczatkowo wynosi 90 stopni.

[Kurs OpenGL, C++] III. Definiowanie sceny 3D

http://kursy.ddt.pl/?LessonId=181

6 z 9

2010-04-30 14:22

background image

Rysunek 7. P oczatkowe okno programu Szes cian 3

3.3.2. Plik szescian3.cpp

/*
(c) Janusz Ganczarski
http://www.januszg.hg.pl
JanuszG(małpeczka)enter.net.pl
*/

#include <GL/glut.h>
#include <stdlib.h>

// stała do obsługi menu podręcznego

enum

{
EXIT

// wyjście

};

// pionowy kąt pola widzenia

GLdouble fovy = 90;

// funkcja generująca scenę 3D

void

Display ()

{

// kolor tła - zawartość bufora koloru

3.4. Położenie obserwatora

Ostatnim z podstawowych elementów wymagajacych omówienia przy tworzeniu sceny 3D jest połozenie

obserwatora, nazywane takze położeniem kamery lub „oka”. Domyslnie obserwator w OpenGL połozony jest w
poczatku układu współrzednych i skierowany jest w strone ujemnej półosi OZ. Obserwator jest tak zorientowany
w przestrzeni, ze kierunek „do góry” pokrywa sie z kierunkiem osi OY. Zasadniczo OpenGL nie umozliwia
zmiany połozenia obserwatora. Wszystkie przekształcenia połozenia obserwatora faktycznie realizowane SA jako
odpowiednie przekształcenia układu współrzednych. Aby jednak ułatwic prace zwiazane z definiowaniem tych
przekształcen, biblioteka GLU zawiera funkcje gluLookAt, która pozwala na jednorazowe zdefiniowanie
wszystkich parametrów opisujacych obserwatora:

void

gluLookAt (GLdouble eyex, GLdouble eyey, GLdouble eyez,

GLdouble centerx, GLdouble centery,
GLdouble centerz,
GLdouble upx, GLdouble upy, GLdouble upz)

Kolejne trójki parametrów funkcji gluLookAt oznaczaja:

eyex, eyey, eyez - współrzedne połozenia obserwatora,
centerx, centery, centerz - współrzedne punktu, w którego kierunku
jest zwrócony obserwator,
upx, upy, upz - współrzedne wektora okreslajacego kierunek „do góry”.

Domyslne połozenie obserwatora odpowiada wywołaniu

gluLookat (0.0, 0.0, 0.0, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0)

W kolejnym przykładowym programie (plik szescian4.cpp) będziemy modyfikowac tylko współrzedne

połozenia obserwatora. Przy niezmiennych współrzednych punktu, w którego kierunku patrzy obserwator, daje to
ciekawy efekt obserwacji sceny z pewnej odległosci. Zmiana połozenia obserwatora realizowana jest w
funkcjach Keyboard (przyciski „+” i „-”) oraz SpecialKeys (klawisze kursora).Warto zauwazyc, ze zmiany
współrzednych obserwatora, które reprezentuja zmienne eyex, eyey i eyez, sa odwrotne niz mozna by sie
spodziewac. Przykładowo nacisniecie strzałki w dół powoduje zwiekszenie o 0,1 zmiennej eyey, która okresla
współrzedna Y połozenia obserwatora. Jest to spowodowane tym, ze macierz modelowania, modyfikowana przy
wywołaniu funkcji gluLookAt, odgrywa podwójna role. Z jednej strony umozliwia przekształcenia współrzędnych

[Kurs OpenGL, C++] III. Definiowanie sceny 3D

http://kursy.ddt.pl/?LessonId=181

7 z 9

2010-04-30 14:22

background image

obiektu (patrz poprzedni przykład), a z drugiej przekształcenia współrzednych obserwatora. Przykładowo, to co z
punktu widzenia obiektu jest przesunieciem o wektor [1, 0, 0], dla obserwatora jest przesunieciem o wektor
przeciwny tj. [−1, 0, 0]. Dobre poznanie opisanego mechanizmy wymaga eksperymentów, do których goraco
zachecam Czytelników.

Do omówienia pozostała wprowadzona w ostatnim przykładzie obsługa klawiszy kursora. Jest ona

realizowana odrebnie od obsługi przycisków, które reprezentowane sa bezposrednio przez kody ASCII (funkcja
Keyboard). Funkcja obsługujaca klawisze kursora oraz przyciski funkcyjne (w przykładowym programie jest to
funkcja SpecialKeys) ma trzy parametry:

— key - kod przycisku; zwracana jest jedna z ponizszych wartosci:

GLUT KEY F1 - przycisk F1,
GLUT KEY F2 - przycisk F2,
GLUT KEY F3 - przycisk F3,
GLUT KEY F4 - przycisk F4,
GLUT KEY F5 - przycisk F5,
GLUT KEY F6 - przycisk F6,
GLUT KEY F7 - przycisk F7,
GLUT KEY F8 - przycisk F8,
GLUT KEY F9 - przycisk F9,
GLUT KEY F10 - przycisk F10,
GLUT KEY F11 - przycisk F11,
GLUT KEY F12 - przycisk F12,
GLUT KEY LEFT - kursor w lewo,
GLUT KEY UP - kursor do góry,
GLUT KEY RIGHT - kursor w prawo,
GLUT KEY DOWN - kursor w dół,
GLUT KEY PAGE UP - przycisk Page Up
GLUT KEY PAGE DOWN - przycisk Page Down,
GLUT KEY HOME - przycisk Home,
GLUT KEY END - przycisk End,
GLUT KEY INSERT - przycisk Insert.

— x, y - współrzedne kursora myszki w chwili nacisniecia przycisku klawiatury.
Podobnie jak w przypadku poprzedniej funkcji obsługujacej klawiature, w głównym programie nalezy

właczyc obsługe klawiszy kursora i klawiszy funkcyjnych wywołujac funkcje:

void

glutSpecialFunc (

void

(*func)(

int

key,

int

x,

int

y))

Rysunek 8 przedstawia przykładowe okno programu Szescian 4, którego kod zródłowy znajduje sie ponizej.

Rysunek 8. P rzykładowe okno programu Szescian 4

3.4.1. Plik szescian4.cpp

[Kurs OpenGL, C++] III. Definiowanie sceny 3D

http://kursy.ddt.pl/?LessonId=181

8 z 9

2010-04-30 14:22

background image

/*
(c) Janusz Ganczarski
http://www.januszg.hg.pl
JanuszG(małpeczka)enter.net.pl
*/

#include <GL/glut.h>
#include <stdlib.h>

// stałe do obsługi menu podręcznego

enum

{
FULL_WINDOW,

// aspekt obrazu - całe okno

ASPECT_1_1,

// aspekt obrazu 1:1

EXIT

// wyjście

};

// aspekt obrazu

int

Aspect = FULL_WINDOW;

// wpółrzędne położenia obserwatora

GLdouble eyex = 0;

3.5. Źródło materiału

Materiał został pobrany ze strony

http://januszg.hg.pl/opengl/

, za uprzednim otrzymaniem zgody od jego

autora. Podziekowania dla

Janusza Ganczarskiego

za udostępnienie materiałów

Poprzednia lekcja

Kurs OpenGL, C++

Następna lekcja

Wsz e lkie prawa z ast rz e ż one . Aut or: ź ródło z e wnę t rz ne

Wszystkie teksty są chronione prawami autorskimi. Kopiowanie lub
rozpowszechnianie treści bez wyraźnej zgody jego autora jest zabronione.

Powrót

Historia odwiedzonych stron

O portalu

Archiwum

Historia

Indeks

Regulamin

Wyszukiwarka

Linki

© Wszelkie prawa zastrzeżone 2005-2010

Czas wygenerowania strony: 0.218s

Autor: Piotr Szawdyński

[Kurs OpenGL, C++] III. Definiowanie sceny 3D

http://kursy.ddt.pl/?LessonId=181

9 z 9

2010-04-30 14:22


Wyszukiwarka

Podobne podstrony:
Internet Kurs Wydanie III 2
Internet Kurs Wydanie III inkur3
Tworzenie stron WWW Kurs Wydanie III
[Kurs OpenGL, C++] VII Wie
[Kurs OpenGL, C++] VIII Ko
[Kurs OpenGL, C++] IV Prze
C Praktyczny kurs Wydanie III
informatyka tworzenie stron www kurs wydanie iii radoslaw sokol ebook
C Praktyczny kurs Wydanie III cshpk3
[Kurs OpenGL, C++] VI Elem
Internet Kurs Wydanie III inkur3
[Kurs OpenGL, C++] II Pier
[Kurs OpenGL, C++] V Okraw
Krótki kurs C Część III(1)
[Kurs OpenGL, C++] I Podstawy
Darmowy Kurs OpenGL, C++ On
C Praktyczny kurs Wydanie III
Internet Kurs Wydanie III
opengl ksiega eksperta wydanie iii UZFSAM5UH2NWETWCPGG2PS3RHAX75LU5XCNZJJI

więcej podobnych podstron