Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 16:52

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Jul 15, 2006 17:09 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Ich habe eine kleine 3D Szene und möchte dazu einen Graphen zeichnen lassen. Da ich keinen Platz für ein Bitmap-Control habe, möchte ich den Graphen über die 3D Szene legen, aber komplett 2D, irgendwo in einer Ecke. Geht das überhaupt? Also 3D und 2D gleichzeitig? Gibts irgendwo ein simples Tutorial? Im Prinzip brauche ich sicher nur simple Befehle wie LineTo oder SetPixel oder so. Danke für Eure Hilfe!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 15, 2006 17:14 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
schau dir mal dieses tutorial an.Im wesentlichen brauchst du den Befehl glOrtho um die Projektionsmatrix auf eine zweidimensionale Projektion zu setzen. Dort kannst du dann ganz normal rendern


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 15, 2006 17:29 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
OK, danke. Leider hab ichs nicht so mit den Matrix-Modi. Mein Programm zeigt bereits die 3D Szene an. Die Initialisierung läuft in Init-Prozeduren ab, das Zeichnen in einer Extra-Procedure. Wie füge ich nun dieser Procedure meinen Ortho-Modus an? Skizze:

Code:
  1. [DrawScene]
  2. glTranslate...
  3. glBegin()...glEnd()
  4. ...
  5. glOrto()
  6. ...


glOrtho muss ich irgendwo ja auch wieder beenden oder? Denn im Moment zeigt er mir nichtmal mehr die 3D Szene an, wenn ich das komplette
Code:
  1.  
  2.     glMatrixMode(GL_PROJECTION);
  3.     glLoadIdentity;
  4.     glViewport(0,0,m_originalRect.Width(),m_originalRect.Height());
  5.     glOrtho(0,640,0,480, 0,128);


einfüge. Das muss ich sicher nicht nochmal machen oder? In meinen Init-Prozeduren wird ja schon Viewport etc gesetzt. Danke für weitere Hilfe!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 15, 2006 17:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Genau so wie du in den Orthomodus schaltest kannst du auch wieder in den Perspektivenmodus zurückschalten:

Code:
  1. //in den Perspektivenmodus schalten
  2. glMatrixMode(GL_PROJECTION);
  3. glLoadIdentity;
  4. gluPerspective(...)
  5. //erneut die Modelviewmatrix "aktivieren"
  6. glMatrixMode(GL_MODELVIEW);
  7. glLoadIdentity;
  8.  
  9. //3D Szene zeichnen
  10.  
  11. //in den 2D-Modus schalten
  12. glMatrixMode(GL_PROJECTION);
  13. glLoadIdentity;  
  14. glOrtho(0,640,0,480, 0,128);
  15. //erneut die Modelviewmatrix "aktivieren"
  16. glMatrixMode(GL_MODELVIEW);
  17. glLoadIdentity;
  18.  
  19. //2D Szene zeichnen


Du kannst beliebig oft umschalten. Benötigst du die alte Perspektiven- und Modelviewmatrix nach Verlassen des 2D-Modus erneut so kannst du auch mit glPushMatrix und glPopMatrix arbeiten.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 16, 2006 11:18 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Es funktioniert leider nicht so einfach. Zuerst einmal, es handelt sich bei mir um C++ Code, am besten poste ich mal alles OpenGL-nötige. Vielleicht muss ich meinen 2D Aufruf woanders starten. Ich habe alles in der Klasse COpenGLCtrl stehen:

Code:
  1. // called upon WM_CREATE
  2. int COpenGLCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
  3. {
  4.         if (CWnd::OnCreate(lpCreateStruct) == -1)
  5.         return -1;
  6.  
  7.         oglInitialize();
  8.  
  9.         return 0;
  10. }


Code:
  1. // called upon WM_DRAW
  2. void COpenGLCtrl::OnDraw(CDC *pDC)
  3. {
  4.     glLoadIdentity();
  5.     glTranslatef(0.0f, 0.0f, -m_fZoom);
  6.     glTranslatef(m_fPosX, m_fPosY, 0.0f);
  7.     glRotatef(m_fRotX, 1.0f, 0.0f, 0.0f);
  8.     glRotatef(m_fRotY, 0.0f, 1.0f, 0.0f);
  9. }


Code:
  1. // called upon WM_PAINT
  2. void COpenGLCtrl::OnPaint()
  3. {
  4.         CPaintDC dc(this); // device context for painting
  5.         ValidateRect(NULL);
  6. }


