Aktuelle Zeit: 13.05.2025, 14:28

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: 2D auf 3D zeichnen
BeitragVerfasst: 23.03.2008, 03:13 
Offline

Registriert: 16.05.2007, 21:00
Beiträge: 166
Hi,
Cih bin gerade an einem 2D game und mir wurde wegen ein paar falschen Darstellungen empfohlen die Sachen einfach vor eine 3D Kamera zu zeichnen, nur wie geht das?
Also ich erstelle eine Normale Kamera und dann? Auf was soll ich das Spielfeld zeichen? Auf einen Würfel und das Spielfeld dann als Textur laden?
Aber wie kann ich dann meine Sprites etc. drüber zeichnen?
Oder Sollte ich richtige models machen und das Spielfeld als 3D umgebung bauen und dann einfach mit der Kamera von oben draufschauen?

Schöne Nacht noch
MFG ReduX


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: 2D auf 3D zeichnen
BeitragVerfasst: 23.03.2008, 11:15 
Offline
Moderator

Registriert: 25.02.2007, 14:35
Beiträge: 323
Wohnort: Münster
Du könntest es mit Billboards machen...


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: 2D auf 3D zeichnen
BeitragVerfasst: 23.03.2008, 12:08 
Offline

Registriert: 09.05.2007, 23:24
Beiträge: 20
was denn für falsche darstellungen? wahrscheinlich liegt der fehler eher daran, WIE du die 2d grafik auf den bildschirm bringst.

ansonsten... für 2d mit 3d nutzt man idR eine orthogonale camera. dann kann man einfach zB billboards verwenden und die 2d bilder anzeigen, das sieht dann aus wie "echt" 2d.

3d-objekte und eine orthogonale camera kann aber auch sehr interessant aussehen. da hängt es eben immer davon ab, was für einen look man haben möchte.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: 2D auf 3D zeichnen
BeitragVerfasst: 23.03.2008, 12:11 
Offline
Moderator
Benutzeravatar

Registriert: 15.04.2007, 20:20
Beiträge: 505
Wohnort: Reelsen
Also, mein Code dafür sieht etwa so aus:
GraphicsEngine.cpp, wird aufgerufen, bevor 2D gerendert wird (Ist vllt falsch, hab da kP davon, hab das per experimentieren so geschrieben):
Code:
      // Reset transformation for 2D drawing
      core::matrix4 worldmatrix;
      worldmatrix.setTranslation(core::vector3df(-0.5, -0.5, 0));
      driver->setTransform(video::ETS_WORLD, worldmatrix);
      core::matrix4 viewmatrix;
      viewmatrix.buildProjectionMatrixOrthoLH(1, -1, 1, -1);
         
      driver->setTransform(video::ETS_PROJECTION, viewmatrix);
      driver->setTransform(video::ETS_VIEW, core::matrix4());
      OverlayManager::get()->render();

Overlay.cpp, rendert die 2D-Grafik als zwei Dreiecke, mit Rotation:
Code:
      Vector2D position = getAbsolutePosition();
      Vector2D size = getAbsoluteSize();
      size /= 2;
      Vector2D center = position + size;
      float rotation = getAbsoluteRotation();
      
      core::dimension2d<s32> windowsize = GraphicsEngine::get()->getDriver()->getCurrentRenderTargetSize();
      float aspectratio = (float)windowsize.Width / windowsize.Height;
      // Create data to render
      video::S3DVertex vertices[4];
      Vector2D offset = size;
      offset.y /= aspectratio;
      offset.rotate(rotation);
      offset.y *= aspectratio;
      core::vector3df pos1 = core::vector3df(center.x + offset.x, center.y + offset.y, 0);
      core::vector3df pos3 = core::vector3df(center.x - offset.x, center.y - offset.y, 0);
      offset = size;
      offset.x = -offset.x;
      offset.y /= aspectratio;
      offset.rotate(rotation);
      offset.y *= aspectratio;
      core::vector3df pos2 = core::vector3df(center.x + offset.x, center.y + offset.y, 0);
      core::vector3df pos4 = core::vector3df(center.x - offset.x, center.y - offset.y, 0);
      
      vertices[0]  = video::S3DVertex(pos1, core::vector3df(-1,-1,-1), video::SColor(255, 255, 255, 255), core::vector2df(1, 1));
      vertices[1]  = video::S3DVertex(pos2, core::vector3df(1,-1,-1), video::SColor(255, 255, 255, 255), core::vector2df(0, 1));
      vertices[2]  = video::S3DVertex(pos3, core::vector3df(1, 1,-1), video::SColor(255, 255, 255, 255), core::vector2df(0, 0));
      vertices[3]  = video::S3DVertex(pos4, core::vector3df(-1, 1,-1), video::SColor(255, 255, 255, 255), core::vector2df(1, 0));
      
      u16 indices[6] = {0,1,2, 0,2,3};
      
      // Render colored rectangle
      video::SMaterial material;
      material.Lighting = false;
      material.Wireframe = false;
      material.ZWriteEnable = false;
      material.setTexture(0, GraphicsEngine::get()->getDriver()->getTexture(texture.c_str()));
      material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
      
      GraphicsEngine::get()->getDriver()->setMaterial(material);
      GraphicsEngine::get()->getDriver()->drawIndexedTriangleList(&vertices[0], 4, &indices[0], 2);

Das ist natürlich noch kein bisschen optimiert, alle Berechnungen sollten nur nach einem setPosition() ausgeführt werden, vor allem das Laden der Textur in der Funktion selbst ist eigentlich absolut grausam.
In deinem Fall müsstest du dann halt die UV-Koordinaten entsprechend anpassen (der vector2d bei der Vertex-Definition).


EDIT: Die falsche Darstellung lag an den Texturfiltern, die Irrlicht für 2D nicht unterstützt, siehe anderer Thread.

_________________
Meine Gameengine :)
Bild


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de