Hlavne menu We are sorry, but magazine AMMO is suspended. Here is just read-only access to the articles archive. Some features are removed because they were outdated, pointless in read-only (voting and pools), or it was missused by spammers (comments) etc. Now the webpages aren't maintained so when something will get broken most probably it won't be fixed at all. If you liked our magazine then please make donation with paypal so we can pay for traffic on this server.

TOP Výuka
01 Maľované krížovky 103 bodov
02 OpenGL, lákadlo 38 bodov
03 MySQL (+ použitie Visual C++ a PHP) 28 bodov
04 OpenGL, časť 1 21 bodov
05 Huffmanove kódovanie 19 bodov
06 Pascal, časť 1 18 bodov
07 Ako tlačiť s HP 16 bodov
08 Základy HTML časť 2 16 bodov
09 Základy HTML časť 3 13 bodov
10 Hry pre nenáročných + zdrojáky 10 bodov
11 OpenGL, úvod 8 bodov
12 Faktúrka v4.0 + zdrojáky v MS Visual C++ 6.0 7 bodov
13 OpenGL – Intermezzo 1 7 bodov
14 OpenGL povinná literatúra 6 bodov
15 Základy HTML časť 1 6 bodov
Najnovsie clanky
Kvalitné služby podľa skúseností iných - TopSlužby.sk
LOTR - Dve veže - Parodia - Scénka 2. časť
Neverwinter nights
Children Of Bodom-Hatebreeder
Kult Duny - 6. časť (Bonus)
Kult Duny - 5. časť (Filmy, Hry)
Dobré ráno. (morc certa, hora incerta...)
Kult Duny - 4. časť (Knihy 2/2)
Stretnutie Spoločenstva Tolkiena
GRAVE DIGGER – Knights Of The Cross
Kult Duny - 3. časť (Knihy 1/2)
Kult Duny - 2. časť (Pojmy)
Kult Duny - 1. časť (Úvod)
LOTR - Dve veže - Parodia - Scénka
Jackass
Vsetky clanky
Airsoft - Specnaz [4 clanky]
Básne [6 clankov]
Fantázia [4 clanky]
Filmy a DVD [51 clankov]
Hardware [10 clankov]
Hry [170 clankov]
Hry, návody [6 clankov]
Hudba [8 clankov]
Internet [7 clankov]
Knihy [6 clankov]
O AMME [4 clanky]
Pandemonium [10 clankov]
Poviedky [14 clankov]
Programy [18 clankov]
Rôzne [8 clankov]
Technické [3 clanky]
Úvahy [8 clankov]
Výuka [50 clankov]
Ako tlačiť s HP
Algoritmy v grafoch
Fake2
Faktúrka
Faktúrka v4.0 + zdrojáky v MS Visual C++ 6.0
Fract
HLSaver
Hry pre nenáročných + zdrojáky
Huffmanove kódovanie
IPicture2 & aggresiveoptimize.h
Maľované krížovky
MySQL (+ použitie Visual C++ a PHP)
OpenGL - GLWnd
OpenGL AMMO Saver
OpenGL povinná literatúra
OpenGL – Intermezzo 1
OpenGL, časť 11
OpenGL, časť 12
OpenGL, časť 13
OpenGL, časť 14
OpenGL, časť 15
OpenGL, časť 16
OpenGL, časť 17
OpenGL, časť 18
OpenGL, časť 7
OpenGL, časť 8
OpenGL, časť 9
Opengl – Cloth Simulation
RenameR
SkinMagic
WinSocket Communication via VC++
Údajové štruktúry
viac...
Zábava [5 clankov]
Zdravie [15 clankov]
Celkovy pocet clankov: 407
OpenGL, časť 10 
Výuka | Dna 5.6.2002 | Johny | 8 znamok, priemer 2.75 | 6950 videni | 1072 WAP videni

