| Schon haben wir ein Problem. Wie soll eine solche Datei aussehen? Es gibt in den Weiten der 3D-Programmierung dazu keinen Standard. Jeder Entwickler eines 3D-Modellers kreiert da munter sein eigenes Format, möglichst absolut nicht kompatibel mit den Produkten der Konkurrenz. Davon lassen wir uns aber nicht beirren, ganz im Gegenteil: Wir erzeugen ebenfalls unser eigenes Format. Dazu habe ich eine Textdatei ausgewählt, da diese leicht zu editieren ist. Da unsere 3D-Welt im Prinzip nur aus Dreiecken (Vertizen) besteht, enthält unsere Datei auch nur Dreiecke. Die Datei hat daher einen recht einfachen Aufbau den Sie später nach Belieben verkomplizieren dürfen. In der ersten Zeile steht die Anzahl der definierten Dreiecke. Sodann folgen Blöcke von 3 Zeilen mit jeweils 5 Werten. Das sind die X-, Y- und Z-Koordinaten eines Punktes vom Dreieck sowie die beiden Koordinaten der Textur. Anschließend folgt noch eine Zeile mit der Indexnummer der verwendeten Textur. Das Laden der Texturen habe ich der Einfachheit halber noch fest im Quellcode gelassen. Da Sie das schlichte Prinzip solcher Weltdateien sicherlich sofort verstehen, wird es Ihnen keine Mühe machen Texturen, Lichter etc. selbst in die Beschreibungen einzufügen. Zur Ablage der Daten im Speicher definieren wir unsere eigenen Datentypen. Ein Vertex-Typ mit den fünf Werten eines Punktes. Ein Dreieck (Triangel-Typ) der ein Array mit je drei Punkten (Vertex-Typ) enthält sowie den Index der zugehörigen Textur. Zum Schluss habe ich noch einen Sektor-Typ entworfen. Dieser enthält einen Zeiger auf die Dreiecke und die Anzahl verwendeten Dreiecke. Private Type TpVertex X As GLfloat Y As GLfloat Z As GLfloat U As GLfloat V As GLfloat End Type
Private Type TpTriangle Vertex(2) As TpVertex T As Integer End Type
Private Type TpSector Sct_NummTriangle As Integer Triangle() As TpTriangle End Type
Private Sektor(0) As TpSector Listing 1: Benötigte Datentypen Zum Einlesen der Daten erzeugen wir eine neue Prozedur LoadWorld: Public Sub LoadWorld(File As String)
Dim I, J As Integer Dim F As Long Dim Zeile As String Dim Segment() As String Dim AnzDreieck As Integer
F = FreeFile
Open File For Input Shared As #F
Line Input #F, Zeile
Segment = Split(Zeile, " ") If Segment(0) = "NUMTRIANGLES" Then
AnzDreieck = Val(Segment(1))
ReDim Sektor(0).Triangle(AnzDreieck) Sektor(0).Sct_NummTriangle = AnzDreieck I = 0
J = 0
Do Line Input #F, Zeile Zeile = Trim(Zeile) If Len(Zeile) > 0 And Left(Zeile, 1) <> "/" Then
Do
Zeile = Replace(Zeile, " ", " ") Loop Until InStr(1, Zeile, " ") = 0
If J < 3 Then
Segment = Split(Zeile, " ") Sektor(0).Triangle(I).Vertex(J).X = Val(Segment(0))
Sektor(0).Triangle(I).Vertex(J).Y = Val(Segment(1))
Sektor(0).Triangle(I).Vertex(J).Z = Val(Segment(2))
Sektor(0).Triangle(I).Vertex(J).U = Val(Segment(3))
Sektor(0).Triangle(I).Vertex(J).V = Val(Segment(4))
J = J + 1
Else
Sektor(0).Triangle(I).T = Val(Trim(Zeile)) J = 0 I = I + 1 End If
End If
Loop Until I >= AnzDreieck
End If
End Sub Listing 2: Prozedur LoadWorld Das Ganze hat mit OpenGL direkt eigentlich nichts zu tun, sollte aber dem interessierten Einsteiger eine Grundlage zur Erstellung eigener Datenformate liefern. |