Open 3GL Kreise bzw. Kugeln zeichnen

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Open 3GL Kreise bzw. Kugeln zeichnen

    Moin zusammen,

    ich habe mal wieder ein kleines Problemchen. Ich habe mal versucht mich in OpenGL einzuarbeiten und mit Dreiecken und Flächen ging das alles soweit auch schon ganz gut.
    Nur kam ich auf die Idee mal einen Kreis zeichnen zu wollen, da ich letztendlich eine 3 Dimensionale Erde erzeugen möchte, die sich drehen lässt etc.

    Aber leider wird mir kein Kreis gezeichnet. Das einzige, was ich sehe, ist eine vertikale gepunktete Linie. Ich habe es über ein Schleife und ein Array von Punkten probiert. Das ganze soll in Visual Basic stattfinden.

    Die andere Möglichkeit, die ich gefunden habe, ist GLUT? zu installieren, wobei ich dafür keine wirklich für mich verständliche Anleitung gefunden habe.
    Anbei der Quellcode.

    VB.NET-Quellcode

    1. Imports OpenTK
    2. Imports OpenTK.Graphics
    3. Imports OpenTK.Graphics.OpenGL
    4. Public Class Form1
    5. Private Sub GlControl1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GlControl1.Load
    6. GL.ClearColor(Color.Black)
    7. End Sub
    8. Private Sub GlControl1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles GlControl1.Paint
    9. GL.Clear(ClearBufferMask.ColorBufferBit)
    10. GL.Clear(ClearBufferMask.DepthBufferBit)
    11. Dim perspective As Matrix4 = Matrix4.CreatePerspectiveFieldOfView(1.04, 4 / 3, 1, 10000)
    12. Dim lookat As Matrix4 = Matrix4.LookAt(100, 20, 0, 0, 0, 0, 0, 1, 0)
    13. GL.MatrixMode(MatrixMode.Projection)
    14. GL.LoadIdentity()
    15. GL.LoadMatrix(perspective)
    16. GL.MatrixMode(MatrixMode.Modelview)
    17. GL.LoadIdentity()
    18. GL.LoadMatrix(lookat)
    19. GL.Viewport(0, 0, GlControl1.Width, GlControl1.Height)
    20. GL.Enable(EnableCap.DepthTest)
    21. GL.DepthFunc(DepthFunction.Less)
    22. GL.Rotate(NumericUpDown1.Value, 0, 0, 1)
    23. GL.Rotate(NumericUpDown2.Value, 0, 1, 0)
    24. Dim koordinaten(361) As Point
    25. For i As Integer = 0 To 360
    26. koordinaten(i).X = 50 * Math.Cos(i)
    27. koordinaten(i).Y = 50 * Math.Sin(i)
    28. Next
    29. GL.Begin(BeginMode.Points)
    30. For i As Integer = 0 To 360
    31. GL.Color3(Color.Green)
    32. GL.Vertex3(koordinaten(i).X, koordinaten(i).Y, 0)
    33. Next
    34. GL.End()
    35. GraphicsContext.CurrentContext.VSync = True
    36. GlControl1.SwapBuffers()
    37. End Sub
    38. Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
    39. GlControl1.Invalidate()
    40. End Sub
    41. Private Sub NumericUpDown2_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown2.ValueChanged
    42. GlControl1.Invalidate()
    43. End Sub
    44. End Class

    Hallo,

    das würde mich auch interessieren. Ich hatte ein schönes Tutorial gefunden, doch leider OpenGL mit VB 6.
    Wenn man das in VB.NET umsetzen könnte wäre super.

    Hier der Link:

    activevb.de/tutorials/opengl/t…ntro/tut_ogltutintro.html

    Auf der OpenTK-Seite selbst ist dasTut ja leider in C# geschrieben. Wie hast du es geschafft, damit überhaupt in VB.NET anzufangen? OpenTK hab ich in ein Projekt eingebunden, aber wie geht's dann weiter?

    Das og. Tutorial in VB 6 kann man ja in VB.NET nicht so nachvollziehen, hab das versucht (schwarzes Fenster erstellen), und kriege über 50 Fehlermeldungen... Mir wäre schon mal hilfreich zu wissen, wie man überhaupt ein schwarzes Fenster erstellt (für den Anfang).

    opentk.com/doc/chapter/0

    Schönen Gruß,
    Jean.

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

    OpenTK tuts da eigentlich schon ganz gut, da brauchst du nicht noch GLUT, wobei ich nicht weiß, ob das überhaupt jemand für .NET geported hat. Warum setzt du eigentlich in jeder RenderInteration die VSync-Eigenschaft auf True?

    Jean schrieb:

    dasTut ja leider in C# geschrieben
    Warum die Ausrede "Das ist aber C#" nicht gilt

    Mit dem OpenGL-Code kann ich dir leider nicht helfen, aber schau dir vlt. wirklich mal die OpenTK-Tutorials in deren Dokumentation an (opentk.com/doc - Chapter 1-5). Da steht auch was zur Geometrie.

    Jean schrieb:

    damit überhaupt in VB anzufangen?
    Warum nicht? :D

    LG :)

    Jean schrieb:

    Wie hast du es geschafft, damit überhaupt in VB anzufangen?

    Ging eigentlich recht simpel. Du nimmst die beiden DLL Dateien und fügst sie bei Verweise in deinem aktuellen Projekt hinzu.

    ichduersie schrieb:

    Warum setzt du eigentlich in jeder RenderInteration die VSync-Eigenschaft auf True?

    Soweit ich weiß erreicht man damit, dass die CPU nicht zu hoch belastet wird, da dadurch eine Art "max. FPS Limit" erstellt wird.

    To release CPU time, do one of those:

    - Enable vsync via GraphicsContext.CurrentContext.VSync = true in your glControl Load. This is very accurate but may fail to work on some older drivers or when the user disables vsync in his driver configuration.
    - Call System.Threading.Thread.Sleep(n) where n is the amount of milliseconds you have to spare, considering your target framerate. (For instance, if you target 60fps or 16.6ms per frame, and your frame time is 10ms, you have 6.6ms to spare). This approach will always work but is less accurate may overshoot the amount of milliseconds you specify.

    Quelle: http://www.opentk.com/doc/intro/cpu-usage

    Die Tutorials werde ich mir mal anschauen und dann versuchen das Problem zu lösen.

    Grüße
    San
    Du hast das falsch verstanden, dadurch sparst du gar nichts und bekommst auch keine Konstante framerate, dafür musst du schon selbst sorgen indem du eine Angabe hast, wie lange ein Frame brauch darf 60 fps -> 1000ms/60
    Und dann misst man (z.b. mit einer Stopwatch) wie lange es tatsächlich braucht und machst ein Thread.Sleep mit der Differenz.

    Ansonsten soltest du erst probieren die ganzen Altlasten los zu werden.
    1. Verwende einen VBO und evtl einen IBO
    2. Verwende die dynamic pipeline (alles über shader)-> glLoadMatrix etc fällt dann automatisch auch weg.
    3. Matrizen erstellst du nur neu, wenn sich auch tatsächlich etwas verändert hat.
    4. Vorheriger Punkt zählt auch für Viewport Tiefenvergleich und sonstige Einstellungen

    Wenn du das alles geschafft hast kann man sich an komplexere Formen wagen.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---