Táto časť neprinesie až tak veľa nového, ale za to použije veľa toho, čo bolo v predchádzajúcich častiach a spojí to do toho, že si vyrobíme jednoduchý 3D svet. My budeme všetku prácu ponechávať na OpenGL, takže žiadne hĺbkové sortovanie, BSP alebo počitanie viditeľných častí robiť nebudeme. To príde až niekedy ku koncu OpenGL seríálu. Ale pri malých projektoch nemá zatiaľ zmysel sa s tým trápiť, jedine, že by ste chceli urobiť pokračovanie Quake 3 Arena. Táto hra chodí pod OpenGL a veľa ďalších hier berie tento engine za základ ich enginu. Napríklad Return to Castle Wolfenstein alebo Jedi 2 Outcast.

V tejto časti spravíme teda jednoduchý 3D svet, ako prvé potrebujeme niečo, kde budeme uschovávať informácie o našom svete.
Každý 3D svet sa väčšinou skladá zo sektorov, sektor môže byť napríklad izba, kocka alebo iný uzavretý objekt.

typedef struct tagSECTOR
{
int numtriangles;
TRIANGLE* triangle;
} SECTOR;

Každý sektor si pamätá počet polygónov, v našom prípade trojuholníkov, takže ďalšia struktúra, ktorú musíme zadefinovať je trojuholník.


typedef struct tagTRIANGLE
{
VERTEX vertex[3];
} TRIANGLE;

Každý trojuholník má 3 vrcholy, a každý vrchol definujú 3 súradnice v 3D priestore. A ešte 2 údaje u,v, ktoré predstavujú koordináty pre textúru.

typedef struct tagVERTEX
{
float x, y, z;
float u, v;
} VERTEX;


Nahrávanie 3D světa.

Keby sme celý náš svet definovali vo vnútri programu, bolo by to celé statické a asi aj nudné a při každej zmene, by bolo třeba prekompilovať zdroják, viete si predstaviť, že by tak robili napr. Quake 3 Arena ? ;o)

Takže celý náš 3D svet bude uložený v nejakom súbore. A v takom formáte, aby sme ho vedeli dobre čítať. Editor asi vyrábať nebudeme, takže použijeme ASCII formát, ktorý môžeme ľahko editovať aj Notepade, Norton Commanderi alebo hocijakom textovom editore.

Spravíme si funkciu SetupWorld, ktorá náš 3D svet nahrá zo súboru.

void SetupWorld()
{
FILE *filein;
filein = fopen(worldfile, "rt");

...
(načítame data)
...

fclose(filein);
return;
}


Súbor budeme čítať po riadkoch, čo bude robiť naša ďalšia funckia readstr.

void readstr(FILE *f,char *string)

