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ť 10
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 – 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ť 9 
Výuka | Dna 29.5.2002 | Johny | 3 znamky, priemer 2.33 | 6619 videni | 1032 WAP videni

Vitajte pri poslednej časti OpenGL, ktorá ma jednociferné označenie. Ak ste postupne sledovali celý seriál, mali by ste byť schopný už urobiť nejaké to OpenGL okno, vedieť spraviť polygón, vytextúrovať ho, použiť svetlá a blednovanie. V dnešnej časti si ukážeme, ako použiť obrázky na jednoduchý efekt. Trošku animácie, trochu farieb, čierno-biele textúry a ich využitie.

Premenná twinkle a tp sleduje, či bol zapnutý efekt, a či je stlačený kláves T.


BOOL twinkle;
BOOL tp;
V num si budeme pamätať, koľko hviezd je na obrazovke. Necháme to ako konštantu.
Počas behu programu nie je možné meniť počet hviezd. Kto neverí, nech vyskúša. ;o)

const num=50;

Teraz si vytvoríme štruktúru, kde si budeme uchovávať informácie o každej jednej hviezdičke. Farby r,g,b, aby sme vedeli akej farby bude naša hviezda. A nakoniec jej vzdialenosť a uhol od centra 0,0,0. Niečo ako polárny súradnicový systém. Nie som si istý, či sa to volá práve takto. Ale pozícia bodu v takomto priestore je daná uhlom, ktorý zviera priamka a 0,0 a vzdialenosťou od 0,0.
Že by som zabudol napísať ešte jednu 0 na koniec ? Nie, nášmu programu budú stačiť 2 rozmery, hviezdy síce budú v 3D, ale všetky budú v jednej rovine, niečo ako galaxia.


typedef struct
{
int r, g, b;
GLfloat dist;
GLfloat angle;
} stars;
stars star[num];

A vytvoríme si pole star. Ďalej nastavíme pár premenných ako vzdialenosť z ktorej budeme toto všetko pozorovať, textúru, atď.


GLfloat zoom=-15.0f;
GLfloat tilt=90.0f;
GLfloat spin;
GLuint loop;
GLuint texture[1];

Pri nahrávaní textúry sa toho veľa nezmenilo, spravili sme jednu textúru a t je lineárne filtrovaná.


V InitGL zapneme blendovanie a textúry.

int InitGL(GLvoid)
{
if (!LoadGLTextures())
{
return FALSE;
}

glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glEnable(GL_BLEND);


A pre každú hviezdu nastavíme uhol na 0.

for (loop=0; loop<num; loop++)
{
star[loop].angle=0.0f;


Namiesto glColor4f budeme používať glColor4ub, kde ub znamená unsigned byte. Hodnoty od 0 do 255.


star[loop].dist=(float(loop)/num)*5.0f;
star[loop].r=rand()%256;
star[loop].g=rand()%256;
star[loop].b=rand()%256;
}
return TRUE;
}


int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texture[0]);

Pre všetky hviezdy...

for (loop=0; loop<num; loop++)
{
glLoadIdentity();
glTranslatef(0.0f,0.0f,zoom);
glRotatef(tilt,1.0f,0.0f,0.0f);


Nastavíme sa na 0, otočíme sa podľa uhla hviezdy a posunieme do vzdialenosti, kde sa má nachádzať.


glRotatef(star[loop].angle,0.0f,1.0f,0.0f);
glTranslatef(star[loop].dist,0.0f,0.0f);


glRotatef(-star[loop].angle,0.0f,1.0f,0.0f); // Cancel The Current Stars Angle
glRotatef(-tilt,1.0f,0.0f,0.0f); // Cancel The Screen Tilt




if (twinkle)
{
glColor4ub(star[(num-loop)-1].r,star[(num-loop)-1].g,star[(num-loop)-1].b,255);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
}


glRotatef(spin,0.0f,0.0f,1.0f);

glColor4ub(star[loop].r,star[loop].g,star[loop].b,255);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();


Každú hviezdu posúvame smerom ku stredu.

spin+=0.01f;
star[loop].angle+=float(loop)/num;
star[loop].dist-=0.01f;


A ak už ide za 0.0, tak z nej urobíme novú.

if (star[loop].dist<0.0f)
{
star[loop].dist+=5.0f;
star[loop].r=rand()%256;
star[loop].g=rand()%256;
star[loop].b=rand()%256;
}
}
return TRUE;
}


Nakoniec pridáme ovládanie, pre jednotlivé písmenká a je to hotovo.

SwapBuffers(hDC);
if (keys['T'] && !tp)
{
tp=TRUE;
twinkle=!twinkle;
}



if (!keys['T'])
{
tp=FALSE;
}



if (keys[VK_UP])
{
tilt-=0.5f;
}

if (keys[VK_DOWN])
{
tilt+=0.5f;
}

if (keys[VK_PRIOR])
{
zoom-=0.2f;
}

if (keys[VK_NEXT])
{
zoom+=0.2f;
}



if (keys[VK_F1])
{
keys[VK_F1]=FALSE;
KillGLWindow();
fullscreen=!fullscreen;
if (!CreateGLWindow("NeHe's Textures, Lighting & Keyboard Tutorial",640,480,16,fullscreen))
{
return 0;
}
}
}
}

http://www.softsklad.host.sk/opengl/lesson09.zip


Najnovsie clanky od tohto redaktora
Podobne clanky