Newbie braucht Hilfe ! 3D Würfel in TXT Speichern

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Knopfab.

    Newbie braucht Hilfe ! 3D Würfel in TXT Speichern

    VB 2013

    Es geht um die (GL.TexCoord2(A1, A2): GL.Vertex3(A3, A4, A5) Koordinaten ! ! Sory ich schreibe kiomisch^^

    1. Wie kann mann Quads(Vierecke) hinzufügen und Löschen wenn das Programm (unten)Aktive ist (Gestartet,in der laufzeit)?
    2. Ich möchte die Daten (Koordinaten) gerne speichern und laden können in TXT oder INI ander als jetzt ?
    3. Wenn ich ca. 20-60 Vierecke Hizufügen will in der Laufzeit muß ich die Daten in GlControl1_Paint erst alle vortragen,reischreiben ?
    4. Kann es sein das ich mit GlControl1_Paint es kommplet falsch angehe und es Extra gemacht werden muß ?

    Ich Google schon seit ü3 wochen in Internet rum. Aber ich finde nur Codes für das alte VB06, ;(
    das nihmt VB2010-2015 nicht an !

    In 2d geht es ja gut mit NEXT aber in 3d mmmmm!
    Ich finde nur was mit VB06 aber das geht nicht mit VB 2013.

    Ich wolte ein 3D Tastatur Spiel machen wo Buchstaben augerufen werden die aufgebaut werden müßen
    (kein 2D,kein schreibprogramm) .

    Mein plumpes Bespiel ist:

    VB.NET-Quellcode

    1. Dim A1 as Short
    2. Dim A2 as Short
    3. Dim A3 as Short
    4. Dim A4 as Short
    5. Dim A5 as Short

    ........... und so weiter

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. A1 = INI_ReadValueFromFile("Quads1", "1", "", ".\cfg.txt")
    3. A2 = INI_ReadValueFromFile("Quads1", "2", "", ".\cfg.txt")
    4. A3 = INI_ReadValueFromFile("Quads1", "3", "", ".\cfg.txt")
    5. A4 = INI_ReadValueFromFile("Quads1", "4", "", ".\cfg.txt")
    6. A5 = INI_ReadValueFromFile("Quads1", "5", "", ".\cfg.txt")
    7. ........... und so weiter
    8. End sub
    9. Private Sub GlControl1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles GlControl1.Paint
    10. GL.Clear(ClearBufferMask.ColorBufferBit)
    11. GL.Clear(ClearBufferMask.DepthBufferBit)
    12. Dim perspective As Matrix4 = Matrix4.CreatePerspectiveFieldOfView(1.04, 4 / 3, 1, 10000)
    13. Dim lookat As Matrix4 = Matrix4.LookAt(NumericUpDown5.Value, NumericUpDown6.Value, NumericUpDown7.Value, NumericUpDown8.Value, NumericUpDown9.Value, NumericUpDown10.Value, NumericUpDown11.Value, NumericUpDown32.Value, NumericUpDown33.Value) '
    14. GL.MatrixMode(MatrixMode.Projection)
    15. GL.LoadIdentity()
    16. GL.LoadMatrix(perspective)
    17. GL.MatrixMode(MatrixMode.Modelview)
    18. GL.LoadIdentity()
    19. GL.LoadMatrix(lookat)
    20. GL.Viewport(0, 0, GlControl1.Width, GlControl1.Height)
    21. GL.Enable(EnableCap.DepthTest)
    22. GL.DepthFunc(DepthFunction.Less)
    23. GL.PushMatrix()
    24. GL.PopMatrix()
    25. GL.BindTexture(TextureTarget.Texture2D, id(2))
    26. GL.Begin(PrimitiveType.Quads)
    27. GL.TexCoord2(A1, A2): GL.Vertex3(A3, A4, A5)
    28. GL.TexCoord2(B1, B2): GL.Vertex3(B3, B4, B5)
    29. GL.TexCoord2(C1, C2): GL.Vertex3(C3, C4, C5)
    30. GL.TexCoord2(D1, D2): GL.Vertex3(D3, D4, D5)
    31. GL.End()


    Muß ich für jedes Quads was ich hinzufügen will mit GL.TexCoord2 und GL.Vertex3 neu darunter schreiben.
    Ich weiß es klingt dumm aber Gibt es wirklich nicht sowas wie mit Schleifen. Oder sich selbst deklarierende werte ? ^^
    Ich weiß es mus anderst geschrieben werden aber wie ?

    Edit by ~blaze~:
    *VB.Net-Tags eingefügt*

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

    Hi
    ich hab' mir zwar durchgelesen, was du geschrieben hast, aber verstanden habe ich es nicht. Bitte formuliere das doch mal um:
    - Was ist das Ziel? Wie soll das Ziel aussehen?
    - Was verwendest du? Woher kommt bspw. Gl...?

    Bitte aktiviere außerdem Option Strict On in allen deinen Projekten (einfach mal danach googeln).

    I.a. gilt, dass du einfach über einen System.IO.StreamReader bzw. System.IO.StreamWriter Textdateien lesen und schreiben kannst. Die Verwendung ist recht intuitiv. Lade dir ein Array, in dem die Quads stehen und vergrößere das Array bei Bedarf. Das Array kannst du später einfach rausschreiben.
    Du könntest auch eine List(Of T) verwenden, aber der ToArray-Aufruf ist recht unperformant.
    Array.Resize kannst du zum Vergrößern und Verkleinern des Arrays verwenden. Eine gute Strategie ist, das Array, sobald es voll ist, auf die doppelte Größe zu vergrößern und wenn weniger als ein Viertel besetzt sind, auf die Hälfte zu verkleinern. Verwende einen Zähler für die Zahl der zu zeichnenden Primitiven und eine Structure für ein einzelnes Vertex. OpenGL bringt Funktionalität mit, die das Darstellen ermöglicht. Ggf. hat es sogar vordefinierte Structures (sollte halt X, Y, Z und die Texturkoordinaten U, V enthalten). Schau' dir mal die OpenGL-Beschreibung durch, da gibt es bestimmt etwas über einen Vertex-Puffer.
    Ergo: Ja, du musst es entweder neu hinzuschreiben (bzw. in einer Schleife) oder über obige Methode, die eher gängig ist, verwenden.

    Beachte übrigens, dass der Quellcode richtig formatiert ist, wenn du ihn in [vbnet][/vbnet]-Tags setzt. Bitte zukünftig so handhaben!

    Viele Grüße
    ~blaze~
    @~blaze~: vmtl. OpenTK oder ähnliches

    Dann sehe ich den Sinn in einer TextDatei nicht, du kannst Serialisierung verwenden, du kannst aber auch einfach einen importer für .obj files oder sonstige Modelformate schreiben, die bekannt und offen sind - da findest auch genügend im Internet.
    Oder ansonsten natürlich auch gerne Binär, schließlich sind die Daten ja auch in diesem Format auf dem PC vorhanden.

    Dann noch ein paar OGL bezogene Dinge:
    1. Das Clear kannst du in einen Call zusammenfassen indem du die BitFlags mittels bitwise Or verknüpfst
    2. Setze den Viewport nur, wenn sich dieser auch ändert, dasselbe gilt für die Projektionsmatrix und in diesem Fall würde es sich sogar für die ViewMatrix lohnen
    3. Enablen und setzen von irgendwelchen Eigenschaften gilt idr für immer, bis diese geändert werden(glDepthFunc/glEnable) auch nur einmalig(oder wenn es zwischendurch geändert werden muss)
    4. glBegin/glEnd und sonstige darauf aufbauende Methoden(glVertex/glTexCoord/glColor/glNormal) sind jetzt schon eine ganze Zeit lang veraltet und solten auch nicht genutzt werden, da sie jedesmal die Daten an die Grafikkarte senden.
    5. Verwende einen sogenannten VBO, evtl. ist auch ein IBO Lohnenswert, guck dir dazu Tutorials an
    Du musst bei jeder Veränderung(hinzufügen eines Quads) die VertexDaten neu an die Grafikkarte senden, oder du machst einen in der größe dynamischen VBO, was etwas komplizierter wird(und auch OGL Versionsabhängig gleich unperformant bleiben wird)
    6. Man sollte mindestens einen Vertex und einen FragmentShader verwenden, außerdem wirst du auch an diesen die Matrizen übertragen(was glLoadIdentity/glPushMatrix und ähnliches wieder überflüssig macht, denn diese sind ebenfalls veraltet)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Sory wegen Newbie braucht Hilfe ! habs kapiert . ^^ ( Sory wegen den Rechtschreibfehler ist leider ne behinderung)
    Forumregeln durchgelesen und habe das nicht, in man solte es nicht so schreiben, nicht gelesen Sory :( .
    Das mit Tag setzten in Forum wußte nicht was das ist. Aber jetzt.^^

    Danke für die Tips jvbsl

    Ich klaube ich bin es falsch angegangen. Ich wolte es in komplett in Buffer machen und habe es Per Datenbank gemacht.^^
    Ich habe an den Code ca 10 Stunden gesessen . Wegen Datenbank+verlinkung+bugs ( wie gesagt, bin anfänger aber so süchtig nach VB^^)

    Mein Projet was ich machen wolte, solte sowas ähnliches werden wie ein (Hammer Editor) (3D Game Map Editor) wie aus half life 1 sein.

    Aber ich habe nicht gefunden im Internet für vb2010-2015 . Wie man eine Datenbank -> Dataset mit Opengl nutzen kann (code)
    (Verhaut mich nicht der Code ist primitiv und verbesserbar . ^^)

    Meine lösung sieht so aus !!! In der Sub Sub GlControl1_Paint (wie im Video runterscrollen)

    Try

    Dim T As Integer
    For T = 0 To 40000000

    A1 = TableDataGridView.Item(2, T).Value
    A2 = TableDataGridView.Item(2, T).Value
    A3 = TableDataGridView.Item(3, T).Value
    A4 = TableDataGridView.Item(4, T).Value
    A5 = TableDataGridView.Item(5, T).Value
    A6 = TableDataGridView.Item(6, T).Value
    A7 = TableDataGridView.Item(7, T).Value
    A8 = TableDataGridView.Item(8, T).Value
    A9 = TableDataGridView.Item(9, T).Value
    A10 = TableDataGridView.Item(10, T).Value
    A11 = TableDataGridView.Item(11, T).Value
    A12 = TableDataGridView.Item(12, T).Value
    A13 = TableDataGridView.Item(13, T).Value
    A14 = TableDataGridView.Item(14, T).Value
    A15 = TableDataGridView.Item(15, T).Value
    A16 = TableDataGridView.Item(16, T).Value
    A17 = TableDataGridView.Item(17, T).Value
    A18 = TableDataGridView.Item(18, T).Value
    A19 = TableDataGridView.Item(19, T).Value
    A20 = TableDataGridView.Item(20, T).Value
    ' A21 = TableDataGridView.Item(21, T).Value
    A22 = TableDataGridView.Item(22, T).Value

    GL.BindTexture(TextureTarget.Texture2D, id(A22))
    GL.Begin(PrimitiveType.Quads)

    GL.TexCoord2(A1, A2) : GL.Vertex3(A3, A4, A5)
    GL.TexCoord2(A6, A7) : GL.Vertex3(A8, A9, A10)
    GL.TexCoord2(A11, A12) : GL.Vertex3(A13, A14, A15)
    GL.TexCoord2(A16, A17) : GL.Vertex3(A18, A19, A20)

    GL.End()

    Next
    Catch ex As Exception

    End Try
    (die Dims als Short)

    Mein Video
    Youtupe name : Visual Basic OpenGL Würfel / Datenbank abrufen zu g


    Ich habe was mit VBO gefunden aber keine anleitung add,lösch,ändert,laden,speichern. Nur Code abschnitte.
    VBO klaube ich ist besser da es schneller ist als die Datenbank oder?.

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

    Opentk Lookat 360 Grad Problem

    Ich weiß das Thema ist veraltet aber es passt ja noch zum dem Thema hier .
    Ich traue mir kein neues Thema aufzumachen wegen 2 Programmzeilen (das ist mir zu peinlich).
    Außer, ich habe es wieder was falsch gemacht und es ist doch ein neues Thema . ^^

    Project:
    3D Cube Spiel (Sternen System)(mit Erntesystem)

    Worum geht es:
    lookat posX ,posX,ZY ( Kamera (trehen,neigen) posY neigen geht nicht so richtig)

    (Nach 2 wochen I-Seiten durchauen und Testen habe ich aufgegeben. Und frage mal hier.)

    Video: ( im Video ist der Code bei Paint, der ist jetzt bei MouseMove)



    Hier der Code als Text.

    Dim posX : Dim posY : Dim zY : Dim zx : Dim eyex : Dim eyey : Dim eyez : Dim upx : Dim upy = 1 : Dim upz
    Dim systemX = 0.0: Dim systemy = 0.0: Dim systemz = 0.0

    Private Sub GlControl1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles GlControl1.MouseMove

    mousepos = New Point(e.X, e.Y)

    '' '--------------------------Offline--Code--anfang---------geht irgentwie nicht--
    '''Dim posX = Math.Cos(mousepos.Y * Math.PI / 180.0) * 360
    ''' 'Dim posY = Math.Sin(mousepos.Y * Math.PI / 180.0) * 360
    ''' 'Dim zX = Math.Cos(mousepos.X * Math.PI / 180.0) * 360
    ''' 'Dim zY = Math.Sin(mousepos.X * Math.PI / 180.0) * 360
    '' '--------------------------Offline--Code---Ende----------------------------------


    posX = Math.Cos(mousepos.X * Math.PI / 90.0) * 100 ' 1
    posY = Math.Sin(mousepos.Y * Math.PI / 90.0) * 100 ' 2 <---- Macht keine 360 Grad nur 180
    zY = Math.Sin(mousepos.X * Math.PI / 90.0) * 100 ' 3


    eyex = systemX + posX ' 1
    eyey = systemy + posY ' 2
    eyez = systemz + zY ' 3

    End sub


    Private Sub GlControl1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles GlControl1.Paint

    GL.Clear(ClearBufferMask.ColorBufferBit)
    GL.Clear(ClearBufferMask.DepthBufferBit)

    Dim perspective As Matrix4 = Matrix4.CreatePerspectiveFieldOfView(1.04, GlControl1.Width / GlControl1.Height, 1, 3000)

    Dim lookat As Matrix4 = Matrix4.LookAt(eyex, eyey, eyez, systemX, systemy, systemz, upx, upy, upz)

    GL.MatrixMode(MatrixMode.Projection) 'Load Perspective
    GL.LoadIdentity()
    GL.LoadMatrix(perspective)
    GL.MatrixMode(MatrixMode.Modelview) 'Load Camera
    GL.LoadIdentity()
    GL.LoadMatrix(lookat)
    GL.Viewport(0, 0, GlControl1.Width, GlControl1.Height) 'Size of window

    GL.Enable(EnableCap.DepthTest) 'Enable correct Z Drawings
    GL.DepthFunc(DepthFunction.Less) 'Enable correct Z Drawings
    GL.PushMatrix()
    GL.PopMatrix()

    GL.MatrixMode(TextureTarget.Texture2D) 'Umschalten in die Textur-Matrix
    GL.Enable(EnableCap.Texture2D)

    '-------------------
    GL.BindTexture(TextureTarget.Texture2D, id(1)) '' Bilderpuffer
    GL.Begin(PrimitiveType.Quads)
    GL.TexCoord2(0, 0) : GL.Vertex3(-5, 2, -5)
    GL.TexCoord2(1, 0) : GL.Vertex3(5, 2, -5)
    GL.TexCoord2(1, 1) : GL.Vertex3(5, 2, 5)
    GL.TexCoord2(0, 1) : GL.Vertex3(-5, 2, 5)
    GL.End()

    End sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    GlControl1.Invalidate()
    ''' Permanent an 20ms
    End Sub

    Habe nur Code´s mit C++,C# im I-net gefunden die nicht gehen oder halb da waren.

    Streamreader- Laden unb Speichern, BilderBuffer, und alles in Array´s habe ich umgesetzt.
    Collision system, Dimension optimierer, Und Speicherbegrenzung in Paint (Arrys) ist auch fertig.