{
do
{
fgets(string, 255, f);
} while ((string[0] == '/') || (string[0] == '
'));
return;
}


Ďalej načítame data do sektoru, v našom prípade bude len 1 sektor, ale nie je ťažké doplniť to na viac sektorov. Náš program ťiež musí vedieť, koľko trojuholníkov je v sektore.


int numtriangles;
char oneline[255];
...
readstr(filein,oneline);
sscanf(oneline, "NUMPOLLIES %d
", &numtriangles);


char oneline[255];
int numtriangles;
float x, y, z, u, v;
...
sector1.triangle = new TRIANGLE[numtriangles];
sector1.numtriangles = numtriangles;
for (int triloop = 0; triloop < numtriangles; triloop++)
{
for (int vertloop = 0; vertloop < 3; vertloop++)
{
readstr(filein,oneline);
sscanf(oneline, "%f %f %f %f %f", &x, &y, &z, &u, &v);
sector1.triangle[triloop].vertex[vertloop].x = x;
sector1.triangle[triloop].vertex[vertloop].y = y;
sector1.triangle[triloop].vertex[vertloop].z = z;
sector1.triangle[triloop].vertex[vertloop].u = u;
sector1.triangle[triloop].vertex[vertloop].v = v;
}
}


Každý z trojuholníkov teraz vyzerá takto
X1 Y1 Z1 U1 V1
X2 Y2 Z2 U2 V2
X3 Y3 Z3 U3 V3

Zobrazovanie 3D sveta:

Všetko sa bude riadiť podľa toho, ako to zvolí užívateľ. Nastavíme ovládanie na šípky.



if (keys[VK_RIGHT])
{
yrot -= 1.5f;
}

if (keys[VK_LEFT])
{
yrot += 1.5f;
}

if (keys[VK_UP])
{
xpos -= (float)sin(heading*piover180) * 0.05f;
zpos -= (float)cos(heading*piover180) * 0.05f;
if (walkbiasangle >= 359.0f)
{
walkbiasangle = 0.0f;
}
else
{
walkbiasangle+= 10;
}
walkbias = (float)sin(walkbiasangle * piover180)/20.0f;
}

if (keys[VK_DOWN])
{
xpos += (float)sin(heading*piover180) * 0.05f;
zpos += (float)cos(heading*piover180) * 0.05f;
if (walkbiasangle <= 1.0f)
{
walkbiasangle = 359.0f;
}
else
{
walkbiasangle-= 10;
}
walkbias = (float)sin(walkbiasangle * piover180)/20.0f;
}


Ku chodeniu pridáme ešte trošku pohyby hore-dole, aby to vyzeralo ako ľudská chôdza.



int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

GLfloat x_m, y_m, z_m, u_m, v_m;
GLfloat xtrans = -xpos;
GLfloat ztrans = -zpos;
GLfloat ytrans = -walkbias-0.25f;
GLfloat sceneroty = 360.0f - yrot;

int numtriangles;

glRotatef(lookupdown,1.0f,0,0);
glRotatef(sceneroty,0,1.0f,0);

glTranslatef(xtrans, ytrans, ztrans);
glBindTexture(GL_TEXTURE_2D, texture[filter]);

numtriangles = sector1.numtriangles;

for (int loop_m = 0; loop_m < numtriangles; loop_m++)
{
glBegin(GL_TRIANGLES);
glNormal3f( 0.0f, 0.0f, 1.0f);
x_m = sector1.triangle[loop_m].vertex[0].x;
y_m = sector1.triangle[loop_m].vertex[0].y;
z_m = sector1.triangle[loop_m].vertex[0].z;
u_m = sector1.triangle[loop_m].vertex[0].u;
v_m = sector1.triangle[loop_m].vertex[0].v;
glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m);

x_m = sector1.triangle[loop_m].vertex[1].x;
y_m = sector1.triangle[loop_m].vertex[1].y;
z_m = sector1.triangle[loop_m].vertex[1].z;
u_m = sector1.triangle[loop_m].vertex[1].u;
v_m = sector1.triangle[loop_m].vertex[1].v;
glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m);

x_m = sector1.triangle[loop_m].vertex[2].x;
y_m = sector1.triangle[loop_m].vertex[2].y;
z_m = sector1.triangle[loop_m].vertex[2].z;
u_m = sector1.triangle[loop_m].vertex[2].u;
v_m = sector1.triangle[loop_m].vertex[2].v;
glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m);
glEnd();
}
return TRUE;
}


A je to ! Ako sami vidíte, je to veľmi jednoduché. Je to ako keď kreslíte kocku, akurát, teraz ich vykreslíte trochu viac a usporiadate ich tak, aby tvorili nejakú miestnosť alebo chodbu.

Kúsok nižšie je screenshot, ako vyzerá výstup nášho programu, zvyčajne obrázky nepridávam, ale tento krát hej, lebo Vám chcem ukázať, ako vyzerá mip-maping. Všimnite si, ako v rôznej vzdialenosti od kamery sú textúry zahladené, a pri spustení programu si tiež všimnite ako sa tieto hranice posúvajú pri pohybe kamery.

Zdroják ako vždy nájdete tu:
http://www.softsklad.host.sk/opengl/lesson10.zip


Obr�zok - Klikni a zv�?�� sa
Najnovsie clanky od tohto redaktora
Podobne clanky