12.6 Dreidimensionale Grafik
Zum Verständnis von dreidimensionalen Grafiken in WPF-Anwendungen ist ein wenig Theorie nicht zu umgehen. In diesem Abschnitt wird erläutert, wie ein 3D-Körper auf die zwei Dimensionen eines Bildschirms oder eines Buchs abgebildet wird, so dass die dritte Dimension für den Betrachter erkennbar wird.
Im Projekt WPFDreiDWuerfel wird ein Würfel im dreidimensionalen Raum dargestellt. Die Kantenlänge des Würfels ist 2, das Zentrum des Würfels ist der Nullpunkt des Koordinatensystems. Das Koordinatensystem hat eine x-Achse von links nach rechts, eine y-Achse von unten nach oben und eine z-Achse, die »hinter dem Bildschirm« beginnt und auf den Betrachter zuläuft.
Der Betrachter sieht die drei vorderen Seiten des Würfels, wie in Abbildung 12.8. Die Seiten des Würfels sind jeweils aus zwei Dreiecken aufgebaut. Dreiecke sind die Grundelemente zur Erstellung von 3D-Körpern in der WPF. Der Betrachter kann sich den Würfel per Tastendruck auch von hinten anschauen ( = vorne, = hinten).
Bei allen Projekten, in denen 3D-Körper erzeugt werden, ist der Namespace System.Windows.Media.Media3D für die Steuerung per Programmcode zusätzlich notwendig.
Abbildung 12.8 Drei Seiten eines Würfels
Der Aufbau im XAML-Code:
<Window ... KeyDown="Window_KeyDown">
<Viewport3D>
<Viewport3D.Camera>
<OrthographicCamera x:Name="oc" Position="1,3,5"
LookDirection="-1,-3,-5" Width="6"/>
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight x:Name="dl" Color="White"
Direction="-1,-3,-5" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<GeometryModel3D.Material>
<DiffuseMaterial Brush="LightGray" />
</GeometryModel3D.Material>
<GeometryModel3D.BackMaterial>
<DiffuseMaterial Brush="Red" />
</GeometryModel3D.BackMaterial>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions=
"-1,1,1 –1,-1,1 1,-1,1 1,1,1
1,1,1 1,-1,1 1,-1,-1 1,1,-1
–1,1,-1 –1,1,1 1,1,1 1,1,-1"
TriangleIndices="0,1,2 2,3,0
4,5,6 6,7,4
8,9,10 10,11,8"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
</Window>
Listing 12.13 Projekt »WPFDreiDWuerfel«, XAML-Code
Falls innerhalb des Fensters eine Taste heruntergedrückt wird, dann reagiert darauf die Ereignismethode Window_KeyDown.
Zunächst muss eine Kamera aufgestellt werden, mit deren Hilfe die 3D-Körper gesehen werden. Dabei sind die Position und die Blickrichtung wichtig. In diesem Projekt »schwebt« die Kamera an der Position 1, 3, 5, also schräg rechts oben vor der Blattebene. Die Blickrichtung (engl. LookDirection) wird mit –1, –3, –5 angegeben. Die Kamera blickt also zum gegenüberliegenden Punkt hinter der Blattebene, durch den Nullpunkt hindurch. Der Würfel selber liegt um den Nullpunkt herum, also kann der Betrachter ihn sehen. Innerhalb des Projekts können Position und Blickrichtung per Tastendruck geändert werden.
Es wird ein gerichtetes Licht vom Typ DirectionalLight verwendet. Es strahlt aus einer bestimmten Richtung, die mithilfe der Eigenschaft Direction vom Typ Vector3D angegeben wird. Hier wurde die gleiche Richtung wie die Blickrichtung genommen. Die drei sichtbaren Seiten des Würfels werden von diesem Licht aus unterschiedlichen Winkeln beleuchtet, daher erscheinen sie für den Betrachter in verschiedenen Farbtönen. Die Farbe des Lichts ist Weiß (Eigenschaft Color), dies ist das Licht mit der höchsten Intensität.
Das Material für die Vorderseite ist diffus und hellgrau. Über die Eigenschaft BackMaterial wird eine rote Farbe für die Rückseite gewählt. Der Betrachter kann den 3D-Körper somit auch von hinten sehen.
Die Form wird über ein Objekt des Typs MeshGeometry3D bestimmt. Darin stehen die Dreiecke, aus denen eine dreidimensionale Form aufgebaut wird. Wichtige Eigenschaften sind:
- Positions, vom Typ Point3DCollection, beinhaltet eine Auflistung von Point3D-Objekten, also Punkten im dreidimensionalen Raum. Jedes Point3D-Objekt besteht aus einer Gruppe von drei double-Zahlen für die x-, y- und z-Koordinate des Punkts. Wie in einer Auflistung üblich, sind die Elemente nummeriert, beginnend bei 0. Diese Nummern werden benötigt für die Eigenschaft TriangleIndices.
- TriangleIndices, vom Typ Int32Collection, besteht aus Gruppen von drei ganzen Zahlen. Eine Gruppe ergibt ein Dreieck. Die drei ganzen Zahlen geben an, welche Point3D-Objekte der Auflistung Positions für das Dreieck verwendet werden.
Die Auflistung der Point3D-Objekte für die Eigenschaft Positions umfasst in diesem Projekt 12 Elemente. Aus diesen Elementen werden mithilfe der Eigenschaft TriangleIndices sechs Dreiecke gebildet. Der Umlaufsinn jedes Dreiecks wurde so gewählt, dass der Betrachter alle Vorderseiten sieht. Jeweils zwei Dreiecke bilden eine der drei sichtbaren Seiten des Würfels. Im Einzelnen sind dies:
- die hellgraue vordere Seite, Indizes 0 (links oben), 1 (links unten), 2 (rechts unten) und 2, 3 (rechts oben), 0
- die schwarze rechte Seite, Indizes 4 (vorne oben), 5 (vorne unten), 6 (hinten unten) und 6, 7 (hinten oben), 4
- die dunkelgraue obere Seite, Indizes 8 (links hinten), 9 (links vorne), 10 (rechts vorne) und 10, 11 (rechts hinten), 8
Die Klasse mit der Ereignismethode:
Imports System.Windows.Media.Media3D
Class MainWindow
Private Sub Window_KeyDown(sender As Object,
e As KeyEventArgs)
If e.Key = Key.V Then
oc.Position = New Point3D(1, 3, 5)
oc.LookDirection = New Vector3D(-1, –3, –5)
dl.Direction = New Vector3D(-1, –3, –5)
Title = "WPFDreiDWuerfel, von vorne"
ElseIf e.Key = Key.H Then
oc.Position = New Point3D(-1, –3, –5)
oc.LookDirection = New Vector3D(1, 3, 5)
dl.Direction = New Vector3D(1, 3, 5)
Title = "WPFDreiDWuerfel, von hinten"
End If
End Sub
End Class
Listing 12.14 Projekt »WPFDreiDWuerfel«, Programmcode
Die Eigenschaft Key liefert das Element der Enumeration Key zu der betätigten Taste. Nach dem Betätigen einer der beiden Tasten oder werden die Position und die Blickrichtung der orthographischen Kamera und die Richtung des gerichteten Lichts geändert.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.