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



  • Hallo liebes Forum,

    schon seit vielen Wochen versuche ich mich an folgendem Problem und wäre daher über jeden hilfreichen Tip dankbar.
    Bin Ingenieur, kein Informatiker, daher kein Experte in C++.
    Ich benutze Visual Studio 2008 C++.

    Problemstellung:
    Ich möchte einfache Geometrien in 3D Darstellen.
    Flächen und Vektoren genügen.
    Linien statt Vektoren würde auch reichen.
    Das 3D Objekt möchte ich in einer Windows Forms Anwendung darstellen, und mit der Maus drehen und zoomen können.

    Das Ganze soll möglichst einfach sein.

    Im Prinzip würde mir so etwas genügen:
    line3D(Anfang_x,y,z, Ende_x,y,z)
    plane3D(Punkt1_x,y,z, Punkt2_x,y,z, Punkt3_x,y,z, Punkt4_x,y,z)

    (Ich benutze ansonsten für so etwas in MATLAB die plot3d() Funktion.
    Der Grund warum ich nicht Matlab benutzen will, ist, dass ich eine von Matlab unabhängiges Programm brauche, das auf jeden Rechner läuft.)

    Möglichkeiten (so weit ich weiß):

    1.1. OpenGL
    Manuell in OpenGL programmieren scheint mir sehr kompliziert, was ich so gesehen habe.

    1.2. GLUT
    Wohl etwas einfacher, eber für mich eigentlich auch zu kompliziert.
    Falls ihr mir ratet, dass es das Beste ist, lerne ich es aber auch gerne.
    Habe schon geschafft ganz einfache Sachen dar zu stellen, noch ohne Mausfunktionen.

    2. VRML
    Das 3D Objekt in VRML Datei schreiben.
    Doch wie dann das 3D Objekt anzeigen?
    Im Browser geht das gut, wenn man z.B. dieses Plug-In installiert: CosmoPlayer_VRML-Browser Plug-in
    Aber leider möchte ich die 3D Darstellung in meiner Windows Forms Anwendung integirert haben.

    2.1. VRML-Plug-In in Windows Forms Anwendung integrieren
    Geht das irgendwie?
    Man kann ja mit VisualStudio auch irgendwie Brwoser Anwendungen erstellen (noch nie gemacht).

    2.2. Selbst programmierten VRML-Viewer ins Programm einbauen
    Das wäre sehr cool.
    Ich habe dazu z.B. das hier gefunden:
    http://www.codeproject.com/KB/openGL/wrl_viewer.aspx?fid=143&fr=1#xx0xx
    Das sieht recht gut aus, aber es kann nicht alle VRML Datein öffnen. Evtl. nur Punktewolken?
    habe aus CAD programmen exportierte VRML Modelle versucht zu öffnen und es ging nicht.

    Hier noch ein Beispiel was zuerst vielversprechend aussah:
    http://www.3dsource.de/deutsch/vrml.htm
    Auch dieses Beispiel kann nicht alle VRML Files von mir lesen.

    3. Ganz anders??

    Bitte gebt mir einen Tip!

    Vielen Dank im Voraus!

    Ciao,
    Andi



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ 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.



  • was vielleicht geht und nicht allzu kompliziert ist, ist folgendes:

    Du integrierst einfach das Webbrowser-Control von Windows Forms in deinen dialog. Allerdings ist dann (meines Wissens nach) nur der Internet-Explorer und sonst kein Browser möglich. Wenn du in dem dann das VRML.Plugin integriert hast, kannst du du in deiner Anwendung unter nutzung des IExplore deine 3D-Objekte anzeigen. Allerdings bist du dann eben auf die Funktionalität des Browsers beschränkt. Du kannst aber zB einen neuen Quelltext für die Objekte in den Browser von der Anwendung aus laden.
    Ist kein zu großer Aufwand und würde sich denke ich mal lohnen zu testen. Geht aber mit c# leichter und schneller als mit c++.

    Liebe Grüße, Maxi



  • Ich kenne VRML nicht, dennoch würde ich dir OpenGL an's Herz legen. Und bevor du dich in deine Windows-Forms-Plugin-Webbrowser-3D-Geschichte verstrickst, versuch lieber Tutorials wie diese hier zu verstehen und umzusetzen. Außerdem halten sich sicherlich nicht so viele VRML'er wie OpenGL'er hier im Forum auf, sodass du immer nachfragen kannst.



  • Hallo,

    vielen Dank für die Antworten.

    Also sind sich alle einig, dass OpenGL die beste Lösung ist?

    Würdet ihr dann Glut empfehlen, oder lieber direkt OpenGL?

    Ein paar weitere Expertenmeinungen würden mich freuen.

    Danke,
    Andi



  • 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