Code:
  1. // Timer Event
  2. void COpenGLCtrl::OnTimer(UINT nIDEvent)
  3. {
  4.     switch (nIDEvent)
  5.     {
  6.     case 1:
  7.         {
  8.             // Clear color and depth buffer bits
  9.             glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  10.        
  11.             // Draw OpenGL scene
  12.                         DrawMesh();
  13.                         SwapBuffers(hdc);
  14.            
  15.             break;
  16.         }
  17.  
  18.         default:
  19.             break;
  20.     }
  21.  
  22.     CWnd::OnTimer(nIDEvent);
  23. }
  24.  


Code:
  1.  
  2. // Create OpenGL
  3. void COpenGLCtrl::oglCreate(CRect rect, CWnd *parent)
  4. {
  5.     CString className = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_OWNDC, NULL,
  6.       (HBRUSH)GetStockObject(BLACK_BRUSH), NULL);
  7.  
  8.     CreateEx(0, className, "OpenGL", WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS, rect, parent, 0);
  9.  
  10.     // Set initial variables' values
  11.     m_oldWindow    = rect;
  12.     m_originalRect = rect;
  13.  
  14.     hWnd = parent;
  15. }


Code:
  1. // OpenGL Init
  2. void COpenGLCtrl::oglInitialize(void)
  3. {
  4.     // set camera for draw mode 1 (Mesh)
  5.     [setting up some camera positions and movements]
  6.  
  7.     static PIXELFORMATDESCRIPTOR pfd =
  8.     {
  9.         sizeof(PIXELFORMATDESCRIPTOR),
  10.         1,
  11.         PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
  12.         PFD_TYPE_RGBA,
  13.         32, // bit depth
  14.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  15.         16, // z-buffer depth
  16.         0, 0, 0, 0, 0, 0, 0,
  17.     };
  18.  
  19.     // Get device context only once.
  20.     hdc = GetDC()->m_hDC;
  21.  
  22.     // Pixel format.
  23.     m_nPixelFormat = ChoosePixelFormat(hdc, &pfd);
  24.     SetPixelFormat(hdc, m_nPixelFormat, &pfd);
  25.  
  26.     // Create the OpenGL Rendering Context.
  27.     hrc = wglCreateContext(hdc);
  28.     wglMakeCurrent(hdc, hrc);
  29.  
  30.     // Basic Setup:
  31.     //
  32.     // Set color to use when clearing the background.
  33.     glClearColor(0.6f, 0.6f, 0.6f, 1.0f);
  34.     glClearDepth(1.0f);
  35.  
  36.     // Turn on backface culling
  37.     glFrontFace(GL_CCW);
  38.     glCullFace(GL_BACK);
  39.    
  40.     // Turn on depth testing
  41.     glEnable(GL_DEPTH_TEST);
  42.     glDepthFunc(GL_LEQUAL);
  43.  
  44.     // Send draw request
  45.     OnDraw(NULL);
  46. }


Code:
  1. // wird von aussen aufgerufen wenn die Fenstergrösse verändert wird, oder WM_PAINT
  2. void COpenGLCtrl::oglAdjustViewport(int x, int y, int w, int h)
  3. {
  4.     // Map the OpenGL coordinates.
  5.     glViewport(0, 0, w, h);
  6.  
  7.     // Projection view
  8.     glMatrixMode(GL_PROJECTION);
  9.  
  10.     glLoadIdentity();
  11.  
  12.     // Set our current view perspective
  13.     gluPerspective(45.0f, (float)w / (float)h, 0.001f, 2000.0f);
  14.  
  15.     // Model view
  16.     glMatrixMode(GL_MODELVIEW);
  17. }


Code:
  1. // ++++++++++++ hier soll die 2D neben die 3D Szene rein ++++++++++++
  2. void COpenGLCtrl::DrawMesh()
  3. {
  4.     glPushMatrix();
  5.     glRotatef(0.0,0.0,0.0,0.0);
  6.     glTranslatef(0.0f,0.0f,0.0f);
  7.  
  8.     int x,y;
  9.     double scale=0.05;
  10.  
  11.     InitVisibleArray();
  12.     CombineMesh();
  13.     CloseGaps();
  14.  
  15.     GLfloat xOffset = XCHIPSIZE/2;
  16.     GLfloat yOffset = YCHIPSIZE/2;
  17.     glTranslatef(-xOffset*scale,-yOffset*scale,0.0);
  18.  
  19.         [zeichne 3D Szene...]
  20.  
  21.     glPopMatrix();
  22.  
  23.     //in den 2D-Modus schalten
  24.     glMatrixMode(GL_PROJECTION);
  25.     glLoadIdentity;
  26.     glOrtho(0,640,0,480, 0,128);
  27.     //erneut die Modelviewmatrix "aktivieren"
  28.     glMatrixMode(GL_MODELVIEW);
  29.     glLoadIdentity;
  30.  
  31.     glPushMatrix();
  32.  
  33.     glBegin(GL_LINE);
  34.         glVertex2f(10.0,10.0);
  35.         glVertex2f(30.0,70.0);
  36.     glEnd();
  37.  
  38.     glPopMatrix();
  39.  
  40.     //in den Perspektivenmodus schalten
  41.     glMatrixMode(GL_PROJECTION);
  42.     glLoadIdentity;
  43.     gluPerspective(45.0f, 640 / 480, 0.001f, 2000.0f);
  44.     //erneut die Modelviewmatrix "aktivieren"
  45.     glMatrixMode(GL_MODELVIEW);
  46.     glLoadIdentity; ->>>>>>>>>>>>>>>>>>>>>> klappt irgendwie nicht, 3D Szene wird gar nicht mehr angezeigt
  47.  
  48. }


Sorry für den vielen C++ Code, aber ob C++ oder Delphi, es sollte ähnlich sein. Danke für weitere Hilfe!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 16, 2006 13:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Mit glLoadIdentity setzt du die aktuelle Matrix wieder auf die Identitätsmatrix zurück. Damit geht dir quasi deine "Kameraausrichtung" verloren, die du ja in OnDraw setzt. Du kannst OnDraw getrost in jedem Renderdurchlauf aufrufen, denn der Geschwindigkeitsverlust ist vernachlässigbar klein.
Ruf' einfach mal OnDraw nach dem glClear in deiner OnTimer-Funktion auf und probier ob es dann geht.
Außerdem kannst du dir eine Menge der glPushMatrix und glPopMatrix-Aufrufe sparen, da sie teilweise unnötig sind.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 16, 2006 13:52 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Hmmm seltsamer wirds, aber vielleicht kommt man so auf die Lösung. Ich habs jetzt mal etwas minimiert und einfach mal nur die Matrizen gewechselt. Das klappt alles. Dann habe dieses hier gemacht:

Code:
  1. // in den 2D-Modus schalten
  2.     glMatrixMode(GL_PROJECTION);
  3.     glLoadIdentity;
  4.     //glOrtho(0,640,0,480, 0,128);
  5.     glMatrixMode(GL_MODELVIEW);
  6.     glLoadIdentity;
  7.  
  8.     glBegin(GL_QUADS);
  9.         glColor3f(1.0,0.0,0.0);
  10.         glVertex2f(0.0,0.0);
  11.         glVertex2f(0.0,1.0);
  12.         glVertex2f(1.0,1.0);
  13.         glVertex2f(1.0,0.0);
  14.         glColor3f(1.0,1.0,1.0);
  15.     glEnd();
  16.  
  17.     // zurück in den 3D Modus
  18.     glMatrixMode(GL_PROJECTION);
  19.     glLoadIdentity;
  20.     gluPerspective(45.0f, (float)m_intWidth / (float)m_intHeight, 0.001f, 2000.0f);
  21.     glMatrixMode(GL_MODELVIEW);
  22.     glLoadIdentity;


Ich habe glOrtho mal nicht ausgeführt und am Ende trotzdem gluPerspective neu gesetzt. Was passiert? Er zeichnet ein rotes 3D-Viereck, das man sehr kurz sieht, dann verschwindet es, als wenn sich die Kamera wegbewegt. Kommentiere ich gluPerspective aus, bleibt das rote Viereck stehen. Also stimmt etwas mit meinem gluPerspective nicht. Nur was? Es sieht genauso aus wie mein erster Aufruf in AdjustViewport weiter oben. Addiert sich da was auf mit mehrmaligem Aufruf?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 16, 2006 14:08 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Hmmmmm nun läufts... da fehlten Klammern um die LoadIdentities :D Aber wieso bringt der Compiler da nicht einfach einen Error... macht er doch sonst auch, wenn Klammern fehlen tztztz. Naja jetzt klappts, danke :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


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
[ Time : 0.025s | 17 Queries | GZIP : On ]