Jak vyzrát na gravitaci - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



C/C++

Jak vyzrát na gravitaci

6. září 2001, 00.00 | Často potřebujeme simulovat, něco tak samozřejmého jako je gravitace. V
tomto článku se dozvíte o různých případech, kde se gravitace používá a
jak tyto případy zapsat do programu, takže ty případy použití..

Často potřebujeme simulovat, něco tak samozřejmého jako je gravitace. V tomto článku se dozvíte o různých případech, kde se gravitace používá a jak tyto případy zapsat do programu, takže ty případy použití..

V plošinovce

Snad všechny plošinovky jsou založeny na skocích a pádech, gravitace zde působý vždy přesně dolů, a tak je způsob její reprezentace triviálně jednoduchý. Např. postavičku jež hráč ovládá (dále jen panák), která se pohybuje a na kterou působí gravitace, je reprezentována souřadnicemi x a y, jeho pohyb je reprezentován vektorem zase vyjádřeným souřadnicemi nyní sx a sy.

Každý program běží v určité‚ smyčce a každým průběhem této smyčky se souřadnice panáka zvětší o vektor pohybu, samozřejmě pokud mu nebrání v pohybu nějaká překážka.

x=x+sx;
y=y+sy;
sy=sy+GRAVITY;

a zde je ta slíbená gravitace, tento řádek zvětší rychlost dolů o gravitační zrychlení (konstantu GRAVITY v rozměrech nejspíše FPS/pixel), čím je tato hodnota větší, tím je pád rychlejší a naopak. Pokud ovšem preferujete paranormální jevy nastavte GRAVITY menší nule, pak se panák rozplácne hlavou o strop, pokud nastavíte GRAVITY na 0, potom se gravitace neuplatní a platí beztížný stav. Takto vypadá:

k doplnění uvedu ještě tyto řádky, které zajišťují odpor vzduchu, bez nich se bude panákův pád pořád zrychlovat, ale takto se brzy pád ustálý. Konstanta ODPOR ovšem musí být v rozsahu 0..1. 

sx=sx*ODPOR;
sy=sy*ODPOR;

Gravitaci ovšem nebudete v plošinovce aplikovat pouze na panáka, ale i na všechny další objekty, které mohou podléhat pádu.

V simulaci vesmíru


Složitější situace nastává, pokud gravitace vychází z několika hmotných bodů, které‚ se ovlivňují (body jsou zadány souřadnicemi x,y a hmotností). Musíme tedy něčím začít nejlépe rovnicí gravitace

- gravitační konstanta = 6.67.10-11 N.m2.kg-2
m1,m2 - hmotnosti dvou těles
r - vzdálenost mezi dvěma tělesy
Rovnici pro výpočet vzájemné síly máme, takže Pythagorovou větou vypočítáme vzdálenost a dosazením do rovnice získáme sílu, kterou podle F = ma -> a = F/m  vydělíme hmotností objektu a získáme zrychlení, které potom rozdělíme na složky ax,ay podle rozdílů souřadnic objektů (viz obr.).

Dále přičteme ax,ay k sx,sy a máme výsledný vektor pohybu, a takhle bude vypadat konstrukce v Céčku:

#define GRAVITY 0.1

class C_castice
{
    public:
    double x,y,sx,sy,hmotnost;
    void gravity(C_castice *dalsi);
};

void C_castice::gravity(C_castice *dalsi)
{
double vzd,rx,ry,F,ax,ay;
rx=(dalsi->x-x);
ry=(dalsi->y-y);
vzd=sqrt((rx*rx)+(ry*ry));             // vypocet vzdalenosti
F=(hmotnost*dalsi->hmotnost*GRAVITY)/(vzd*vzd*2);
                                                       // vypocet sily pousobici na teleso
if (vzd>0){                                      // nutna podminka aby nedoslo k deleni 0   
    ax=(F/(vzd*hmotnost))*(rx);   // timto zvetsenim rx o F/(vzd*hmotnost) 
                                                       // vypoceteme ax tedy zrychleni v ose x
    ay=(F/(vzd*hmotnost))*(ry);   // totez pro y
    sx=sx+ax;                                 // zde zvetsime vektor rychlosti o zrychleni
    sy=sy+ay;
}
}

Pokud nesimulujeme pouze 2D, ale v 3D program se v některých částech trochu změní, ale v zásadě bude skoro stejný, můžete se přesvědčit (změny jsou označeny silně):

#define GRAVITY 0.1

class C_castice
{
    public:
    double x,y,z,sx,sy,sz,hmotnost;
    void gravity(C_castice *dalsi);
};

void C_castice::gravity(C_castice *dalsi)
{
double vzd,rx,ry,rz,F,ax,ay,az;
rx=(dalsi->x-x);
ry=(dalsi->y-y);
rz=(dalsi->z-z);
vzd=sqrt((rx*rx)+(ry*ry)+(rz*rz));                        // zmeni se vypocet vzdalenosti
F=(hmotnost*dalsi->hmotnost*GRAVITY)/(vzd*vzd*2);
if (vzd>0){
    ax=(F/(vzd*hmotnost))*(rx);
    ay=(F/(vzd*hmotnost))*(ry);
    az=(F/(vzd*hmotnost))*(rz);
    sx=sx+ax;
    sy=sy+ay;
    sz=sz+az;
}
}

Metoda gravity propočítává důsledky gravitace k objektu dalsi na svůj objekt. Pokud budete provádět simulaci v programu je třeba, aby všechny objekty působily na všechny hmotné objekty. Tyto kusy zdrojového kódu jsou spíše ilustrativní a pro použití je doporučuji dále optimalizovat a upravit pro daný příklad. Pokud neděláte zrovna vědeckou simulaci, ale zábavnou hru doporučuji třeba s rovnicí gravitace trochu za experimentovat, například nedělit vzd2, ale pouze vzd, gravitace tak bude dosahovat dále a nárůst její síly následkem přibližování bude rovnoměrnější (lineární). Na závěr přeji hodně štěstí všem, kdož spojují fyziku s programováním.

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: