Pixelgenaue Kollisionserkennung in OpenGL (Split aus: Map in Klasse gibt Zugriffsverletzung aus)



  • So, ich hab jetzt noch ein Problem und schreib das einfach mal in meinen alten Thread ( auch wenn das eigentlich eine Frage für die Grafikprogrammierung wäre ).

    Und zwar bin ich zur Zeit in meinem kleinen Spiel ( 2D ) bei den Kollisionen.
    Mit den Bounding Boxes bin ich schon durch, nun würde ich aber gerne noch bestimmte Objekte mit Pixelperfekter Kollision prüfen.
    Ich hatte dazu diesen tollen Artikel gefunden:
    http://www.virtual-maxim.de/pixelgenaue-kollisionserkennung/
    der eigentlich alles schön beschreibt.
    Nur leider ist dieser Code mit DirectX entwickelt und ich verwende OpenGL und SOIL für meine Texturen.
    Das Problem, die Bitmasken zu prüfen, hätte ich ja nichtmal aber ich schaffs nicht überhaupt die Bitmasken zu erschaffen, weil ich die Texturen iwie nicht auslesen kann.

    Zur Zeit versuch ich das so ( Ausschnitt ):

    ......
    			glBindTexture( GL_TEXTURE_2D, iTexture );
    
    			glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH,  &iWidth  );
    			glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &iHeight );
    
    			pgluPixels = new GLubyte[ iWidth * iHeight * 4 ];
    
    			glBindTexture( GL_TEXTURE_2D, iTexture );
    
    			glReadPixels( 0, 0, iWidth, iHeight, GL_RGBA, GL_UNSIGNED_BYTE, pgluPixels );
    
    ......
    

    ( Der Code ist zusammengebaut aus dem was ich so im internet gefunden habe )
    Allerdings sind iWidth und iHeight immer auf 0 auch wenn ich die Textur auf ein Quad der Größe 100*100 rendere.
    Wie kann ich also jetzt die Texturen auslesen und Bitmasken davon anlegen, sodass es auch funktioniert?
    Und ja ich weiss, dass pixelperfekt Kollision langsam ist, aber schon allein damit ichs weiss, wüsste ichs gerne 😃

    Danke schonmal
    MfG Pandoril

    PS: Sollte ich eigentlich oben beim ersten Beitrag den ganzen Code rauslöschen? Ich finde der stört etwas.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Pandoril schrieb:

    So, ich hab jetzt noch ein Problem und schreib das einfach mal in meinen alten Thread ( auch wenn das eigentlich eine Frage für die Grafikprogrammierung wäre ).

    Warum? Das ist eine schreckliche Idee!
    -Du verschwendest vieler Leute Zeit, die sich erst den ganzen alten Thread (und der ist ganz schön lang!) durchlesen um dann am Ende festzustellen, dass mittendrin das Thema vollkommen wechselt.
    -Die Frage hat nichts mit C++ zu tun, die typische Leserschaft des Forums kann dir nicht helfen.
    -Die Überschrift ist total missführend, da zum alten Thread gehörig.
    -Du weißt es doch selber besser! Wieso machst du es trotzdem? 😕


  • Mod

    SeppJ schrieb:

    -Du weißt es doch selber besser! Wieso machst du es trotzdem? 😕

    ich denke, manche leute haben eine scheu/schuechternheit mit einem neuen thread einen teil des subforums fuer sich einzunehmen.

    aber erst sein 4. post, er wird bestimmt mutiger beim naechsten mal 🙂

    @Pandoril
    wie laedst du denn die texturen?



  • Hi,

    erstmal danke für die Hinweise Sepp ich werd das das nächste Mal beachten 🙂
    rapso hat allerdings Recht ich wollte nicht unbedingt in ein neues Subforum schreiben weil ichs von den wenigen Foren ( außer hier ), in denen ich noch unterwegs bin, so kenne, das man seinen alten Thread lieber lässt und nix neues aufmacht 🙄 Wie gesagt fürs nächste mal weiss ichs ja jetzt

    Also wegen den Texturen: die werden mit SOIL in einer eigenen Klasse geladen.
    Ich geb hier nur mal das nötigste weiter:

    bool TextureLoader::LoadTexture( const char* szFilePath, int iIndex ){
    
    	iTexture[iIndex] = SOIL_load_OGL_texture( szFilePath, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y );
    
    	if( iTexture[iIndex] == 0 ){
    
    		return false;
    	}
    
    	glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    	glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
    	return true;
    }
    

    So, das ist eigentlihc schon alles. Mit den Texturen funktioniert so auch alles, ich geb die Textur dan später im Programm ( nach dem Laden 😉 ) per Get-Funktion an meine Objekte im Spiel weiter und die werden dann auch soweit angezeigt.
    Falls es noch irgendwelche Fragen gibt, einfach fragen :p

    MfG
    Pandoril


  • Mod

    die lib kenn ich nicht, ich haette sonst vorgeschlagen dass du direkt beim laden dir die daten abspeicherst, aber keine ahnung wie das mit SOIL geht.

    versuch mal http://www.opengl.org/sdk/docs/man/xhtml/glGetTexImage.xml



  • Danke für den Hinweis rapso 🙂
    Ich hab das schonmal glGetTexImage statt glReadPixels probiert allerdings klappt das auch nicht da er ja die Höhe und Breite nichtmal richtig ausliest sondern auf 0 lässt. Kannst du mir vielleicht ein Library empfehlen mit der ich die Daten direkt auslesen kann?



  • Verwend einfach SOIL_load_image(), um direkt an die Bilddaten zu gelangen und pack diese dann selbst in eine OpenGL Texture... 😉



  • Man könnte die pixelgenaue Kollisionerkennung auch von der GPU erledigen lassen. Man könnte z. B. zwei Kollisions-Render-Targets haben die beim zeichnen eines jeden Objektes jeweils im Ping-Pong Verfahren gewechselt. Beim Rastern eines Fragmentes könnte man im Kollisonsbuffer nachsehen, ob dort schon etwas liegt und auch was – Dadurch könnte man auch Rotationen und Skalierung unterstützen und dort immer noch pixelgenaue Kollisionen machen

    Evtl. macht es auch Sinn alle Pixel, die geschrieben wurden mit ihrer Objekt ID in einem Output Buffer zu sammeln – und über ein Reduce verfahren Pixel zu suchen die Mehrfach belegt sind


Anmelden zum Antworten