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, časť 9
RenameR
SkinMagic
WinSocket Communication via VC++
Údajové štruktúry
viac...
Zábava [5 clankov]
Zdravie [15 clankov]
Celkovy pocet clankov: 407
Opengl – Cloth Simulation 
Výuka | Dna 4.8.2003 | Johny | 4 znamky, priemer 2.00 | 7619 videni | 1125 WAP videni

..reč bude o fyzikálnych zákonoch a o ich počítačovom simulovaní. V tejto časti to bude o simulovaní šiat pomocou pružín (Springs). Nie je to najrealistickejší spôsob, ale pre potreby hier alebo bežných opengl programov to úplne stačí. Ako príklad simulovania bude použitá vlajka, ktorá sa bude pohybovať pod vplyvom vetra...

V prvom rade by som sa chcel poďakovať ľuďom, ktorí mi pomohli trochu sa ponoriť do tajov fyzikálnych zákonov a ich použitiu. Ako prvý asi môj fyzikár Mr. Denby. ;o), ďalej Erkin Tunca za jeho tutorialy a ťiež gamasutra.com za niektoré texty a obrázky. Použité zdrojáky sú napoly moje, napoly som ako základ použil zdrojáky Erkina Tuncu, ktoré sa mi zdali ako najviac prehľadné a výstižné. Preto som nechal jeho komentáre v celom súbore physics.h.

Takže najprv taký mierny filozofický úvod
Všetky veci okolo nás, príroda a prostredie funguje podľa fyzikálnych zákonov. Takmer všetko má vplyv na svoje okolie, každý jemný vánok alebo padnutie listu zo stromu. Všetko to simulovať je takmer nemožné, aspoň zatiaľ. ;o). Takže my len dúfajme, že naša vlajka raz nebude použitá v nejakom matrixe, lebo by ho hneď každý odhalil ;o). Väčšina prírodnych zákonov funguje spojite. Len málo veci je nespojitých. Keď sa pohýňate z vašim autom, tak naberáte rýchlosť postupne, keď brzdíte, tak brzdíte postupne. Aj keď sa vám zdá, že ste dupli na brzdu, tak auto nezastane zrazu. Predstavte si, že by sa vaše auto nehýbalo spojite a vy by ste v jednom čase boli na mieste A a v druhom čase na mieste B. A čo medzi tým, kde by ste boli ? Hlavným rozdielom je, že počítač nemôže simulovať nekonečne krátky okamih. Ale proste sa presunie do druhého času a povie, že vaše auto je v mieste B.

Trochu fyziky
Pre popísanie bodu, polohy alebo smeru budeme používať 3 rozmerné vektory. 3 rozmerný vektor je čosi ako pole s 3 zložkami, x,y a z. Každý obsahuje jeden údaj pre danú súradnicu. Teraz trochu teórie. Hmotný bod sa pohybuje po nejakej dráhe, opísanej funkciou, ktorá má len jeden parameter a to čas. Výsledok funkcie je poloha v 3d priestore. Deriváciou tejto funkcie dostaneme okamžitú rýchlosť v danom čase a opäť derivácou získame zrýchlenie.
pos/dt=t t/dt=a f=a.m f=-k.x

Deriváciami a ani teóriou sa veľmi zaoberať nemusíte, stačí vám vedieť, že ak sa nejaký bod pohybuje rýchlosťou v, tak za čas dt prejde v.dt. Ďalej treba vedieť, že ak na teleso pôsobí stála sila, tak teleso bude zrýchľovať. Vzorec f=a.m je vzťah medzi silou, zrýchlením a hmotnosťou telesa. A posledný vzťah f=-k.x hovorí o sile ktorou pôsobí pružina, keď je natiahnutá na veľkosť x.

Trieda CMass reprezentuje hmotný bod, ktorý ma nejakú hmotnosť, rýchlosť a na ktorý môžu pôsobiť nejaké sily.
Trieda CSpring je pružina, ktorá má nejakú veľkosť a spája 2 body
Trieda CSimulation je základná trieda pre akúkoľvek simuláciu, od nej je odovedená CClothSimulation, ktorá obsahuje niekoľko hmotných bodov a pružín, ktoré ju spájajú.

Celá simulácia prebieha v niekoľkých krokoch. Najprv sa vynulujú všetky sily, ktoré na hmotné body pôsobia. Aplikujú sa všetky sily, ktoré pôsobia na hmotné body a nakoniec sa vypočítajú nové rýchlosti a pozícia hmotných bodov za čas dt. Keď som toto pochopil, tak mi už všetko bolo ďalej jasné.

Triedy Vector3D popisovať nejdem, lebo jej operácie sú hádam každému zrejmé, ide o spočítanie, odčítanie vektorov, násobenie a delenie číslom, alebo vypočítanie vektoru kolmého na oba vektory.


void CMass::applyForce(CVector3D m_force)
{
this->m_force += m_force;
}

void CMass::Init()
{
m_force.m_x = 0;
m_force.m_y = 0;
m_force.m_z = 0;
}

void CMass::simulate(float dt)
{
m_vel += (m_force / m_m) * dt;
m_pos += m_vel * dt;
}

