2D-Grafiken in einem 3D-Device ausgeben?



  • Also vorweg, ich hab mehrfach das _gesamte_ Internet durchsucht mit allen möglichen Fragestellungen, hab aber nichts dazu gefunden.

    Also mein Problem ist folgendes: Ihr kennt das doch in Spielen, wenn eure Gesundheit, Munition und/oder sonstiges in 2D-Design direkt vor eurer Nase auf dem Bildschirm stehen und ihr trotzdem in wunderschöner 3D-Optik durch die Welt heizt. So, nun meine Frage: Wie kann man so 2D-Sachen ausgeben? Bzw. muss man gleich Koordinaten vor der Kamera berechnen, da dann 4 Vertices anlegen und diese zu nem texturierten Face verbinden oder geht das einfacher?? Weil ich denk nicht dass das so wirklich möglich ist, oder...?!?

    Greetings,
    Chaos



  • OpenGL bietet dir da z.B. glOrtho



  • Entweder man hat schon in der API entsprechnende Blittingfunktionen, zum Beispiel wenn man Direct3D verwendet, die ja als Aufsatz auf DirectDraw gehandhabt wird.
    Da blittet man dann die Surface direkt in den Framebuffer.

    Bei OpenGL gibt es sowas auch (glDraw), ist allerdings ohne zusätzliche Extensions nicht wirklich spaßig.

    Die andere Möglichkeit: Du setzt die Projektionsmatrix so, dass sie die Z-Richtung ignoriert. Nennt man orthogonale Projektionsmatrix. Und dann rendert man einfach die Dreiecke mit den passenden Texturen drauf.
    Hierbei kann es mitunter Probleme geben, wenn wirklich nur ganz konkrete Pixel beschrieben werden sollen und nur diese. Bei schlechten Voraussetzungen (forciertes AntiAliasing) kann hier z.B. unscharfe Schrift entstehen.

    Bei der ersten Methode arbeitest du hingegen immer pixelkorrekt.



  • Oookay.. ich verwende DirectX, also werd ich da mit OpenGl nicht viel... du meinst also als D3D-Funktion sollte ich D3DXMatrixOrthoLH/RH verwenden`? Und das ignoriert einfach die z-Achse.... kann ich mir der Matrix dann einfach ein 3D-Objekt was in der Tiefe keine Koordinaten hat (also eine plane) rendern oder muss ich da schon nen Vertexbuffer für anlegen??

    Greetings,
    Chaos

    EDIT: Hab mich über Orthogonale Projektion inner Wiki informiert, und die Funktion was näher angeschaut, also müsste es doch so sein, dass wenn man eine solche Ortho-Matrix erstellt hat dann direkt die Drehung und die Koordinaten der Kameraposition habe, mit denen ich dann einen Mesh direkt vor der Nase rendern kann?



  • öhm, also erstmal: du hast das _gesamte_ internet durchsucht? Sogar mehrfach? Cool... dann ist das wohl gerade eben erst neu dazugekommen...

    http://www.google.de/search?hl=de&q=direct3d+2d&btnG=Google-Suche&meta=
    http://www.gamedev.net/reference/articles/article1972.asp

    Lass dich nicht davon abschrecken, dass in der Einleitung steht, dass es um ein 2d-spiel geht. Du kannst erst deine 3d-szene rendern, und dann einfach die matrix umstellen und 2d malen übereinander. Das stört sich nicht gegenseitig.

    Komisch, und ich dachte Gamedev.net gibts schon ne weile...
    Also, wenn du 2D-Grafik mit D3D darstellen willst, nimmst du am besten als Flexible Vertex format D3DFVF_XYZRHW | D3DFVF_DIFFUSE und was du noch brauchst. Wichtig ist, dass du als koordinaten d3dfvf_xyzrhw nimmst. Diese werden dann nicht durch die Transforationspipeline geschickt. Du kannst damit also direkt die pixel angeben wo was gemalt werden soll. Du kannst aber auch eine orthogonale projektion setzen, dann kannst du auch noch rotationsmatrix, skalierung usw setzen. Aber das mit dem RHW hab ich immer so gemacht, das wird auch in dem Artikel da oben beschrieben.



  • Hier ein ganzes Tutorial zu Game Displays mit DirectX9

    http://www.directxtutorial.com/Tutorial9/D-GameDisplay/dx9D.aspx

    Gesundheitsbalen, Munition, Radar, das alles halbtransparent, ...
    Da wird einfach alles erklärt.

    Gruß
    Don06



  • Vielen Dank für die schnelle Hilfe 🙂

    Weiß einer wie ich ein Objekt mit Position und Blickrichtung in derselben weiter nach vorne verschiebe?? Ich hab es versucht in dem ich den Blickwinkel minus Position genommen habe, normalisiert, den normalisierten Vektor * 0.1f genommen (damit es nicht so schnell geht) und dann Position plus Direction beide mit dem Vektor addiert. trotzdem geht der _nur_ auf der Z-Achse nach hinten - Was soll das??
    Findet wer den Fehler?

    D3DXVECTOR3 delta;
                delta = bulletdir[i] - bulletpos[i];
                D3DXVec3Normalize(&delta, &delta);
                delta = 0.4f * delta;
                bulletpos[i] += delta;
                bulletdir[i] += delta;
    

    (Okay, es soll halt was mit geschossen sein *räusper*) 😃

    Greetings,
    Chaos



  • wenn man ein Objekt entlang seiner Blickrichtung verschieben möchte, addiert man meistens einen Bruchteil des Blickrichtungsvektors zum Positionsvektor und lässt den Rest gleich.



  • Aber dann dreht sich das Objekt doch irgendwann um 180° und das ist doch nicht das gewünschte Ergebnis oder???

    Greetings,
    Chaos


Anmelden zum Antworten