» »

[C++/OpenGL] Collision detection

[C++/OpenGL] Collision detection

matej94 ::

Zanima me kako najlažje preverjat oz ugotavljat trke, govrim za pravoktonike.
Ima trenutno x,y koordinate.
xxxxxxxx
xaaaaaax
xaaaaaax
xaaaaaax
xaaxxaax
xaaaaaax
xaaaaaax
xxxxxxxx
Tako zgleda objekt ki prevejram collisiona in kaj naj prevejam ..
OpenGL in c++ govorim :D
  • spremenil: Mavrik ()

davco ::

Googlaj pod aabb ali obb(če se bodo pravokotniki tudi obračali) collision detection

matej94 ::

Zanima me če je tole ok preverjanje na ta stil:

http://www.gamedev.net/page/resources/_...

// Full object-to-object pixel-level collision detector:
short int Sprite_Collide(sprite_ptr object1, sprite_ptr object2) {

        int left1, left2, over_left;
        int right1, right2, over_right;
        int top1, top2, over_top;
        int bottom1, bottom2, over_bottom;
        int over_width, over_height;
        int i, j;
        unsigned char *pixel1, *pixel2;

        left1 = object1->x;
        left2 = object2->x;
        right1 = object1->x + object1->width;
        right2 = object2->x + object2->width;
        top1 = object1->y;
        top2 = object2->y;
        bottom1 = object1->y + object1->height;
        bottom2 = object2->y + object2->height;


        // Trivial rejections:
        if (bottom1 < top2) return(0);
        if (top1 > bottom2) return(0);
  
        if (right1 < left2) return(0);
        if (left1 > right2) return(0);


        // Ok, compute the rectangle of overlap:
        if (bottom1 > bottom2) over_bottom = bottom2;
        else over_bottom = bottom1;

        if (top1 < top2) over_top = top2;
        else over_top = top1;

        if (right1 > right2) over_right = right2;
        else over_right = right1;

        if (left1 < left2) over_left = left2;
        else over_left = left1;


        // Now compute starting offsets into both objects' bitmaps:
        i = ((over_top - object1\1->y) * object1->width) + over_left;
        pixel1 = object1->frames[object1->curr_frame] + i;

        j = ((over_top - object2->y) * object2->width) + over_left;
        pixel2 = object2->frames[object2->curr_frame] + j;

  
        // Now start scanning the whole rectangle of overlap,
        // checking the corresponding pixel of each object's
        // bitmap to see if they're both non-zero:

        for (i=0; i < over_height; I++) {
                for (j=0; j < over_width; j++) {
                        if (*pixel1 > 0) && (*pixel2 > 0) return(1);
                        pixel1++;
                        pixel2++;
                }
                pixel1 += (object1->width - over_width);
                pixel2 += (object2->width - over_width);
        }


        // Worst case!  We scanned through the whole darn rectangle of overlap
        // and couldn't find a single colliding pixel!

        return(0);

};


Na ta stil bom naredil, se pravi:
the new way:

- update bouding box position
- check for collision
- move if no collision
- if there is a collision
- move the character the opposite way he was essentially moving
- update bounding box position
(prepričan sem da razumete, ker tut jaz in sem zelo v kurcu z angleščino )

Moje pa bo takole v update:
-preverjanje colllisiona
-če je bo v funkcijo collision reagiralo tako kot bom naredil, ostale stvari bodo onemogočene, če je collision, se pravi premikanje, in bo delovalo pod nevarnim območjem ;)
-če pa ni collisiona, pa bo se premikalo tako kot obično
in ponavljal bom tako v ciklu naprje..



PS:Se opravičujem ker to ni v izvirniku ampak, sem pozabil tole dodat.

Zgodovina sprememb…

  • spremenilo: matej94 ()

mikesr ::

da ne bom nove teme odpiral bom kar tu vprašal. Imam kocko in narejen bounding box za preverjanje trkov. Kako pa ponovno izračunam bounding box, če kocko premaknem na drugo pozicijo (glTranslate)?

Vesoljc ::

Pa si kocko dejansko premaknil ali jo le renderas drugje? Imas kocko v local space-u ali world-u?
Abnormal behavior of abnormal brain makes me normal...

Senitel ::

Tega v bistvu nočeš, ker bi moral cel mesh transformirat na roke. ga preletet še enkrat in poiskat nove minimume in maksimune. Translacije bi bile še enostavne (samo popraviš bounding box za vrednosti podane v glTranslate), ko boš pa dal zraven še kakšno rotacijo se pa zakomplicira.
Zato je boljše z glGet vzet world/view matriko, izračunat inverz in transformirat točko, ki jo preverjaš, s tem inverzom.

mikesr ::

vbistvu delam DSL, podatke preberem iz tekstovne datoteke in potem izrišem.. torej vbistvu gre le za en izris in se potem preveri ali je kaka kocka na drugi kocki, itd.

torej po rotaciji, translaciji in izrisu vzamem modelview matriko, izračunam inverz in s tem inverzom transformiram točko in preverim če je v bounding boxu?

Senitel ::

Da. Tako spraviš točko iz "world" v lokalni koordinatni sistem kocke/bounding boxa. Samo pazi kaj imaš dejansko v GL_MODELVIEW. Če imaš notri še "view" pol zadeva ne bo štimala.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Prikaz strani na različni resoluciji-Joomla

Oddelek: Izdelava spletišč
151950 (1678) kr?en
»

Ocena? Kako bi dodal podstrani?

Oddelek: Pomoč in nasveti
6906 (771) shadeX
»

Javascript - izračun razlike v datumih

Oddelek: Programiranje
81928 (1783) kogledom
»

Tabela brez zunanjih robov

Oddelek: Izdelava spletišč
91421 (1232) veteran
»

css in input.button

Oddelek: Izdelava spletišč
111629 (1512) ferjan

Več podobnih tem