1.) 3D-Viertelkugel (-welt) darstellen und 2.) Messpunkte als Spot auf der Wölbung darstellen

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Bartosz.

    1.) 3D-Viertelkugel (-welt) darstellen und 2.) Messpunkte als Spot auf der Wölbung darstellen

    Hallo zusammen, ich möchte mittels einer Picturebox einen bestimmen Raum darstellen. Der Punkt, von dem man alles betrachtet, ist fest und auf dem Boden. Die Kamera soll möglichst viel im Blick haben, ansonsten wird die Kamera nach links/ rechts gedreht (Pfeil-Links-Taste etc). Wie fängt man da an? Die Tiefe soll zum Großteil die Tiefe bleiben, nicht "oben".

    Wenn das geschafft ist, sollen Messpunkte als Spot (mit hellerer Farbe) im Inneren der Wölbung angezeigt werden. Ähnelt einem ophthalmologischen Perimeter, in dem man auf die LEDs achten muss.

    Im Anhang ist das gewollte Viertelkugelmodell in tetragonaler Ansicht. Die Picturebox soll das Ganze gerade darstellen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()

    Ich habe schon ein wenig programmiert. Der Code für die Kugel kommt von codeproject.com/Articles/3630/Spheres-in-GDI

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class Form1
    3. Dim x As New myPie
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Me.KeyPreview = True
    6. End Sub
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. PictureBox1.Invalidate()
    9. x.SetValues(10.0F, 10.0F) 'Beispiel
    10. End Sub
    11. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    12. x.Paint(e.Graphics, 0.0F, 0.0F)
    13. End Sub
    14. Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    15. 'Pfeiltaste links
    16. If e.KeyCode = Keys.A Then
    17. 'Blick nach links
    18. End If
    19. 'Pfeiltaste rechts
    20. If e.KeyCode = Keys.D Then
    21. 'Blick nach rechts
    22. End If
    23. 'Pfeiltaste oben
    24. If e.KeyCode = Keys.W Then
    25. 'Blick nach oben
    26. End If
    27. 'Pfeiltaste unten
    28. If e.KeyCode = Keys.S Then
    29. 'Blick nach unten
    30. End If
    31. End Sub
    32. End Class
    33. Public Class myPie 'x
    34. Private Theta0 As Single
    35. Private Phi0 As Single
    36. Public Sub SetValues(ByVal theta As Single, ByVal phi As Single) 'hier kommt rein, was von der Prozedur "Button1" übergeben wird
    37. Me.Theta0 = theta
    38. Me.Phi0 = phi
    39. End Sub
    40. Public Sub Paint(ByVal g As Graphics, ByVal theta As Single, ByVal phi As Single)
    41. g.SmoothingMode = SmoothingMode.AntiAlias
    42. g.CompositingQuality = CompositingQuality.HighQuality
    43. g.PixelOffsetMode = PixelOffsetMode.HighQuality
    44. g.InterpolationMode = InterpolationMode.HighQualityBilinear
    45. Dim ganz_schwarz As Color = Color.FromArgb(0, 0, 0)
    46. Dim Pen1 = New Pen(ganz_schwarz, CSng(2))
    47. Dim r As New Rectangle(2, 2, 696, 696)
    48. Dim rc As New Rectangle
    49. Dim x1, y1, x2, y2, x3, y3, x4, y4, i, j, left, top As Integer
    50. x1 = r.Left + r.Width / 2
    51. y1 = r.Top
    52. x2 = x1
    53. y2 = r.Top + r.Height
    54. x3 = r.Left
    55. y3 = r.Top + r.Height / 2
    56. x4 = r.Left + r.Width
    57. y4 = y3
    58. ' Koordinatensystem
    59. g.DrawLine(Pen1, x1, y1, x2, y2)
    60. g.DrawLine(Pen1, x3, y3, x4, y4)
    61. ' top-bottom arcs
    62. For j = r.Height To 1 Step -10
    63. top = r.Top + (r.Height - j) / 2
    64. rc = New Rectangle(r.Left, top, r.Width, j)
    65. g.DrawArc(Pen1, rc, 270.0F, 450.0F) '270-90°
    66. g.DrawArc(Pen1, rc, 90.0F, 270.0F) '90-270°
    67. Next
    68. End Sub
    69. End Class


    Es sieht zwar wie eine Kugel aus, aber ich will ja auf die Innenseite der hinteren Hülle schauen. Hat da jmd eine Idee?
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Bartosz Das ganze ist verbal relativ einfach:
    Baue Dir ein entsprechendes Koordinatensystem, Eulerwinkel wäre das Zauberwort, und führe eine Projektion in die Zeichenebene durch.
    Feddich.
    Noch nicht.
    Fang zunächst an mit Option Strict On: Visual Studio - Empfohlene Einstellungen
    Dann baust Du Dir ein Testprogramm, wo Du lernst, mit den Eulerwinkeln umzugehen.
    Dann erweiterst Du das um die Projektion in die Zeichenebene.
    Wenn Du das dann alles drauf hast, erfreue uns mit Deinen Resultaten. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany meinst du das?
    Bilder
    • Drehmatrix_Bspl - Kopie.jpg

      43,97 kB, 846×384, 70 mal angesehen
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Bartosz So in der Art.
    Stelle dar, was Du da drehst und Du wirst sehen, ob es richtig ist oder nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe mir mal testhalber diesen Code reinkopiert. Einfach, um ein bisschen rumzuspielen und das Ganze kennenzulernen.
    pastebin.com/b6ruh7EH

    Leider funktioniert

    VB.NET-Quellcode

    1. ​GlControl1.SwapBuffers()
    nicht. Fehlermeldung: "SwapBuffers" ist kein Member von Picturebox.

    Ich habe die Picturebox neu auf die GUI gezogen, sofort umbenannt und dann die Zeile eingefügt. ?(
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    :?:
    Der Code arbeitet mit OpenGL. Mit welchem Grafik-Framework arbeitest Du? DirectX? Gar keinem Dir bekannten?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    4.7.2 ist die Versionsnumer des .Net-Frameworks. Ja, GDI ist eine passende Antwort. Damit wird gezeichnet. Aber OpenGL ist ein zusätzliches Grafikframework, welches dann auch das GlControl mitbringt. Ein GlControl1 ist keine PictureBox.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    ​Ein GlControl1 ist keine PictureBox.
    Danke! :) hatte ich gedacht, weil ich .invalidate usw auch von der Picturebox her kenne. Nun denn, welche Lib muss ich wie einbinden?

    VB.NET-Quellcode

    1. ​Imports OpenTK
    2. Imports OpenTK.Graphics
    3. Imports OpenTK.Graphics.OpenGL

    habe ich bereits.
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Das sind ja nur die Namespace-Imports, die das Codieren etwas leichter machen. Aber die Bibliotheken musst Du selber einbinden.
    Puh, ohne es auszuprobieren, schau doch mal bei nuget vorbei. Vielleicht reicht es, da ein Paket runterzuladen, vielleicht musst Du vorher OpenGL installieren. Keine Ahnung. Aber einfach so den Code verwenden, geht nicht. Aber Dein Vorhaben geht bestimmt auch ohne jenen Code und OpenGL. Hab aber keinen blasssen Schimmer, wie aufwendig das wird. Ich hab mal angefangen, kleine 3D-Spiele zu machen. Aber das war 1. in C++, 2. mit DirectX und 3. > 10 Jahre her. Bis ich mich da reingefitzelt hatte, verging sehr viel Zeit.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Ich habe jetzt im Nuget die neueste OPenTK und die OpenTK.GLControl herunterladen und importiert. Aber in der Toolbox erscheint noch kein GlControl ...
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Bartosz Es nützt nix, wenn Du iwelchen Code in Dein Projekt kopierst und absolut keine Ahnung hast, was der macht.
    Den Code aus Snippet #2 hab ich mir mal angesehen, der ist ganz hübsch, hat aber mit Deinem Problem absolut nix zu tun.
    Du musst zunächst die "Elementar"-Mathematik hinter dem Problem verstehen.
    Das wären: Koordinatensysteme für Translation und Rotation
    Beschreibung von Bewegungen entlang einer oder mehrerer dieser Koordinaten (die Translation kannste da erst mal weglassen),
    2D-Projektion von 3D-Sachverhalten,
    Darstellung von 3D-Positionen in einer 2D-Projektion
    usw.
    Wie ist Dein Stand hierbei?
    UNd:
    Beim Lernen können wir Dir nicht helfen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es nützt nix, wenn Du iwelchen Code in Dein Projekt kopierst und absolut keine Ahnung hast, was der macht.

    der ist ganz hübsch, hat aber mit Deinem Problem absolut nix zu tun


    Absolut richtig, Rod, ich wollte erstmal heute mir den ganzen Spaß mal angucken und testen. Ich weiß gerade nicht so richtig, wo ich anfangen soll (außer, wie du schon sagst, Koordinatensysteme zu lernen und Rotationen zu machen). Es muss doch bestimmte Befehle geben (und dafür wiederum Bibliotheken), womit ich einen 3DKörper rotieren kann und auf 2D darstellen kann...

    Mein Stand ist ziemlich bei 0

    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Gonger96 Danke für das Projekt. Das ist mir jetzt peinlich, aber ich starte deine GDI3D.csproj.user-Datei und beim Debuggen kommt folgende Fehlermeldung:

    Um das Projekt zu debuggen, fügen Sie dieser Projektmappe ein ausführbares Projekt hinzu, das auf das Bibliotheksprojekt verweist. Legen Sie das ausführbare Projekt als Startprojekt fest.

    Ist mir schon klar, dass ich ein Projekt anlegen muss. Ich krieg das gerade nicht hin :/ . Soll ich deine GDI3D.csproj.user-Datei öffnen und dann im Projektmappenexplorer etwas hinzufügen, oder erst ein ganz neues C# Forms Projekt erstellen und deine Dateien reinkopieren? Ich finde den Menüpunkt nicht. So etwas habe ich noch nie gemacht ...
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Bartosz Da ist eine DLL als Startprojekt festgelegt.
    Klicke im Projektmappen-Explorer mit rechts auf Exyample und dann Als Startprojekt festlegen.
    Feddich.
    Du kannst natürlich die DLL einer vorhanden Projektmappe hinzufügen oder eine GUI-Anwendung dem GDI3D hinzufügen und dann dieses wiederum als Startprojekt gestlegen.
    Welche Sprache Du dafür wählst, ist im Rahmen des Angebots (C#, VB.NET, CLI) egal.
    ====
    @Gonger96 Sieh Dir das Projekt noch mal an, dass es einem nicht um die Ohren fliegt. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    @RodFromGermany Dankeschön, ich war vorhin etwas irritiert. Habe ein neues Projekt (C#) erstellt, die dll via Objektkatalog eingebunden, eine Form erstellt und Gongers Code "frmMain" in "Form1" umbenannt. Das lässt sich erstellen und kompilieren. Aber die Form bleibt weiß ||
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Bartosz Was bei Dir weiß bleibt, kann ich so nicht sagen, Du solltest Dir zumindest sein GUI-Projekt mal anschauen.
    Das Projekt von @Gonger96 stürzt bei mir ab. Er sollte da mal "nachbessern", ich hab da keine Lust, drin rumzupfuschen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So ich hab mir beides nochmal angeguckt und es läuft bei mir. Bei dem GUI Projekt ist ein Bin Ordner und darin die Bitmaps und 3D Modelle. Wenn man die Solution öffnet, dann fehlen die im Debug/Release Ordner. Die müsste man einmal rüber kopieren. Ich hab da mal ein einfaches Beispiel angehängt.
    Dateien
    • GDI3D.zip

      (321,81 kB, 72 mal heruntergeladen, zuletzt: )