| Der Titel "3D-Welt" ist zwar etwas hochgegriffen, da wir nur einen einfachen Würfel verwenden werden, aber letztendlich gilt das, was wir hier lernen auch für 3D-Landschaften und sonstiges. Bevor wir uns allerdings darum kümmern diesen Würfel auf den Bildschirm zu bringen, müssen wir wissen, wie der Würfel im Speicher abgelegt wird. Abbildung 1: Verschiedene Formen aus Dreiecken Wenn Sie sich schon ein wenig mit dem Thema 3D-Grafik (nicht unbedingt Direct3D) beschäftigt haben, so werden Sie wissen, dass sämtliche Objekte in einer dreidimensionalen Welt aus Polygonen, genauer gesagt Dreiecken, bestehen. Der Vorteil von Dreiecken gegenüber Rechtecken, usw. ist, dass es zum einen das einfachste Polygon ist und zum anderen nie nach innen oder außen gewölbt sein kann (konkav / konvex). So wie ein Rechteck z.B. aus zwei gleichen Dreiecken besteht, so kann man auch sämtliche anderen Figuren aus Dreiecken bauen: Es gibt mehrere Möglichkeiten diese Dreiecke zu speichern. TriangleList Die TriangleList ist wohl die einfachste Art eine Form als Dreieck zu speichern. Es werden einfach die Dreiecke mit drei Punkten pro Dreieck gespeichert: 0, 1 & 2; 3, 4 & 5 Abbildung 2: Beispiel für eine Triangle-List TriangleStrip Der TriangleStrip hat gegenüber der TriangleList den Vorteil weniger Platz zu verbrauchen, da immer zwei Punkte der vorigen Dreiecks geteilt werden. Der Nachteil liegt daran, dass sie bei weitem nicht so flexibel sind und bei der Verwendung von Lighting zu Darstellungsfehlern führen können. 1, 2 & 3; 2, 3 & 4; 3, 4 & 5; 4, 5 & 6 ... Abbildung 3: Beispiel für ein TriangleStrip TriangleFan TriangleFans sind vor allem für kreisformige Strukturen geeignet. Hier wird allerdings der erste Punkt (Vertex) mit allen Dreiecken geteilt. 0, 1 & 2; 0, 2 & 3; 0, 3 & 4 Abbildung 4: Beispiel für einen TriangleFan LineList Die LineList speichert eine Gruppe von Punkten und verbindet jeweils zwei mit einer 1 Pixel schmalen Linie: 0 & 1; 2 & 3; 4 & 5 Abbildung 5: Beispiel für eine Line-List LineStrip Der LineStrip verbindet aufeinanderfolgende Vertices miteinander: 0 & 1; 1 & 2; 2 & 3; 3 & 4 ... Abbildung 6: Beispiel für einen Line-Strip PointList Die PointList hat ihren Einsatzbereich vor allem in Bezug mit Partikelsystemen verwendet. Hier werden die einzelnen Vertices als 1 Pixel gezeichnet Abbildung 7: Beispiel für eine Point-List Für den Würfel in den Beispielen zu diesem Tutorial habe ich eine TriangleList benutzt. Besser wäre natürlich ein TriangleStrip, dies wäre jedoch für den Anfang ein wenig kompliziert: cube(0) = New CustomVertex.PositionColored(-1, 1, 1, Color.Blue.ToArgb)
cube(1) = New CustomVertex.PositionColored(1, 1, 1, Color.Red.ToArgb)
cube(2) = New CustomVertex.PositionColored(-1, 1, -1, Color.Blue.ToArgb)
cube(3) = New CustomVertex.PositionColored(1, 1, -1, Color.Red.ToArgb)
cube(4) = New CustomVertex.PositionColored(-1, 1, -1, Color.Blue.ToArgb)
cube(5) = New CustomVertex.PositionColored(1, 1, 1, Color.Red.ToArgb)
cube(6) = New CustomVertex.PositionColored(-1, -1, -1, Color.Blue.ToArgb)
cube(7) = New CustomVertex.PositionColored(1, -1, 1, Color.Red.ToArgb)
cube(8) = New CustomVertex.PositionColored(-1, -1, 1, Color.Blue.ToArgb)
cube(9) = New CustomVertex.PositionColored(1, -1, 1, Color.Red.ToArgb)
cube(10) = New CustomVertex.PositionColored(-1, -1, -1, Color.Blue.ToArgb)
cube(11) = New CustomVertex.PositionColored(1, -1, -1, Color.Red.ToArgb)
cube(12) = New CustomVertex.PositionColored(-1, 1, -1, Color.Blue.ToArgb)
cube(13) = New CustomVertex.PositionColored(-1, -1, -1, Color.Blue.ToArgb)
cube(14) = New CustomVertex.PositionColored(-1, 1, 1, Color.Blue.ToArgb)
cube(15) = New CustomVertex.PositionColored(-1, 1, 1, Color.Blue.ToArgb)
cube(16) = New CustomVertex.PositionColored(-1, -1, -1, Color.Blue.ToArgb)
cube(17) = New CustomVertex.PositionColored(-1, -1, 1, Color.Blue.ToArgb)
cube(18) = New CustomVertex.PositionColored(1, 1, -1, Color.Red.ToArgb)
cube(19) = New CustomVertex.PositionColored(1, 1, 1, Color.Red.ToArgb)
cube(20) = New CustomVertex.PositionColored(1, -1, -1, Color.Red.ToArgb)
cube(21) = New CustomVertex.PositionColored(1, -1, 1, Color.Red.ToArgb)
cube(22) = New CustomVertex.PositionColored(1, -1, -1, Color.Red.ToArgb)
cube(23) = New CustomVertex.PositionColored(1, 1, 1, Color.Red.ToArgb)
cube(24) = New CustomVertex.PositionColored(-1, 1, -1, Color.Blue.ToArgb)
cube(25) = New CustomVertex.PositionColored(1, 1, -1, Color.Red.ToArgb)
cube(26) = New CustomVertex.PositionColored(-1, -1, -1, Color.Blue.ToArgb)
cube(27) = New CustomVertex.PositionColored(1, -1, -1, Color.Red.ToArgb)
cube(28) = New CustomVertex.PositionColored(-1, -1, -1, Color.Blue.ToArgb)
cube(29) = New CustomVertex.PositionColored(1, 1, -1, Color.Red.ToArgb)
cube(30) = New CustomVertex.PositionColored(1, 1, 1, Color.Red.ToArgb)
cube(31) = New CustomVertex.PositionColored(-1, 1, 1, Color.Blue.ToArgb)
cube(32) = New CustomVertex.PositionColored(-1, -1, 1, Color.Blue.ToArgb)
cube(33) = New CustomVertex.PositionColored(-1, -1, 1, Color.Blue.ToArgb)
cube(34) = New CustomVertex.PositionColored(1, -1, 1, Color.Red.ToArgb)
cube(35) = New CustomVertex.PositionColored(1, 1, 1, Color.Red.ToArgb) Listing 1: Der Code für den Würfel Der Code sieht ersteinmal schrecklicher aus, als er wirklich ist. Die Vertices werden alle in ein Array vom Typ CustomVertex.PositionColored gespeichert. Diese Sorte Vertices haben, wie der Name schon sagt, eine Position und eine Farbe. Allerdings ist diese Methode die Vertices zu erstellen sehr umständlich. Bei einfachen Körpern, wie Kugeln oder Würfeln, die einer einfachen Logik folgen, geht es gerade noch, für Körper und ähnlichem gibt es die Möglichkeit die Körper in einem Programm zu erstellen und dann mit Direct3D zu laden (doch dazu mehr in einem anderen Tutorial). |