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




















































Chapter 3 - Texturing objects
Samstag, den 03. Juli 2010 um 13:39 Uhr

 

 

Allgemeines

Aus den letzten beiden Kapiteln geht bereits hervor, wie eine 3D-Ansicht initialisiert wird und wie man einfache Objekte zusammenbaut. In diesem Kapitel liegt der Fokus nicht mehr auf der Geometrie, sondern auf dem Material der 3D-Objekte. Was ist aber überhaupt genau ein Material? Ein Material enthält die Eigenschaften eine Oberfläche, die Wichtigste ist hierbei die Farbe. Die Farbe kann wie in den letzten Kapiteln für alle Pixel einer Oberfläche immer gleich sein, oder eben durch ein Bild, einen Farbverlauf oder gar durch ein WPF-Steuerelement bestimmt werden.

 

Texturkoordinaten

Bevor man richtig mit Materialien arbeiten kann, müssen allen Eckpunkten in der Geometrie sog. Texturkoordinaten zugeordnet werden. Das funktioniert genauso, wie bei Normals und Positionen:

  1. //Add texture coordinates
  2. geometry.TextureCoordinates.Add(new Point(0, 1));
  3. geometry.TextureCoordinates.Add(new Point(1, 1));
  4. geometry.TextureCoordinates.Add(new Point(1, 0));
  5. geometry.TextureCoordinates.Add(new Point(0, 0));

In diesem Quellcodeausschnitt werden zu den Eckpunkten eines Rechtecks die Texturkoordinaten hinzugefügt. In diesem Beispiel weiße ich lediglich die Werte 0 und 1 zu. Was bedeutet das? Jeder Eckpunkt muss wissen, welcher Punkt der Textur genau auf der Position des Eckpunktes ist und bei einer Textur ist grundsätzlich festgelegt, dass die Koordinate 0,0 der obere linke Ecke und 1,1 der untere rechte Ecke entspricht.

 

Vorbereitung

Um hier etwas mit Texturen rumprobieren zu können, habe ich mir zusätzlich zu der Hilfsmethode des letzten Kapitels noch eine weitere programmiert. Die Funktion ist relativ einfach: Es wird ein Würfel an der übergebenen Koordinate erstellt, welcher das übergebene Material verwendet. Hier der Quellcode dieser Methode:

  1. private void AddCube(Point3D position, Material material)
  2. {
  3. //Create the mesh geometry
  4. MeshGeometry3D triangleMesh = new MeshGeometry3D();
  5.  
  6. Point3D a = new Point3D(position.X - 1, position.Y - 1, position.Z + 1);
  7. Point3D b = new Point3D(position.X + 1, position.Y - 1, position.Z + 1);
  8. Point3D c = new Point3D(position.X + 1, position.Y - 1, position.Z - 1);
  9. Point3D d = new Point3D(position.X - 1, position.Y - 1, position.Z - 1);
  10. Point3D e = new Point3D(position.X - 1, position.Y + 1, position.Z + 1);
  11. Point3D f = new Point3D(position.X + 1, position.Y + 1, position.Z + 1);
  12. Point3D g = new Point3D(position.X + 1, position.Y + 1, position.Z - 1);
  13. Point3D h = new Point3D(position.X - 1, position.Y + 1, position.Z - 1);
  14. BuildRectangle(triangleMesh, a, b, f, e, new Vector3D(0, 0, 1));
  15. BuildRectangle(triangleMesh, b, c, g, f, new Vector3D(1, 0, 0));
  16. BuildRectangle(triangleMesh, c, d, h, g, new Vector3D(0, 0, -1));
  17. BuildRectangle(triangleMesh, d, a, e, h, new Vector3D(-1, 0, 0));
  18. BuildRectangle(triangleMesh, e, f, g, h, new Vector3D(0, 1, 0));
  19. BuildRectangle(triangleMesh, a, d, c, b, new Vector3D(0, -1, 0));
  20.  
  21. //Build the model object
  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);
  32. }

 

Beispiele

Zunächst einmal ein einfaches Beispiel, welches denselben Würfel wie im letzten Kapitel erzeugt:

  1. //Build blue cube (same like in Chapter2)
  2. material = new DiffuseMaterial(new SolidColorBrush(Colors.Blue));
  3. AddCube(new Point3D(0, -1, 0), material);

Altbekannt, es wird ein einfaches Material erzeugt mit der Farbe Blau. Die Textur wird hierbei durch das SolidColorBrush Objekt definiert, was natürlich auch heißt, dass wir alle anderen Typen von WPF verwenden können, die auch von der Basisklasse Brush erben. Folgendes Beispiel etwa erstellt einen Würfel mit einem Farbverlauf darauf:

  1. //Build a cube with a gradient
  2. material = new DiffuseMaterial(new LinearGradientBrush(
  3. Colors.Green, Colors.LightSteelBlue, 0));
  4. AddCube(new Point3D(-2, -1, 2), material);

Auch Bilder können mithilfe des ImageBrush Objekts auf ein Objekt geklebt werden:

  1. //Build a cube with a texture
  2. material = new DiffuseMaterial(new ImageBrush(new BitmapImage(
  3. new Uri("pack://application:,,,/Resources/Textures/Ground.jpg"))));
  4. AddCube(new Point3D(2, -1, -2), material);

Sehr nützlich kann auch der VisualBrush werden. Die Funktion davon ist recht einfach: Der VisualBrush kann selbst wieder WPF-Steuerelemente wie Grids, Buttons, … enthalten. Wichtig zu beachten ist aber, dass das erste Element, welches dem VisualBrush zugewiesen wird, eine feste Größe (Eigenschaften Width und Height) bekommt, da sonst das Layoutsystem von WPF nicht weiß, wie groß die Objekte gezeichnet werden sollen. Im folgenden Beispiel wird der VisualBrush verwendet, um einen Button auf einen Würfel zu kleben:

  1. //Build a cube with a button on it
  2. material = new DiffuseMaterial(new VisualBrush(
  3. new Button() { Content = "Testbutton", Width = 256, Height = 256, FontSize = 50 }));
  4. AddCube(new Point3D(-2, 1, 0), material);

 

Weiter geht's...

Bei Texturen kann WPF eine große Stärke ausspielen: Steuerelemente können nach Belieben auf 3D Objekte geklebt werden und ermöglichen somit interessante Animationen. Aber auch andere Texturen und Farbverläufe können vergleichsweise einfach gesetzt werden. Das Ausschmücken der 3D-Welt mit schönen Farben und Bildern ist also kein Problem. Im nächsten Kapitel will ich schließlich noch zeigen, wie man auch sehr komplexe Objekte in WPF-Anwendungen einbinden kann.

 

Quellen

 

Siehe auch...

 

Kommentar hinzufügen

Ihr Name:
Kommentar: