Einfache 3D Darstellung in Windwos Forms Anwendung (VisualStudio 2008)



  • GLUT uebernimmt fuer Dich den plattform-abhaengigen Teil von OpenGL, also so Dinge wie das Erzeugen des Fensters und die Message-Loop.
    Wenn Du Deine View in irgendeine Form von Gui einbetten willst macht das wenig Sinn.

    Wenn Du nur ein paar Linien zeichnen willst kannst Du das natuerlich auch mit GDI oder aehnlichen APIs erledigen. Die sind dann allerdings nur 2D ausgelegt sodass Du Rotation und perspektivische Transformation vorher selber erledigen musst.

    Wo kommt Deine Geometrie ueberhaupt her und wie soll die in Deine Software rein?
    Irgendeine Form von "Loader" brauchst Du dafuer vermutlich sowieso; VRML waere dafuer eine moegliche Option.



  • scahu dir mal die tuts vom opengl an http://www.codeworx.org/opengl_tuts.php da gehts schritt für schritt:
    um ein 3D Dreieck darzustellen genügt zb.:
    ist aus dem tutorial, vorher muss legidlich das OPengL interface initalisiert werden ist auch keine hexerei, aber schau dir die tuts an!
    Beispiel:

    glBegin(GL_TRIANGLES); 
      // Es folgen die Koordinaten für mehrere Dreiecke
        glColor3f(0.0f,0.0f,1.0f); // das vordere soll blau werden
        glVertex3f( 0.0f, 1.0f, 0.0f); // oben (vorderes Dreieck)
        glVertex3f(-1.0f,-1.0f, 1.0f); // links (vorderes Dreieck)
        glVertex3f( 1.0f,-1.0f, 1.0f); // rechts (vorderes Dreieck)
    
        glColor3f(1.0f,0.0f,0.0f); // das rechte soll rot werden
        glVertex3f( 0.0f, 1.0f, 0.0f);  // oben (rechtes Dreieck)
        glVertex3f( 1.0f,-1.0f, 1.0f);  // links (rechtes Dreieck)
        glVertex3f( 1.0f,-1.0f, -1.0f); // rechts (rechtes Dreieck)
    
        glColor3f(0.0f,1.0f,0.0f); // das hintere grün
        glVertex3f( 0.0f, 1.0f, 0.0f);  // oben (hinteres Dreieck)
        glVertex3f( 1.0f,-1.0f, -1.0f); // links (hinteres Dreieck)
        glVertex3f(-1.0f,-1.0f, -1.0f); // rechts (hinteres Dreieck)
    
        glColor3f(1.0f,1.0f,0.0f); // und das linke gelb 
        glVertex3f( 0.0f, 1.0f, 0.0f); // oben (linkes Dreieck)
        glVertex3f(-1.0f,-1.0f,-1.0f); // links (linkes Dreieck)
        glVertex3f(-1.0f,-1.0f, 1.0f); // rechts (linkes Dreieck)
    
      glEnd();
    


  • Hallo Punky, hellihjb und Kóyaánasqatsi,

    danke für eure Tips und hilfreichen Links!
    Ich habe es nun geschafft mit OpenGL in einem separaten Fenster 3D Flächenobjekte darzustellen, und um vorgegebene Achsen drehen zu lassen.

    Was mir nun noch fehlt ist:

    - Drehen des Modells mit der Maus:
    Dazu konnte ich in den Tutorials nicht direkt etwas finden.
    Vielleicht war ich aber auch nur zu blöd. 🙂

    - Anzeige des Open GL Modells innerhalb einer Windows Forms Anwendung
    anstatt wie im Moment in einem separaten Fenster.
    Konnte leider nichts dazu finden.

    Vielleicht hätte nochmal jemand Zeit einen Tip zu geben.

    Habe derweil zufällig ein kleines Programm gefunden, dass den ziemlich nahe kommt was ich programmieren will. Leider nicht OpenSource:
    http://www.texture.de/XYFunction/XYFunktion.Zip

    Vielen Dank im Voraus!

    Ciao,
    Andi

    (wenn das Prog einigermaßen funktioniert, lade ich es selbstverständlich gerne irgendwo hoch um evtl. auch anderen mit dem gleichen Problem weiter zu helfen).



  • Hey cool,

    habs jetzt auch geschafft das 3D Modell mit den Pfeiltasten um 2 Achsen drehbar zu machen!
    Ihr werdet euch zwar über solche Mini-Steps kaputt lachen, aber mir machts grade voll Spaß!
    Ging schneller als erwartet.

    Für meine beiden Punkte oben suche ich aber trotzdem noch nach wertvollen Tips.

    Danke,
    Andi



  • Das ist doch schön zu hören. Ich schätze mal, das was du suchst ist das hier.



  • Andyrandy schrieb:

    - Anzeige des Open GL Modells innerhalb einer Windows Forms Anwendung
    anstatt wie im Moment in einem separaten Fenster.
    Konnte leider nichts dazu finden.

    Vielleicht hilft dir das hier weiter: http://www.codeproject.com/KB/openGL/sharpgl.aspx



  • Erzeuge einfach kein neues Fenster sondern benutze das HDC des gewuenschten Gui-Elementes.



  • hellihjb schrieb:

    Erzeuge einfach kein neues Fenster sondern benutze das HDC des gewuenschten Gui-Elementes.

    Hi hellihjb,

    kannst du das bitte nochmal genauer erklären?
    Sorry, habs nicht verstanden.

    Derweil habe ich noch ein Beispiel gefunden, wo Open GL auf einer WIndwos-Forms Anwendung plaziert wird:
    http://www.codeproject.com/KB/miscctrl/OpenGLViewWinForms.aspx
    Leider funktioniert aber das Beispiel von dort bei mir nicht.

    Vermutlich weil ich Vis.Studio2008 benutze, und das Beispiel in einer älteren Version geschrieben wurde.

    Hat vielleicht jemand noch weitere Tips, beispiel oder Tutorials wo das evtl beschrieben ist?

    Danke!

    Ciao,
    Andi





  • Hallo,

    vielen Dank nochmal für alle hilfreichen Tips bisher!

    Für alle die evtl. etwas Ähnliches programmieren wollen:
    Hier das beste und einfachste Tutorial das ich gefunden habe ein 3D Objekt dar zu stellen und mit der Maus zu steuern bzw. zu drehen.
    http://www.zeuscmd.com/tutorials/opengl/13-SolidShapes.php

    Und hier ein Beispiel wie man ein OpenGL "Fenster" auf einer Windows Forms Anwendung plaziert:
    http://www.codeproject.com/KB/miscctrl/OpenGLViewWinForms.aspx

    Ein kleines Problem habe ich aber noch:
    Ich habe jetzt auf dem zweiten Link aufbauend eine Maus Steuerung so wie beim ersten Link eingebaut.
    Das Programm wird auch ohne Probleme compiliert.
    Wenn ich es aber ausführe stürzt es ab mit der Fehlermeldung:
    *
    "Eine nicht behandelte Ausnahme des Typs "System.AccessViolationException" ist in OpenGL_on_a_Windows_Form.exe aufgetreten.
    Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."*

    Könnte mir evtl. noch einmal jemand helfen und einen Blick über mein Projekt werfen?
    Ich habe mein Projekt mal als ZIP hier hoch geladen:
    http://www.materialordner.de/b6ZrvxGx6OlACMk4i2rjBdAttwHMrj8t.html

    Ich freue mich über jeden Tip!

    (nach Abschluss lade ich das Projekt für Leute mit ähnlichen Problemen ins Inet hoch)
    Danke im Voraus!
    Andy



  • Nutze den Debugger und finde heraus, an welcher Stelle das Programm crasht. Damit kannst du den Fehler gut eingrenzen.

    Nichts anderes würde ich mit deinem Code machen, nur habe ich keine Lust, mir den anzusehen und bin außerdem der Meinung, dass du mehr lernst, wenn du es selbst machst 😉



  • Hi,

    natürlich habe ich zuerst hartnäckig versucht den Fehler selbst zu beseitigen.

    Es hat irgendwas mit diesen 3 Glut Funktionen zu tun:
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(mouseMotion);

    Ich habe sie alle auskommentiert und einzeln aktiviert.
    Jede einzelne Funktion genügt bereits um die Fehlermeldung zu verursachen.
    Also scheint irgend ein grundsätzliches Problem vor zu liegen.

    Evtl. rufe ich die Funktionen von der falschen Stelle aus auf?
    Das steht jetzt alles in der .h Datei der Forms Anwendung.
    In meinen bisherigen Konsolen-Anwendungen war das Hauptprogramm File immer das .cpp file. Aber in Win-Forms Anwendungen muss man anscheined im .h file programmieren, da dort auch die ganzen Funktionen z.B. von Buttons etc. hinein geschrieben werden?

    Sorry falls sich manche meiner Fragen für euch lächerlich anhören.
    Habe selbst leider nie richtig C++ gelernt, bin aber motiviert es zu lernen!

    Wäre wiklich cool wenn jemand kurz mein Projekt downloaden und anschaun könnte.
    http://www.materialordner.de/b6ZrvxGx6OlACMk4i2rjBdAttwHMrj8t.html

    Ein Fachmann sieht den Fehler ja evtl. sofort.

    Vielen Dank im Voraus!
    Andy



  • Habs mit zwar angesehen, aber kenn mich da absolut ned aus... sorry...
    Hoffentlich gibt der nächste ne passende Antwort...



  • Hi,

    @ZodX: danke trotzdem!

    Mir ist noch etwas eigefallen:
    Kann es vielleicht sein, dass man die Glut Funktionen
    glutMouseFunc(mouse);
    etc. nur benutzen kann, wenn auch das Fenster mit Glut erstellt wurde?

    Wenn man ein eigenes fenster mi Glut erstellt geht das ja mit
    glutCreateWindow().

    Ich habe aber ja jetz eine WindowsForms Anwendung.
    Geht das dann evtl. nicht?

    Danke!

    Ciao,
    Andy



  • Ja, das könnte sein. Persönlich habe ich noch nie Glut und WinForms gemischt.
    Aber denkbar ist es. Vermutlich erwarten die Glutfunktionen, dass das Fenster auch von Glut erstellt wurde.

    Aber gerade die Maus- und Tastatureingaben kannst du doch auch gut mit WinForms verarbeiten, dafür brauchst du Glut nicht.

    Ich würde, wenn möglich, ganz auf Glut verzichten. Ich kann mir nicht vorstellen, dass sich das mit WinForms verträgt.


Anmelden zum Antworten