VB.NET - Programmierung eines 3D Koordinatensystems

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    VB.NET - Programmierung eines 3D Koordinatensystems

    Schönen guten Abend, liebe Community,


    ich komme gleich zum Thema:

    Für ein aktuelles Projekt würde ich gerne in meinen aktuellen Code ein - sich mitbewegendes - Koordinatensystem für die X, Y, Z Achse einfügen, jedoch habe ich leider keine Ahnung wie, habe schon vieles ausprobiert, aber leider hat davon nichts so funktioniert, wie ich es haben wollte.

    Also bisher ohne Erfolg..


    Ich hätte es gerne so wie auf folgendem Bild:

    bilder-upload.eu/bild-85ce74-1569710587.png.html

    Das blaue Koordinatensystem steht fest im Raum (bewegt sich jedoch beim Drehen des Quaders in X, Y, Z Richtung mit)

    Das schwarze Koordinatensystem ist fest mit dem Quader "verbunden", schwingt also hin und her und lässt sich ebenfalls in X, Y, Z Richtung mitbewegen



    Aktuell sieht das ganze bei mir so aus:

    bilder-upload.eu/bild-e772f2-1569743065.jpg.html

    Also bloß der drehbare Quader ohne sichtbare Achsenbeschriftung.


    Mein Quellcode sieht folgendermaßen aus:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Dim alpha_z, alpha_y As Decimal
    3. Dim maus_x, maus_y As Integer
    4. Private Sub frmTest_Paint(ByVal sender As Object,
    5. ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    6. If RadioButton_2D.Checked Then
    7. Dim p As New Pen(Color.Blue, 2)
    8. Dim x, y As Integer
    9. 'x = 100 + 100 * Math.Sin(Form1.phi)
    10. x = Me.Width / 2 + 115 * Math.Sin(Form1.phi) 'Zentrierung X-Achse
    11. y = Me.Height / 2 + 115 * Math.Cos(Form1.phi) 'Zentrierung Y-Achse
    12. 'y = 100 + 100 * Math.Cos(Form1.phi)
    13. e.Graphics.DrawEllipse(Pens.Red, x - 10, y - 10, 20, 20) 'Kugel
    14. e.Graphics.FillEllipse(Brushes.Red, x - 10, y - 10, 20, 20)
    15. e.Graphics.DrawLine(p, CInt(Me.Width / 2), CInt(Me.Height / 2), x, y) 'Der Faden
    16. e.Graphics.DrawLine(Pens.Black, 212, CInt(Me.Height / 2), Me.Width - 212, CInt(Me.Height / 2))
    17. With e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias 'test für Anti-Aliasing als Weichzeichner Methode
    18. e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality 'Zusätzlicher Test mit HighQuality
    19. End With
    20. Button1.Visible = False
    21. Button2.Visible = False
    22. Button3.Visible = False
    23. Button4.Visible = False
    24. Label1.Visible = False
    25. End If
    26. 'Formatierung eines Quaders in 3D durch ein Koordinatensystem
    27. If RadioButton_3D.Checked Then
    28. Dim b, t, h As Decimal
    29. b = 6
    30. t = 2
    31. h = 15
    32. Dim x(7), y(7), z(7) As Decimal
    33. y(1) = b
    34. x(2) = t
    35. y(2) = b
    36. x(3) = t
    37. z(4) = h
    38. y(5) = b
    39. z(5) = h
    40. x(6) = t
    41. y(6) = b
    42. z(6) = h
    43. x(7) = t
    44. z(7) = h
    45. Button1.Visible = True
    46. Button2.Visible = True
    47. Button3.Visible = True
    48. Button4.Visible = True
    49. Label1.Visible = True
    50. For i = 0 To 7
    51. z(i) = z(i) - 1.0 * h
    52. y(i) = y(i) - 0.5 * b
    53. Next
    54. Dim x0(7), y0(7), z0(7) As Decimal
    55. For i = 0 To 7
    56. x0(i) = x(i)
    57. y0(i) = y(i) * Math.Cos(Form1.phi) - z(i) * Math.Sin(Form1.phi)
    58. z0(i) = y(i) * Math.Sin(Form1.phi) + z(i) * Math.Cos(Form1.phi)
    59. Next
    60. 'nachfolgender Schritt für Drehung um die Z Achse
    61. Dim x1(7), y1(7), z1(7) As Decimal
    62. For i = 0 To 7
    63. x1(i) = x0(i) * Math.Cos(alpha_z) - y0(i) * Math.Sin(alpha_z)
    64. y1(i) = x0(i) * Math.Sin(alpha_z) + y0(i) * Math.Cos(alpha_z)
    65. z1(i) = z0(i)
    66. Next
    67. 'nachfolgender Schritt für Drehung um die Y Achse
    68. Dim x2(7), y2(7), z2(7) As Decimal
    69. For i = 0 To 7
    70. x2(i) = x1(i) * Math.Cos(alpha_y) - z1(i) * Math.Sin(alpha_y)
    71. z2(i) = x1(i) * Math.Sin(alpha_y) + z1(i) * Math.Cos(alpha_y)
    72. y2(i) = y1(i)
    73. Next
    74. '3D auf 2D Umrechnung
    75. Dim xb(7), yb(7) As Integer 'Dimensionierung des Quaders
    76. For i = 0 To 7
    77. xb(i) = Me.Width / 2 + y2(i) * 20 '- x2(i) * 0.707 * 0.5 * 20
    78. yb(i) = Me.Height / 2 - z2(i) * 20 '+ x2(i) * 0.707 * 0.5 * 20
    79. e.Graphics.DrawEllipse(Pens.Black, xb(i) - 4, yb(i) - 4, 8, 8) 'Eckpunkte des Quaders
    80. Next
    81. For j = 0 To 1
    82. For i = 0 To 2
    83. e.Graphics.DrawLine(Pens.Black, xb(i + j * 4), yb(i + j * 4), xb(i + 1 + j * 4), yb(i + 1 + j * 4))
    84. Next
    85. e.Graphics.DrawLine(Pens.Black, xb(3 + j * 4), yb(3 + j * 4), xb(0 + j * 4), yb(0 + j * 4))
    86. Next
    87. For i = 0 To 3
    88. e.Graphics.DrawLine(Pens.Black, xb(i), yb(i), xb(i + 4), yb(i + 4))
    89. Next
    90. 'nachfolgend Fläche mit Farbe
    91. 'Vorne
    92. If x2(3) - x2(0) > 0 Then
    93. Dim quader() As Point =
    94. {New Point(xb(2), yb(2)),
    95. New Point(xb(3), yb(3)),
    96. New Point(xb(7), yb(7)),
    97. New Point(xb(6), yb(6))}
    98. With e.Graphics
    99. .SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality
    100. '.DrawLines(New Pen(Color.Black, 2), quader)
    101. End With
    102. e.Graphics.FillPolygon(Brushes.Red, quader)
    103. End If


    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Nocturn Willkommen im Forum. :thumbup:
    Besser ist es, wenn Du Deine Bilder direkt im Forum hochlädtst: Erweiterte Antwort -> Dateianhänge -> Hochladen.
    Fang an und beschreibe Dein Problem in geeigneten Koordinaten, die in geeigneten 3D-tauglichen Instanzen einer Vector-Klasse vorliegen, z.B. docs.microsoft.com/de-de/dotne….vector3?view=netcore-3.0
    Bevor Du das nicht gelöst hast, solltest Du nicht an der Darstellung weiterarbeiten, sonst machst Du alles zwei Mal.
    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!