applyForce jednoducho pripočíta nejakú silu k silám, ktoré už pôsobia na hmotný bod. Init vynuluje všetky sily a simulate vypočíta novú rýchlosť pre hmotný bod a potom aj novú pozíciu. Pripomínam, že všetky sily, rýchlosti a pozície sú vektory. Sila, ktorá pôsobí sa ešte predelí hmotnosťou, inak by rovnakú rýchlosť získalo auto aj Boeing 747, keď sa o ne oprete. No a za časový okamih dt sa pohne bod o rýchlosť*dt.
Označenia: m_vel je od velocity=rýchlosť, m_pos position=poloha, m_force=sila, m_m mass=hmotnsť, dt=časový okamih, v ideálnom prípade by mal byť nekonečne malý. Pružina pôsobí len keď je napnutá, takže keď spojíte dve pružiny vodorovne alebo zvislo, tak je to to isté. Systém sa bude snažiť nájsť stav, keď sú produkované najmenšie sily. Simuláciu, ktorú sami nenapíšete Váš program simulovať nikdy nebude. Kombinovaním pružín však môžete kľudne spraviť aj 3D objekty. Pozor aj na dĺžku pružín. Napríklad medzi 4 bodmi môže byť 6 pružín, a tie 2 priečne by mohli byť dlhšie, ľahšie sa to ustáli ako štvorec.

virtual void CSimulation::operate(float dt)
{
init();
solve(dt);
simulate(dt);
}

Toto je hlavná funkcia triedy CSimulation, ukazuje celý proces, najprv vynulovanie síl, aplikovanie síl a simulovania pohybu.

Keď už máme raz urobenú triedy CSpring, tak už máme toho celkom dosť. Pomocou pružín sa dá toho vcelku dosť urobiť. Najjednoduchší prípad je samotná pružina, ale tá asi nikoho nezaujíma. Kúsok zložitejšie je urobiť lano. Pospájate za sebou pár pružín, ktoré vytvoria akési elastické lano. Elasticita závisí od konštanty pružiny. Netreba urobiť nič, len vytvoriť dostatočný počet pružín, ktoré pospájajú hmotné body a potom odsimulovať všetky body a pružiny. A získate celkom realistické lano.

Keď pospájate pružiny do mriežky, ako je tomu aj v tomto článku, tak získate Cloth, teda šaty, napr. sa to dá použiť ako vlajka. Je to síce nedokonalá vlajka, ale na začiatok úplne stačí. Bolo by treba dorobiť detekciu kolízií, aby sa nestávalo, že vlajka prejde sama cez seba. A ťiež, aby bola menej elastická.

Elasticita.
Čím je väčšia elasticita, tým je systém stabilnejší. Asi si poviete, že keď zvýšite pružinovú konštantu, tak získate väčšiu reálnosť. Avšak vaše pružiny, lano alebo vlajka vybuchne. Dôvodom je to, že simulácia prebieha nespojite. A za ten malý časový okamih sa toho stane až príliš veľa. Za malý časový okamih sa vytvorí nesmierna sila, ktorá pohne pružinu až príliš a pružina začne kmitať až to celé vybuchne.
Jedna možnosť je zmenšiť tento časový okamih, ale potom to bude na výpočty náročnejšie a nebude to také efektívne. Možností je viacej. Je ťiež možné odsimulovať jeden krok a potom spraviť kontrolu, či nejaká pružina nepresiahla svoj dovolený rozsah. Ak hej, tak ju upravíme na maximálny možný rozsah. Tým však ovplyvníme celý systém a preto treba tento krok niekoľkokrát zopakovať. A v nádeji, že po n krokoch to skonverguje ku správnej pozícii. Inou možnosťou je simulovať to inak, avšak to nemusí byť vždy ľahké. Všetky metódy neovládam. Pár je ich na tejto adrese:
http://www.ioi.dk/Homepages/thomasj/publications/gdc2001.htm kde je veľa písane o fyzikálnej simulácii (cloth, rigi bodies,...)
http://cedar.intel.com/cgi-bin/ids.dll/content/content.jsp?cntKey=Generic%20Editorial::clothsample&cntType=IDS_EDITORIAL na tejto stránke od intelu je komplet tutorial pre Cloth simulation, písaného veľa nie je, ale ich príklad je dosť obsiahly a niektoré časti sú dosť náročnejšie. Obsahuje aj spomínané testovanie hraníc a ich opravu. Sám som skúšal niečo také urobiť a trochu sa mi to aj darilo.

Na pochopenie zdrojákov vám stačí pochopiť len súbor physics.h, kde som vložil všetko z tutorialov +niečo navyše. Ostatné súbory sú z GLWnd a nie je potreba ich chápať, stačí vedieť použiť ;o). Snažil som sa urobiťnejaký normálny vietor, tak že je to vektor, ktorý sa pripočíta podľa toho, aký je uhol s normálou vlajky. Niekde som to tak videl, ale nie som si istý, či sa mi to podarilo, tak ako som chcel.

nejaké tutorialy môžete nájsť na http://nehe.gamedev.net ako Lekciu 39 a 40 alebo http://gamedev.net kde sú nejaké články.

Zdrojáky + exe : http://www.softsklad.host.sk/opengl/1024cloth.zip
Na záver je tu zopár obrázkov.


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