www.rolandk.de
- Aktuelle Themen zu .Net -
Achtung: Hier handelt es sich um meine alte Seite.
Die aktuelle ist unter folgendem Link erreichbar: www.rolandk.de/wp/
Home Tutorials WPF 3D Chapter 1 - Basics




















































Chapter 1 - Basics
Freitag, den 18. Juni 2010 um 18:21 Uhr

 

 

Erste Schritte in Xaml

Das Ziel des ersten Kapitels ist es, ein einfaches blaues Dreieck innerhalb eines WPF Fensters darzustellen und dadurch die Grundlagen kennenzulernen – das Dreieck ist dabei erst einmal Nebensache. Grundsätzlich werden für dieses Kapitel 4 Komponenten benötigt:

  • Ein ViewPort3D Objekt, welches als Fenster in die 3D-Welt dient
  • Eine Kamera, über die der Benutzer in die 3D-Welt schauen kann
  • Das Licht, das für Farbe in der 3D-Welt sorgt
  • Das Dreieck, das schlussendlich dargestellt werden soll

Die ersten drei Elemente können recht einfach in ein Xaml Dokument eingebaut werden. Im folgenden Beispiel wird ein UserControl definiert, welches ein ViewPort3D Element mit einer Kamera und einem Licht enthält:

  1. <UserControl x:Class="Articles.Tutorials.Wpf3D.Chapter1"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Height="310" Width="330">
  5. <Grid>
  6. <Viewport3D Name="m_viewport3D" >
  7. <Viewport3D.Camera>
  8. <PerspectiveCamera
  9. Position="10,10,10"
  10. LookDirection="-10,-10,-10"
  11. UpDirection="0,1,0"
  12. FieldOfView="45"
  13. NearPlaneDistance="1"
  14. FarPlaneDistance="100"/>
  15. </Viewport3D.Camera>
  16. <ModelUIElement3D>
  17. <AmbientLight Color="White" />
  18. </ModelUIElement3D>
  19. </Viewport3D>
  20. </Grid>
  21. </UserControl>

Das Dreieck wird später über die CodeBehind Datei erstellt, daher sehen wir hier noch keine Spur davon. Als Kamera verwenden wir eine sogenannte PerspectiveCamera. Das Wort Perspective verrät uns hier schon, dass die Besonderheit dieser Kamera die Perspektive ist. Das resultierende Bild wird also durch einen definierten Sichtkegel errechnet. Bei der OrthographicCamera ist dies anders, denn damit wird schnurgerade in die 3D-Scene geschaut. Die einzelnen Eigenschaften der Kamera haben folgende Bedeutung:

  • Position
    Die X-, Y- und Z-Koordinaten der Kamera. Hiermit wird also beschrieben, wo im 3D Raum sich die Kamera befindet.
  • LookDirection
    Ein 3D-Vektor, welcher in die Richtung zeigt, in die die Kamera schauen soll. Hier im Beispiel schaut die Kamera direkt auf den 0-Punkt der 3D-Welt, da bei LookDirection das genaue Gegenteil der Position angegeben ist.
  • UpDirection
    Erst einmal schwer nachzuvollziehen, aber der Kamera muss ein Vektor übergeben werden, der ihr sagt, in welcher Richtung überhaupt oben ist. In den meisten Fällen muss hier der Standardwert „0,1,0“ angegeben werden. Entspricht also direkt den Verlauf der Y-Achse.
  • FieldOfView
    Hier wird der Winkel des Sichtkegels angegeben. Meist reicht der Standardwert 45 Grad, kann aber je nach Bedarf/Optik auch höher oder niedriger gestellt werden.
  • NearPlaneDistance
    Hier wird der Kamera mitgeteilt, ab welcher Tiefe Objekte wahrgenommen werden können. Rein theoretisch könnten nämlich sogar Objekte dargestellt werden, die sich hinter der Kamera befinden. Standardwert ist hier 1.
  • FarPlaneDistance
    Ähnlich wie bei NearPlaneDistance muss die Kamera natürlich auch wissen, bis zu welcher Tiefe Objekte gerendert werden. Dieser Wert variiert stark von Anwendung zu Anwendung.

Als Licht wird im Beispiel ein AmbientLight definiert. Dabei handelt es sich einfach gesagt um das Umgebungslicht, es beeinflusst also sämtliche Oberflächen in der 3D-Welt. Aufgrund der Farbe Weiß heißt das, dass jedes Objekt von den Farben her ohne irgendeine Abschwächung gezeichnet wird.

 

Das Objekt erzeugen

Die genauen Abläufe beim erzeugen sind Thema des nächsten Kapitels, daher gehe ich hier an dieser Stelle noch nicht genau darauf ein. Nur so viel: Das Objekt wird erst innerhalb des Loaded Ereignisses der UserControl Klasse erzeugt. Hier kurz der dafür nötige Quellcode:

  1. //Create the mesh geometry
  2. MeshGeometry3D triangleMesh = new MeshGeometry3D();
  3.  
  4. //Create all needex vertices
  5. triangleMesh.Positions.Add(new Point3D(-5, 0, -5));
  6. triangleMesh.Positions.Add(new Point3D(5, 0, 0));
  7. triangleMesh.Positions.Add(new Point3D(0, 0, 5));
  8.  
  9. //Build the triangle
  10. triangleMesh.TriangleIndices.Add(0);
  11. triangleMesh.TriangleIndices.Add(2);
  12. triangleMesh.TriangleIndices.Add(1);
  13.  
  14. //Set normals for all vertices
  15. Vector3D normal = new Vector3D(0, 1, 0);
  16. triangleMesh.Normals.Add(normal);
  17. triangleMesh.Normals.Add(normal);
  18. triangleMesh.Normals.Add(normal);
  19.  
  20. //Build the model object
  21. Material material = new DiffuseMaterial(new SolidColorBrush(Colors.Blue));
  22. GeometryModel3D triangleModel = new GeometryModel3D(
  23. triangleMesh,
  24. material);
  25.  
  26. //Build the visual object
  27. ModelVisual3D model = new ModelVisual3D();
  28. model.Content = triangleModel;
  29.  
  30. //Add the object to the viewport
  31. this.m_viewport3D.Children.Add(model);

 

Weiter geht's...

In diesem ersten Kapitel ging es Hauptsächlich darum, wie eine 3D Ansicht in WPF erstellt werden kann. Alles was dafür nötig ist, ist relativ einfach und elegant über Xaml möglich. Das nächste Kapitel befasst sich mit der Erstellung von 3D-Objekten im Code und beschreibt die dabei involvierten Klassen.

 

Quellen

 

Siehe auch...

 

Kommentar hinzufügen

Ihr Name:
Kommentar:

Kommentare (2)

2. Lukas
Mittwoch, den 11. Juni 2014 um 14:29 Uhr
Wirklich guter Anfang. Gehe jetzt über zu Chapter 2, hoffentlich wird das hohe Niveau beibehalten :)

1. Anonym
Mittwoch, den 02. Februar 2011 um 20:16 Uhr
Wow, sehr gute Erklärungen und gut zusammengefasst. Endlich mal jemand, der sagt was Sache ist.