Isometrische Ansicht aus *.stl

  • VB.NET
  • .NET (FX) 4.0

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    Isometrische Ansicht aus *.stl

    Moin Leute!

    Meine Ausgangs Situation ist wie folgt;

    Ich habe eine *stl datei deren Inhalt so Aussieht: (nur viel Länger)

    Spoiler anzeigen

    Quellcode

    1. solid ascii
    2. facet normal 0.000000e+000 -6.974272e-002 9.975650e-001
    3. outer loop
    4. vertex -1.200000e+002 1.250000e+002 5.530463e-001
    5. vertex -1.200000e+002 1.600000e+002 3.000000e+000
    6. vertex -1.500000e+002 1.250000e+002 5.530463e-001
    7. endloop
    8. endfacet
    9. facet normal -6.938894e-018 -4.532415e-002 6.482940e-001
    10. outer loop
    11. vertex -1.500000e+002 1.250000e+002 5.530463e-001
    12. vertex -1.200000e+002 1.600000e+002 3.000000e+000
    13. vertex -1.500000e+002 1.600000e+002 3.000000e+000
    14. endloop
    15. endfacet
    16. facet normal -1.000000e+000 0.000000e+000 0.000000e+000
    17. outer loop
    18. vertex -1.500000e+002 1.250000e+002 0.000000e+000
    19. vertex -1.500000e+002 1.250000e+002 5.530463e-001
    20. vertex -1.500000e+002 1.750000e+002 0.000000e+000
    21. endloop
    22. endfacet
    23. facet normal -1.852587e-001 0.000000e+000 0.000000e+000
    24. outer loop
    25. vertex -1.500000e+002 1.750000e+002 0.000000e+000
    26. vertex -1.500000e+002 1.250000e+002 5.530463e-001
    27. vertex -1.500000e+002 1.600000e+002 3.000000e+000
    28. endloop
    29. endfacet​


    Gibt es irgendeine Möglichkeit (in WinForms) eine Isometrische-Ansicht( de.wikipedia.org/wiki/Perspektive#/media/File:Isometrie.png )
    darstellen zu lassen?

    Bsp. aus dem Zeichenprogramm 123D Design:


    Das ganze muss nicht drehbar sein oder sonstiges.
    Ich würde nur gerne ein 2D Bild aus einer "3D-Datei" erstellen lassen.

    Muss ich dazu zu DirectX greifen? ?( ||
    oder lässt sich das anderes realisieren?
    Bilder
    • IsoAnsicht.PNG

      93,63 kB, 590×538, 234 mal angesehen
    Ist evtl. sinnvoll als Thumbnail zu machen:
    msdn.microsoft.com/en-us/libra…op/cc144114(v=vs.85).aspx
    oder das hier für C#(was auch für VB.Net übersetzbar sein sollte)
    codeproject.com/Articles/56311…-Shell-Thumbnail-Handlers

    Natürlich kannst du alles über GDI+ malen, da es nur einmalig erstellt werden muss, ist es eh nicht so wild. Nur wirst du dabei bestimmt nicht viel Spaß haben.

    Wenn dir ein Drahtgitter Modell reicht, dann brauchst du nur deine Koordinaten entsprechend einer isometrischen projektion transformieren und die Verbindungslinien zeichnen(Bei Kurven musst du diese natürlich auch entsprechend mit transformieren, was nicht unbedingt einfach ist, falls es normale Splines sind dürfte es aber kein Problem darstellen. Keine Ahnung ob für Beziér Kurven das transformieren der Kontrollpunkte ausreicht)

    Wenn es dann "Solid" sein soll, dann musst du die Punkte nach hinten(weiter weg von der Kamera) sortieren und die weiter hinten zu erst zeichnen, außerdem musst du natürlich nicht nur Verbindungslinien Zeichnen, sondern die Flächen auch ausfüllen.

    Wenn du jetzt noch ein einfaches Shading drinne haben willst, dann musst du für jeden Punkt auf einer Fläche die zugehörigen Eckpunkte kennen, anhand von diesen Eckpunkten(und dessen Normalen, die du evtl. auch noch berechnen musst), kannst du die Normalen an dem jeweiligen Punkt interpolieren, anschließend wird anhand der Normalen und einer Lichtquelle das Licht auf diese weise für jeden Pixel berechnet.

    Das ganze kann natürlich noch optimiert werden, aber das ist so mal ein genereller Ansatz.

    In DirectX oder OpenGL ist das ganze ein DrawCall mit einem ziemlich einfachen Shader.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    WinForms wird schwieriger, aber in WPF sollte das klappen:
    Würfel darstellen mit verschiedenen Perspektiven
    CAD Software mit .Net + GDI+
    Du musst eigentlich nur den Inhalt der Datei parsen und so zurechtrücken, dass WPF damit was anfangen kann.
    Mein Vorschlag ist dieser:
    Lade die Daten erst mal und erstelle einfach verwendbare Klassen dafür. Z.B. eine Klasse "Facet" mit den Properties "Normal" (ein Vektor) und "TriangleVertices" (drei Vektoren).
    Gehe dann alle Facets durch und füge alle ihre TriangleVertices zu einer Liste hinzu, sofern noch nicht drin. Dadurch eliminierst Du Duplikate.
    Daraus machst Du die MeshGeometry3D.Positions.
    Dann gehst Du die Facets der Reihe nach durch und davon die TriangleVertices und suchst für jeden Vektor den Index im oben erstellten Array.
    Daraus machst Du die MeshGeometry3D.TriangleIndices.
    Dann sollte WPF schon was rendern.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hab gerade nochmal nachgeguckt, um Splines muss man sich keine Sorgen machen, wird von STL nicht unterstützt(dachte irgendwie^^⁾. Machts also für GDI+ sogar wieder relativ gut machbar.

    Natürlich ist WPF die wesentlich einfachere Möglichkeit(Ich mag nur WPF nicht, weil es so hardcoded Win zugeschnitten ist und .Net only)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @jvbsl
    Die Thumbnail Idee klingt ganz, ich werde mal schauen ob sich das ganze so umsetzen lässt.

    @Niko Ortner
    Mein ganzes Project jetzt auf WPF umschreiben habe ich wenig Lust zu, da ich damit noch nie zu tun hatte..

    Zur Not muss ich mich mit GDI+ beschäftigen, kann ja nicht schaden

    Danke erstmal, obwohl ich glaube das es hier nicht bei einer Frage bleiben wird:)

    Gelöschter Benutzer schrieb:

    Mein ganzes Project jetzt auf WPF umschreiben


    Musst du nicht. Es reicht, wie im verlinkten Post gezeigt, irgendwo einen Viewport3D anzuzeigen.
    Das kann in einem WPF Window sein: Du kannst in einer WinForms-Anwendung genauso WPF-Fenster anzeigen. Das ist kein Problem.
    Wenn Du das Modell innerhalb eines bestehenden WinForms-Fensters anzeigen willst, kannst Du auch einen WpfElementHost verwenden.

    Natürlich soll man es wenn möglich vermeiden, diese beiden Technologien zu mischen. Aber ich denke, hier wäre das gerechtfertigt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:



    Musst du nicht. Es reicht, wie im verlinkten Post gezeigt, irgendwo einen Viewport3D anzuzeigen.

    Ach was? man lernt nie aus.
    "Nicht beide Technologien mischen" ist das nur eine grobe Faustformel, oder kann es da zu ernsthaften Problemen kommen?
    Ich würde es nur benutzen um, wennan ein stl model aus der Datenbank lädt ein kurzes Preview Fenster hat, um sicherzustellen das es sich wirklich um das Modell handelt.Also nix Performance lästiges oder gar extrem wichtiges
    In erster Linie weist es auf Architekturprobleme hin, wenn man mischt. Im Normalfall sollte es ja nicht nötig sein ;)
    Aber hier ist es kein Problem.

    Technische Probleme gibt es normalerweise keine. Besonders nicht, wenn du nur sowas einfaches machst.
    Ich musste mal einen WindowsFormsHost in einem ScrollViewer in einem WPF-Fenster verwenden, und da hat dann das, was im WindowsFormsHost war, das Fenster auch außerhalb überlappt. Also nichts gravierendes.


    Edit:
    Kleiner Tipp. Du kannst mit @'Name' auf Posts antworten. So zum Beispiel: @Kameo. Dann ist klar, an wen Deine Antwort geht und du musst nicht zitieren.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Amro
    Das Stimmt so weit vllt.

    Aber ich möchte nicht jede stl datei nochmal extra durch die 3D Software jagen, bzw 2 Datein in die Datenbank aufnehmen,
    Ich werde es jetzt erstmal mit WPF versuchen, und evtl openTK/openGL da habe ich etwas brauchbares gefunden