Übersicht über 3D-Grafiken3-D Graphics Overview

Mit der 3D3-D-Funktionalität in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) können Entwickler 3D-Grafiken jeweils in Markup- und prozeduralem Code zeichnen, umwandeln und animieren.The 3D3-D functionality in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) enables developers to draw, transform, and animate 3-D graphics in both markup and procedural code. Entwickler können 2D2-D- und 3D3-D-Grafiken kombinieren, um umfassende Steuerelemente zu erstellen, komplexe Illustrationen von Daten bereitstellen oder die Benutzererfahrung einer Anwendungsschnittstelle erweitern.Developers can combine 2D2-D and 3D3-D graphics to create rich controls, provide complex illustrations of data, or enhance the user experience of an application's interface. 3D3-D-Unterstützung in WPFWPF ist nicht dazu da, um eine vollständige Plattform zur Spieleentwicklung bereitzustellen. support in WPFWPF is not designed to provide a full-featured game-development platform. Dieses Thema bietet eine Übersicht über 3D3-D-Funktionen im WPFWPF-Grafiksystem.This topic provides an overview of 3D3-D functionality in the WPFWPF graphics system.

3D in einem 2D-Container3-D in a 2-D Container

3D3-D Grafiken, die Inhalte in WPFWPF wird in einem Element gekapselt Viewport3D, die zweidimensionalen Elementstruktur teilnehmen kann. graphics content in WPFWPF is encapsulated in an element, Viewport3D, that can participate in the two-dimensional element structure. Das Grafiksystem behandelt Viewport3D als ein zweidimensionales visuelles Element, in wie viele andere WPFWPF.The graphics system treats Viewport3D as a two-dimensional visual element like many others in WPFWPF. Viewport3D fungiert als ein Fenster – einen Viewport, in eine dreidimensionale Szene.Viewport3D functions as a window—a viewport—into a three-dimensional scene. Genauer gesagt handelt es sich um eine Oberfläche, auf die eine 3D3-D-Szene projiziert wird.More accurately, it is a surface on which a 3D3-D scene is projected.

In einer konventionellen 2D2-D -Anwendung verwenden Viewport3D wie andere Containerelement wie Raster oder Canvas.In a conventional 2D2-D application, use Viewport3D as you would another container element like Grid or Canvas. Sie können zwar Viewport3D mit anderen 2D2-D Zeichnen von Objekten im gleichen Szenendiagramm, Sie durchdringen können nicht 2D2-D und 3D3-D -Objekte innerhalb einer Viewport3D.Although you can use Viewport3D with other 2D2-D drawing objects in the same scene graph, you cannot interpenetrate 2D2-D and 3D3-D objects within a Viewport3D. Dieses Thema konzentriert sich auf das Zeichnen von 3D3-D Grafiken innerhalb der Viewport3D.This topic will focus on how to draw 3D3-D graphics inside the Viewport3D.

3D-Koordinatenbereich3-D Coordinate Space

Im WPFWPF-Koordinatensystem für 2D2-D-Grafiken befindet sich der Ursprung in der linken oberen Ecke des Renderingbereichs (in der Regel der Bildschirm).The WPFWPF coordinate system for 2D2-D graphics locates the origin in the upper left of the rendering area (typically the screen). Im 2D2-D-System verlaufen die positiven Werte der x-Achse nach rechts und die positiven Werte der y-Achse nach unten.In the 2D2-D system, positive x-axis values proceed to the right and positive y-axis values proceed downward. Im 3D3-D-Koordinatensystem befindet sich der Ursprung hingegen in der Mitte des Renderingbereichs. Die positiven Werte der x-Achse verlaufen auch nach rechts, die positiven Werte der y-Achse verlaufen aber nach oben und die positiven Werte der z-Achse laufen vom Ursprung ausgehend auf den Betrachter zu.In the 3D3-D coordinate system, however, the origin is located in the center of the rendering area, with positive x-axis values proceeding to the right but positive y-axis values proceeding upward instead, and positive z-axis values proceeding outward from the origin, toward the viewer.

KoordinatensystemeCoordinate systems
Darstellungen herkömmlicher 2D- und 3D-KoordinatensystemeConventional 2-D and 3-D coordinate system representations

Der von diesen Achsen definierte Raum ist der feststehende Verweisrahmen für 3D3-D-Objekte in WPFWPF.The space defined by these axes is the stationary frame of reference for 3D3-D objects in WPFWPF. Wenn Sie innerhalb dieses Raumes Modelle erstellen und Lichter und Kameras, um sie anzuzeigen, ist es hilfreich, diesen feststehenden Verweisrahmen oder „Weltenraum“ vom lokalen zu unterscheiden, den Sie beim Anwenden von Transformationen für jedes Modell erstellen.As you build models in this space and create lights and cameras to view them, it's helpful to distinguish this stationary frame of reference, or "world space," from the local frame of reference you create for each model when you apply transformations to it. Beachten Sie außerdem, dass Objekte im Weltenraum je nach der Kamera und den Einstellungen völlig anders oder überhaupt nicht angezeigt werden können. Die Position der Kamera ändert aber nicht die Position von Objekten im Weltenraum.Remember also that objects in world space might look entirely different, or not be visible at all, depending on light and camera settings, but the position of the camera does not change the location of objects in world space.

Kameras und ProjektionenCameras and Projections

Entwickler, die in 2D2-D arbeiten, sind es gewöhnt, zeichnende primitive Typen auf einem zweidimensionalen Bildschirm zu positionieren.Developers who work in 2D2-D are accustomed to positioning drawing primitives on a two-dimensional screen. Beim Erstellen einer 3D3-D-Szene ist es wichtig, dass Sie daran denken, dass Sie wirklich eine 2D2-D-Darstellung von 3D3-D-Objekten erstellen.When you create a 3D3-D scene, it's important to remember that you are really creating a 2D2-D representation of 3D3-D objects. Da eine 3D3-D-Szene je nach Perspektive anders aussieht, müssen Sie diese Perspektive angeben.Because a 3D3-D scene looks different depending on the onlooker's point of view, you must specify that point of view. Die Camera -Klasse ermöglicht Ihnen das Festlegen dieser Sicht für eine 3D3-D Szene.The Camera class allows you to specify this point of view for a 3D3-D scene.

Eine andere Möglichkeit, zu verstehen, wie eine 3D3-D-Szene auf einer 2D2-D-Oberfläche dargestellt wird, ist durch Beschreibung der Szene als eine Projektion auf die Ansichtsoberfläche.Another way to understand how a 3D3-D scene is represented on a 2D2-D surface is by describing the scene as a projection onto the viewing surface. Die ProjectionCamera können Sie angeben, unterschiedliche Vorhersagen und ihre Eigenschaften ändern, wie die Betrachters verändert sieht 3D3-D Modelle.The ProjectionCamera allows you to specify different projections and their properties to change how the onlooker sees 3D3-D models. Ein PerspectiveCamera gibt eine Projektion aus, die die Szene verkürzt.A PerspectiveCamera specifies a projection that foreshortens the scene. Das heißt, die PerspectiveCamera vermittelt-Punkt-Perspektive enthält.In other words, the PerspectiveCamera provides vanishing-point perspective. Sie können die Position der Kamera im Koordinatenbereich der Szene, die Richtung und das Sichtfeld der Kamera und ein Vektor angeben, der die Richtung „nach oben“ in der Szene definiert.You can specify the position of the camera in the coordinate space of the scene, the direction and field of view for the camera, and a vector that defines the direction of "up" in the scene. Das folgende Diagramm veranschaulicht die PerspectiveCamerades Projektion.The following diagram illustrates the PerspectiveCamera's projection.

Die NearPlaneDistance und FarPlaneDistance Eigenschaften ProjectionCamera schränkt den Bereich der Projektion von der Kamera.The NearPlaneDistance and FarPlaneDistance properties of ProjectionCamera limit the range of the camera's projection. Da sich Kameras überall in der Szene befinden können, kann die Kamera auch innerhalb eines Modells oder sehr nah an einem Modell positioniert werden. Dies erschwert ordnungsgemäße die Unterscheidung von Objekten.Because cameras can be located anywhere in the scene, it's possible for the camera to be actually positioned inside a model or very near a model, making it hard to distinguish objects properly. NearPlaneDistance können Sie einen Mindestabstand zwischen der Kamera und Ihrer angeben, jenseits derer Objekte nicht gezeichnet werden.NearPlaneDistance allows you to specify a minimum distance from the camera beyond which objects will not be drawn. Im Gegensatz dazu FarPlaneDistance ermöglicht die Angabe eine Entfernung von der Kamera, jenseits derer Objekte nicht gezeichnet werden, was sicherstellt, dass die Objekte zu weit erkannt werden nicht in der Szene enthalten sind.Conversely, FarPlaneDistance lets you specify a distance from the camera beyond which objects will not be drawn, which ensures that objects too far away to be recognizable won't be included in the scene.

KamerasetupCamera setup
KamerapositionCamera position

OrthographicCamera Gibt eine orthogonale Projektion eine 3D3-D Modell eine 2D2-D visuelle Oberfläche.OrthographicCamera specifies an orthogonal projection of a 3D3-D model to a 2D2-D visual surface. Wie andere Kameras gibt es eine Position, Blickrichtung und die Richtung „nach oben“ an.Like other cameras, it specifies a position, viewing direction, and "upward" direction. Im Gegensatz zu PerspectiveCamera, allerdings OrthographicCamera beschreibt eine Projektion aus, die Verkürzung der Perspektive nicht enthalten ist.Unlike PerspectiveCamera, however, OrthographicCamera describes a projection that does not include perspective foreshortening. Das heißt, OrthographicCamera beschreibt ein Sichtfeld, dessen Seiten parallel statt in einem werden, dessen Seiten in ein Punkt, an die Kamera zu erfüllen.In other words, OrthographicCamera describes a viewing box whose sides are parallel, instead of one whose sides meet in a point at the camera. Die folgende Abbildung zeigt das gleiche Modell, während der Anzeige mit PerspectiveCamera und OrthographicCamera.The following image shows the same model as viewed using PerspectiveCamera and OrthographicCamera.

Orthografische und perspektivische ProjektionOrthographic and perspective projection
Perspektivische und orthografische ProjektionenPerspective and Orthographic Projections

Der folgende Code zeigt einige typische Kameraeinstellungen.The following code shows some typical camera settings.

// Defines the camera used to view the 3D object. In order to view the 3D object,
// the camera must be positioned and pointed such that the object is within view 
// of the camera.
PerspectiveCamera myPCamera = new PerspectiveCamera();

// Specify where in the 3D scene the camera is.
myPCamera.Position = new Point3D(0, 0, 2);

// Specify the direction that the camera is pointing.
myPCamera.LookDirection = new Vector3D(0, 0, -1);

// Define camera's horizontal field of view in degrees.
myPCamera.FieldOfView = 60;

// Asign the camera to the viewport
myViewport3D.Camera = myPCamera;
' Defines the camera used to view the 3D object. In order to view the 3D object,
' the camera must be positioned and pointed such that the object is within view 
' of the camera.
Dim myPCamera As New PerspectiveCamera()

' Specify where in the 3D scene the camera is.
myPCamera.Position = New Point3D(0, 0, 2)

' Specify the direction that the camera is pointing.
myPCamera.LookDirection = New Vector3D(0, 0, -1)

' Define camera's horizontal field of view in degrees.
myPCamera.FieldOfView = 60

' Asign the camera to the viewport
myViewport3D.Camera = myPCamera

Modell- und primitive GittertypenModel and Mesh Primitives

Model3D ist die abstrakte Basisklasse, die eine generische darstellt 3D3-D Objekt.Model3D is the abstract base class that represents a generic 3D3-D object. Zum Erstellen einer 3D3-D Szene, benötigen Sie einige Objekte anzeigen, und die Objekte, die das Szenendiagramm bilden abgeleitet Model3D.To build a 3D3-D scene, you need some objects to view, and the objects that make up the scene graph derive from Model3D. Derzeit ist die WPFWPF unterstützt Modellieren von Geometrien mit GeometryModel3D.Currently, the WPFWPF supports modeling geometries with GeometryModel3D. Die Geometry Eigenschaft dieses Modells akzeptiert ein Netzes primitive.The Geometry property of this model takes a mesh primitive.

Um ein Modell zu erstellen, erstellen Sie zuerst einen primitiven Typen oder ein Gitter.To build a model, begin by building a primitive, or mesh. Ein primitiver 3D3-D-Typ besteht aus einer Auflistung der Vertices, die eine einzelne 3D3-D-Entität bilden.A 3D3-D primitive is a collection of vertices that form a single 3D3-D entity. Die meisten 3D3-D-Systeme bieten primitive Typen, die ausgehend von der einfachsten geschlossenen Figur modelliert wurden: drei durch drei Vertices definiertes Dreieck.Most 3D3-D systems provide primitives modeled on the simplest closed figure: a triangle defined by three vertices. Da die drei Punkte eines Dreiecks auf derselben Ebene liegen, können Sie weiterhin Dreiecke hinzufügen, um komplexere Formen, die Gitter genannt werden, zu modellieren.Because the three points of a triangle are coplanar, you can continue adding triangles in order to model more complex shapes, called meshes.

Die WPFWPF 3D3-D stellt derzeit die MeshGeometry3D -Klasse, womit Sie eine Geometrie angeben; es derzeit nicht unterstützt vordefinierten 3D3-D primitive Typen wie z. B. Kreise und kubische Formen.The WPFWPF 3D3-D system currently provides the MeshGeometry3D class, which allows you to specify any geometry; it does not currently support predefined 3D3-D primitives like spheres and cubic forms. Erstellen einer MeshGeometry3D durch Angeben einer Liste Dreieck Scheitelpunkte als seine Positions Eigenschaft.Begin creating a MeshGeometry3D by specifying a list of triangle vertices as its Positions property. Jede Vertex wird angegeben, wie eine Point3D.Each vertex is specified as a Point3D. (Geben Sie diese Eigenschaft in Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) als eine Liste von Zahlen in Dreiergruppen an, die die Koordinaten der einzelnen Vertices darstellen.) Je nach Geometrie kann das Gitter aus mehreren Dreiecken bestehen, von denen einige dieselben Eckpunkte (Vertices) teilen.(In Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML), specify this property as a list of numbers grouped in threes that represent the coordinates of each vertex.) Depending on its geometry, your mesh might be composed of many triangles, some of which share the same corners (vertices). Um das Gitter ordnungsgemäß zu zeichnen, braucht WPFWPF Informationen darüber, welche Eckpunkte von welchen Dreiecken geteilt werden.To draw the mesh correctly, the WPFWPF needs information about which vertices are shared by which triangles. Diese Informationen bereitzustellen, indem eine Liste der Dreiecksindizes mit der TriangleIndices Eigenschaft.You provide this information by specifying a list of triangle indices with the TriangleIndices property. Diese Liste gibt an, in dem die Punkte im angegebenen, Reihenfolge der Positions Liste wird ein Dreieck bestimmt.This list specifies the order in which the points specified in the Positions list will determine a triangle.

<GeometryModel3D>
  <GeometryModel3D.Geometry>
          <MeshGeometry3D 
              Positions="-1 -1 0  1 -1 0  -1 1 0  1 1 0"
              Normals="0 0 1  0 0 1  0 0 1  0 0 1"
              TextureCoordinates="0 1  1 1  0 0  1 0   "
              TriangleIndices="0 1 2  1 3 2" />
      </GeometryModel3D.Geometry>
      <GeometryModel3D.Material>
          <DiffuseMaterial>
              <DiffuseMaterial.Brush>
                  <SolidColorBrush Color="Cyan" Opacity="0.3"/>
              </DiffuseMaterial.Brush>
          </DiffuseMaterial>
      </GeometryModel3D.Material>
  <!-- Translate the plane. -->
      <GeometryModel3D.Transform>
          <TranslateTransform3D
            OffsetX="2" OffsetY="0" OffsetZ="-1"   >
          </TranslateTransform3D>
      </GeometryModel3D.Transform>
  </GeometryModel3D>

Im vorherigen Beispiel der Positions Liste gibt acht Scheitelpunkte, um einen Cube geformten Mesh zu definieren.In the preceding example, the Positions list specifies eight vertices to define a cube-shaped mesh. Die TriangleIndices Eigenschaft gibt eine Liste der zwölf Gruppen drei Indizes.The TriangleIndices property specifies a list of twelve groups of three indices. Jede Nummer in der Liste bezieht sich auf ein Offset in die Positions Liste.Each number in the list refers to an offset into the Positions list. Beispielsweise die ersten drei Scheitelpunkte gemäß der Positions Liste sind (1,1,0), (0,1,0) und (0,0,0).).For example, the first three vertices specified by the Positions list are (1,1,0), (0,1,0), and (0,0,0). Die ersten drei Indizes, die gemäß der TriangleIndices Liste sind 0, 2 und 1, entsprechen die erste Seite im dritten und zweiten Punkt in der Positions Liste.The first three indices specified by the TriangleIndices list are 0, 2, and 1, which correspond to the first, third, and second points in the Positions list. Daher setzt sich das erste Dreieck, aus dem das Würfelmodells besteht, aus (1,1,0), (0,1,0), (0,0,0) zusammen. Die verbleibenden elf Dreiecke werden ähnlich ermittelt.As a result, the first triangle that makes up the cube model will be composed from (1,1,0) to (0,1,0) to (0,0,0), and the remaining eleven triangles will be determined similarly.

Sie können weiterhin die Modelldefinition durch Angeben von Werten für die Normals und TextureCoordinates Eigenschaften.You can continue defining the model by specifying values for the Normals and TextureCoordinates properties. Um die Oberfläche des Modells zu rendern, benötigt das Grafiksystem Informationen darüber, in welche Richtung die Oberfläche bei jedem gegebenen Dreieck zeigt.To render the surface of the model, the graphics system needs information about which direction the surface is facing at any given triangle. Diese Informationen werden dazu verwendet, die Beleuchtung für das Modell zu berechnen: Flächen, die einer Lichtquelle direkt zugewendet sind, erscheinen heller als solche, die von Licht abgewandt sind.It uses this information to make lighting calculations for the model: surfaces that face directly towards a light source appear brighter than those angled away from the light. Obwohl WPFWPF die Standardnormalvektoren mithilfe der Positionskoordinaten ermitteln kann, können Sie auch verschiedene Normalvektoren angeben, um sich der Darstellung von gekrümmten Oberflächen zu nähern.Though the WPFWPF can determine default normal vectors by using the position coordinates, you can also specify different normal vectors to approximate the appearance of curved surfaces.

Die TextureCoordinates Eigenschaft gibt eine Auflistung von Pointe, die die Grafiksystem wird gezeigt, wie die Koordinaten zuzuordnen, die bestimmen, wie eine Struktur, die die Eckpunkte des Netzes gezeichnet wird.The TextureCoordinates property specifies a collection of Points that tell the graphics system how to map the coordinates that determine how a texture is drawn to the vertices of the mesh. TextureCoordinates als Wert zwischen 0 (null) bis 1, angegeben sind.TextureCoordinates are specified as a value between zero and 1, inclusive. Wie bei der Normals -Eigenschaft berechnet das Grafiksystem kann als Standardwert Texturkoordinaten, aber Sie können entscheiden, legen Sie die Zuordnung einer Textur zu steuern, die Teil einer sich wiederholenden, z. B. enthält verschiedene Texturkoordinaten.As with the Normals property, the graphics system can calculate default texture coordinates, but you might choose to set different texture coordinates to control the mapping of a texture that includes part of a repeating pattern, for example. Weitere Informationen zu Texturkoordinaten finden Sie in den nachfolgenden Themen oder im Managed Direct3D SDK.More information about texture coordinates can be found in subsequent topics or in the Managed Direct3D SDK.

Im folgenden Beispiel wird veranschaulicht, wie eine Seite des Würfelmodells in prozeduralem Code erstellt wird.The following example shows how to create one face of the cube model in procedural code. Beachten Sie, dass Sie den gesamten Würfel als einzelnes GeometryModel3D zeichnen können. In diesem Beispiel wird die Würfelseite als unterschiedliches Modell gezeichnet, um später separate Texturen auf die einzelnen Seiten anzuwenden.Note that you can draw the entire cube as a single GeometryModel3D; this example draws the cube's face as a distinct model in order to apply separate textures to each face later.

MeshGeometry3D side1Plane = new MeshGeometry3D();
Private side1Plane As New MeshGeometry3D()
side1Plane.Positions.Add(new Point3D(-0.5, -0.5, -0.5));
side1Plane.Positions.Add(new Point3D(-0.5, 0.5, -0.5));
side1Plane.Positions.Add(new Point3D(0.5, 0.5, -0.5));
side1Plane.Positions.Add(new Point3D(0.5, 0.5, -0.5));
side1Plane.Positions.Add(new Point3D(0.5, -0.5, -0.5));
side1Plane.Positions.Add(new Point3D(-0.5, -0.5, -0.5));

side1Plane.TriangleIndices.Add(0);
side1Plane.TriangleIndices.Add(1);
side1Plane.TriangleIndices.Add(2);
side1Plane.TriangleIndices.Add(3);
side1Plane.TriangleIndices.Add(4);
side1Plane.TriangleIndices.Add(5);

side1Plane.Normals.Add(new Vector3D(0, 0, -1));
side1Plane.Normals.Add(new Vector3D(0, 0, -1));
side1Plane.Normals.Add(new Vector3D(0, 0, -1));
side1Plane.Normals.Add(new Vector3D(0, 0, -1));
side1Plane.Normals.Add(new Vector3D(0, 0, -1));
side1Plane.Normals.Add(new Vector3D(0, 0, -1));

side1Plane.TextureCoordinates.Add(new Point(1, 0));
side1Plane.TextureCoordinates.Add(new Point(1, 1));
side1Plane.TextureCoordinates.Add(new Point(0, 1));
side1Plane.TextureCoordinates.Add(new Point(0, 1));
side1Plane.TextureCoordinates.Add(new Point(0, 0));
side1Plane.TextureCoordinates.Add(new Point(1, 0));
side1Plane.Positions.Add(New Point3D(-0.5, -0.5, -0.5))
side1Plane.Positions.Add(New Point3D(-0.5, 0.5, -0.5))
side1Plane.Positions.Add(New Point3D(0.5, 0.5, -0.5))
side1Plane.Positions.Add(New Point3D(0.5, 0.5, -0.5))
side1Plane.Positions.Add(New Point3D(0.5, -0.5, -0.5))
side1Plane.Positions.Add(New Point3D(-0.5, -0.5, -0.5))

side1Plane.TriangleIndices.Add(0)
side1Plane.TriangleIndices.Add(1)
side1Plane.TriangleIndices.Add(2)
side1Plane.TriangleIndices.Add(3)
side1Plane.TriangleIndices.Add(4)
side1Plane.TriangleIndices.Add(5)

side1Plane.Normals.Add(New Vector3D(0, 0, -1))
side1Plane.Normals.Add(New Vector3D(0, 0, -1))
side1Plane.Normals.Add(New Vector3D(0, 0, -1))
side1Plane.Normals.Add(New Vector3D(0, 0, -1))
side1Plane.Normals.Add(New Vector3D(0, 0, -1))
side1Plane.Normals.Add(New Vector3D(0, 0, -1))

side1Plane.TextureCoordinates.Add(New Point(1, 0))
side1Plane.TextureCoordinates.Add(New Point(1, 1))
side1Plane.TextureCoordinates.Add(New Point(0, 1))
side1Plane.TextureCoordinates.Add(New Point(0, 1))
side1Plane.TextureCoordinates.Add(New Point(0, 0))
side1Plane.TextureCoordinates.Add(New Point(1, 0))

Anwenden von Materialien auf das ModellApplying Materials to the Model

Damit ein Gitter wie ein dreidimensionales Objekt aussieht, muss eine Textur darauf angewendet werden, die die von den Vertices und Dreiecken definierte Fläche abdeckt, sodass es beleuchtet und von der Kamera projiziert werden kann.For a mesh to look like a three-dimensional object, it must have an applied texture to cover the surface defined by its vertices and triangles so it can be lit and projected by the camera. In 2D2-D, verwenden Sie die Brush Klasse, um Farben, Muster, Verläufe oder anderen visuellen Inhalt auf Bereiche des Bildschirms angewendet werden sollen.In 2D2-D, you use the Brush class to apply colors, patterns, gradients, or other visual content to areas of the screen. Die Darstellung von 3D3-D-Objekten ist eine Funktion des Beleuchtungsmodells und nicht nur des der Farbe oder des Musters, die darauf angewendet werden.The appearance of 3D3-D objects, however, is a function of the lighting model, not just of the color or pattern applied to them. Reale Objekte reflektieren Licht unterschiedlich, je nach der Qualität ihrer Oberflächen: glänzende und leuchtende Oberflächen sehen anders aus als raue oder matte Oberflächen, und einige Objekte scheinen Licht zu absorbieren, während andere leuchten.Real-world objects reflect light differently depending on the quality of their surfaces: glossy and shiny surfaces don't look the same as rough or matte surfaces, and some objects seem to absorb light while others glow. Sie können dieselben Pinsel auf 3D3-D-Objekte anwenden, die Sie auch auf 2D2-D-Objekte anwenden können, allerdings nicht direkt.You can apply all the same brushes to 3D3-D objects that you can apply to 2D2-D objects, but you can't apply them directly.

Zum Definieren der Merkmale der Oberfläche für ein Modell, WPFWPF verwendet die Material abstrakte Klasse.To define the characteristics of a model's surface, WPFWPF uses the Material abstract class. Die konkreten Unterklassen von „Material“ bestimmen einige der Darstellungseigenschaften der Modelloberfläche und stellen jeweils eine Pinseleigenschaft bereit, der Sie ein SolidColorBrush, TileBrush oder VisualBrush übergeben können.The concrete subclasses of Material determine some of the appearance characteristics of the model's surface, and each also provides a Brush property to which you can pass a SolidColorBrush, TileBrush, or VisualBrush.

  • DiffuseMaterial Gibt an, dass es sich bei der Pinsel für das Modell angewendet werden soll, als wäre das Modell diffus beleuchtet.DiffuseMaterial specifies that the brush will be applied to the model as though that model were lit diffusely. Die Verwendung von DiffuseMaterial ähnelt am stärksten der direkten Verwendung auf 2D2-D-Modelle. Modelloberflächen reflektieren das Licht nicht, als ob sie glänzen würden.Using DiffuseMaterial most resembles using brushes directly on 2D2-D models; model surfaces do not reflect light as though shiny.

  • SpecularMaterial Gibt an, dass es sich bei der Pinsel für das Modell angewendet werden soll, als wäre das Modell schwer oder glänzend und der Darstellung des Highlights kann.SpecularMaterial specifies that the brush will be applied to the model as though the model's surface were hard or shiny, capable of reflecting highlights. Sie können den Grad, zu dem die Textur schlägt diese Reflektierend Qualität oder "ergänzen," festgelegt, indem Sie einen Wert für die SpecularPower Eigenschaft.You can set the degree to which the texture will suggest this reflective quality, or "shine," by specifying a value for the SpecularPower property.

  • EmissiveMaterial können Sie angeben, dass die Struktur angewendet wird, als wäre das Modell wurden Licht abgibt, die Farbe des Pinsels ausgeben.EmissiveMaterial allows you to specify that the texture will be applied as though the model were emitting light equal to the color of the brush. Dies macht das Modell nicht zu Licht. Schatteneffekte werden jedoch anders dargestellt, als mit DiffuseMaterial oder SpecularMaterial.This does not make the model a light; however, it will participate differently in shadowing than it would if textured with DiffuseMaterial or SpecularMaterial.

Für eine bessere Leistung, die Flächen von einer GeometryModel3D (diese Flächen, die aus der Ansicht sind, da auf der entgegengesetzten Seite des Modells von der Kamera) aus der Szene entfernt werden.For better performance, the backfaces of a GeometryModel3D (those faces that are out of view because they are on the opposite side of the model from the camera) are culled from the scene. Angeben einer Material um auf die rückwärtige eines Modells wie eine Ebene anzuwenden, legen Sie des Modells BackMaterial Eigenschaft.To specify a Material to apply to the backface of a model like a plane, set the model's BackMaterial property.

Um einige Oberflächenqualitäten zu erzielen, z.B. ein Leuchten oder reflektierende Effekte, können Sie nacheinander mehrere unterschiedliche Pinsel auf ein Modell anwenden.To achieve some surface qualities, like glowing or reflective effects, you might want to apply several different brushes to a model in succession. Sie können anwenden und mehrere Materialien wiederverwenden, indem die MaterialGroup Klasse.You can apply and reuse multiple Materials by using the MaterialGroup class. Die untergeordneten Elemente von MaterialGroup werden nacheinander in mehreren Renderingdurchläufen angewendet.The children of the MaterialGroup are applied first to last in multiple rendering passes.

In den folgenden Codebeispiele wird gezeigt, wie eine Volltonfarbe und eine Zeichnung als Pinsel auf 3D3-D-Modelle angewendet wird.The following code examples show how to apply a solid color and a drawing as brushes to 3D3-D models.

<GeometryModel3D.Material>
    <DiffuseMaterial>
        <DiffuseMaterial.Brush>
            <SolidColorBrush Color="Cyan" Opacity="0.3"/>
        </DiffuseMaterial.Brush>
    </DiffuseMaterial>
</GeometryModel3D.Material>
<DrawingBrush x:Key="patternBrush" Viewport="0,0,0.1,0.1" TileMode="Tile">
  <DrawingBrush.Drawing>
    <DrawingGroup>
      <DrawingGroup.Children>
        <GeometryDrawing Geometry="M0,0.1 L0.1,0 1,0.9, 0.9,1z"
          Brush="Gray" />
        <GeometryDrawing Geometry="M0.9,0 L1,0.1 0.1,1 0,0.9z"
          Brush="Gray" />
        <GeometryDrawing Geometry="M0.25,0.25 L0.5,0.125 0.75,0.25 0.5,0.5z"
          Brush="#FFFF00" />
        <GeometryDrawing Geometry="M0.25,0.75 L0.5,0.875 0.75,0.75 0.5,0.5z"
          Brush="Black" />
        <GeometryDrawing Geometry="M0.25,0.75 L0.125,0.5 0.25,0.25 0.5,0.5z"
          Brush="#FF0000" />
        <GeometryDrawing Geometry="M0.75,0.25 L0.875,0.5 0.75,0.75 0.5,0.5z"
          Brush="MediumBlue" />
      </DrawingGroup.Children>
    </DrawingGroup>
  </DrawingBrush.Drawing>
</DrawingBrush>
DiffuseMaterial side5Material = new DiffuseMaterial((Brush)Application.Current.Resources["patternBrush"]);
Dim side5Material As New DiffuseMaterial(CType(Application.Current.Resources("patternBrush"), Brush))

Beleuchten der SzeneIlluminating the Scene

Lichter in 3D3-D-Grafiken verhalten sich genauso wie Lichter in der realen Welt: Sie beleuchten Oberflächen.Lights in 3D3-D graphics do what lights do in the real world: they make surfaces visible. Genauer gesagt bestimmen Lichter, welcher Teil einer Szene auch Teil der Projektion ist.More to the point, lights determine what part of a scene will be included in the projection. Helle Objekte in WPFWPF erzeugen eine Vielzahl von Licht- und Schatteneffekten und werden nach dem Verhalten verschiedener realer Lichter modelliert.Light objects in WPFWPF create a variety of light and shadow effects and are modeled after the behavior of various real-world lights. Sie müssen mindestens ein Licht in Ihre Szene aufnehmen, andernfalls sind keine Modelle sichtbar.You must include at least one light in your scene, or no models will be visible.

Die folgenden LEDs leiten Sie von der Basisklasse Light:The following lights derive from the base class Light:

  • AmbientLight: Bietet ambient Beleuchtung, die alle Objekte unabhängig von deren Speicherort oder die Ausrichtung gleichmäßig beleuchtet.AmbientLight: Provides ambient lighting that illuminates all objects uniformly regardless of their location or orientation.

  • DirectionalLight: Beleuchtet wie eine entfernte Lichtquelle.DirectionalLight: Illuminates like a distant light source. Direktionale Lichtquellen haben eine Direction angegeben, wie ein Vector3D, jedoch keine angegebenen Speicherort.Directional lights have a Direction specified as a Vector3D, but no specified location.

  • PointLight: Beleuchtet wie eine nahe gelegene Lichtquelle.PointLight: Illuminates like a nearby light source. PointLights verfügen über eine Position und senden Licht von dieser Position aus.PointLights have a position and cast light from that position. Objekte in der Szene werden je nach deren Position und Abstand von der Lichtquelle beleuchtet.Objects in the scene are illuminated depending on their position and distance with respect to the light. PointLightBase macht eine Range -Eigenschaft, die Entfernung bestimmt, jenseits derer Modelle nicht durch das Licht beleuchtet werden.PointLightBase exposes a Range property, which determines a distance beyond which models will not be illuminated by the light. PointLight macht außerdem Lichtabnahmeeigenschaften verfügbar, die bestimmen, wie die Lichtintensität mit der Entfernung abnimmt.PointLight also exposes attenuation properties which determine how the light's intensity diminishes over distance. Sie können die konstante, lineare oder quadratische Interpolationen für die Lichtabnahme angeben.You can specify constant, linear, or quadratic interpolations for the light's attenuation.

  • SpotLight: Erbt von PointLight.SpotLight: Inherits from PointLight. Scheinwerfer beleuchten wie PointLight und weisen sowohl eine Position als auch eine Richtung auf.Spotlights illuminate like PointLight and have both position and direction. Projizieren sie das Licht in einem Kegel geformten Bereich festlegen, indem InnerConeAngle und OuterConeAngle Eigenschaften, die in Grad angegeben.They project light in a cone-shaped area set by InnerConeAngle and OuterConeAngle properties, specified in degrees.

Leuchten Model3D Objekte, sodass Sie transformieren und helle Eigenschaften animieren, einschließlich der Position, Farbe, Richtung und Bereich können.Lights are Model3D objects, so you can transform and animate light properties, including position, color, direction, and range.

<ModelVisual3D.Content>
    <AmbientLight Color="#333333" />
</ModelVisual3D.Content>
DirectionalLight myDirLight = new DirectionalLight();
Private myDirLight As New DirectionalLight()
myDirLight.Color = Colors.White;
myDirLight.Direction = new Vector3D(-3, -4, -5);
myDirLight.Color = Colors.White
myDirLight.Direction = New Vector3D(-3, -4, -5)
modelGroup.Children.Add(myDirLight);
modelGroup.Children.Add(myDirLight)

Transformieren von ModellenTransforming Models

Wenn Sie Modelle erstellen, verfügen diese über eine bestimmte Position in der Szene.When you create models, they have a particular location in the scene. Um die Position dieser Modelle in der Szene zu verändern, sie zu drehen oder ihre Größe zu ändern, sollten Sie nicht die Vertices ändern, die die Modelle selbst definieren.To move those models around in the scene, to rotate them, or to change their size, it's not practical to change the vertices that define the models themselves. Wenden Sie stattdessen wie in 2D2-D-Modellen Transformationen auf Modelle an.Instead, just as in 2D2-D, you apply transformations to models.

Jedes Modellobjekt verfügt über eine Transform Eigenschaft mit dem verschieben, neu ausrichten oder Ändern der Größe des Modells.Each model object has a Transform property with which you can move, re-orient, or resize the model. Wenn Sie eine Transformation anwenden, versetzen Sie alle Punkte des Modells durch den in der Transformation angegebenen Vektor oder Wert.When you apply a transform, you effectively offset all the points of the model by whatever vector or value specified by the transform. Sie haben also den Koordinatenbereich transformiert, in dem das Modell definiert ist (Modellraum), aber Sie haben noch nicht die Werte geändert, die die Geometrie des Modells im Koordinatensystem der gesamten Szene („Weltenraum“) ausmachen.In other words, you've transformed the coordinate space in which the model is defined ("model space"), but you haven't changed the values that make up the model's geometry in the coordinate system of the entire scene ("world space").

Weitere Informationen zum Transformieren von Modellen finden Sie unter Übersicht über 3D-Transformationen.For more information about transforming models, see 3-D Transformations Overview.

Animieren von ModellenAnimating Models

Die WPFWPF-3D3-D-Implementierung gehört dem gleichen Zeitsteuerungs- und Animationssystem an wie die 2D2-D-Grafiken.The WPFWPF 3D3-D implementation participates in the same timing and animation system as 2D2-D graphics. Das heißt, dass Sie die Eigenschaften von dessen Modellen animieren müssen, um eine 3D-Szene zu animieren.In other words, to animate a 3-D scene, animate the properties of its models. Es ist möglich, die Eigenschaften von primitiven Typen direkt zu animieren. In der Regel ist es aber einfacher, Transformationen zu animieren, die die Position oder die Darstellung von Modellen ändern.It's possible to animate properties of primitives directly, but it's typically easier to animate transformations that change the position or appearance of models. Da Transformationen können, um angewendet werden Model3DGroup -Objekte sowie einzelne Modelle ist es möglich, einen Satz von Animationen auf ein untergeordnetes Element von einem Model3DGroup und einen anderen Satz von Animationen auf eine Gruppe von untergeordneten Objekten anwenden.Because transformations can be applied to Model3DGroup objects as well as individual models, it's possible to apply one set of animations to a child of a Model3DGroup and another set of animations to a group of child objects. Sie können eine Vielzahl von visuellen Effekten erzielen, indem Sie die Eigenschaften der Beleuchtung Ihrer Szene animieren.You can also achieve a variety of visual effects by animating the properties of your scene's lighting. Schließlich können Sie ggf. die Projektion selbst animieren, indem Sie die Kameraposition oder das Sichtfeld animieren.Finally, you might choose to animate the projection itself by animating the camera position or field of view. Hintergrundinformationen zum Zeitsteuerungs- und Animationssystem von WPFWPF finden Sie in den Themen Übersicht über Animationen, Übersicht über Storyboards und Übersicht über Freezable-Objekte.For background information on the WPFWPF timing and animation system, see the Animation Overview, Storyboards Overview, and Freezable Objects Overview topics.

Um ein Objekt in WPFWPF zu animieren, erstellen Sie eine Zeitachse, definieren Sie eine Animation (die im Zeitablauf eine tatsächliche Änderung einiger Eigenschaftswerte darstellt), und geben Sie die Eigenschaft an, auf die die Animation angewendet werden soll.To animate an object in WPFWPF, you create a timeline, define an animation (which is really a change in some property value over time), and specify the property to which to apply the animation. Da alle Objekte in einer 3D3-D Szene sind untergeordnete Elemente des Viewport3D, die Eigenschaften, die Animationen in der Szene anwenden möchten, sind Eigenschaften von Viewport3D Eigenschaften.Because all the objects in a 3D3-D scene are children of Viewport3D, the properties targeted by any animation you want to apply to the scene are properties of properties of Viewport3D.

Angenommen, ein Modell soll an seiner Position als wackelnd angezeigt werden.Suppose you want to make a model appear to wobble in place. Sie können entscheiden, gelten eine RotateTransform3D für das Modell und seine Rotationsachse aus einem Vektor in einen anderen animieren.You might choose to apply a RotateTransform3D to the model, and animate the axis of its rotation from one vector to another. Das folgende Codebeispiel veranschaulicht die Anwendung einer Vector3DAnimation auf die Achseneigenschaft der Rotation3D-Klasse der Transformation unter der Annahme, dass RotateTransform3D eine der vielen Transformationen darstellt, die auf das Modell mit TransformGroup angewendet werden.The following code example demonstrates applying a Vector3DAnimation to the Axis property of the transformation's Rotation3D, assuming the RotateTransform3D to be one of several transforms applied to the model with a TransformGroup.

//Define a rotation
RotateTransform3D myRotateTransform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 1));
'Define a rotation
Dim myRotateTransform As New RotateTransform3D(New AxisAngleRotation3D(New Vector3D(0, 1, 0), 1))
Vector3DAnimation myVectorAnimation = new Vector3DAnimation(new Vector3D(-1, -1, -1), new Duration(TimeSpan.FromMilliseconds(5000)));
myVectorAnimation.RepeatBehavior = RepeatBehavior.Forever;
Dim myVectorAnimation As New Vector3DAnimation(New Vector3D(-1, -1, -1), New Duration(TimeSpan.FromMilliseconds(5000)))
myVectorAnimation.RepeatBehavior = RepeatBehavior.Forever
myRotateTransform.Rotation.BeginAnimation(AxisAngleRotation3D.AxisProperty, myVectorAnimation);
myRotateTransform.Rotation.BeginAnimation(AxisAngleRotation3D.AxisProperty, myVectorAnimation)
//Add transformation to the model
cube1TransformGroup.Children.Add(myRotateTransform);
'Add transformation to the model
cube1TransformGroup.Children.Add(myRotateTransform)

Hinzufügen von 3D-Inhalt zum FensterAdd 3-D Content to the Window

Zum Rendern der Szene hinzufügen, Modelle und leuchten auf eine Model3DGroup, legen Sie dann die Model3DGroup als die Content von einer ModelVisual3D.To render the scene, add models and lights to a Model3DGroup, then set the Model3DGroup as the Content of a ModelVisual3D. Hinzufügen der ModelVisual3D auf die Children Auflistung von der Viewport3D.Add the ModelVisual3D to the Children collection of the Viewport3D. Fügen Sie Kameras, um die Viewport3D durch Festlegen seiner Camera Eigenschaft.Add cameras to the Viewport3D by setting its Camera property.

Fügen Sie schließlich die Viewport3D an das Fenster.Finally, add the Viewport3D to the window. Wenn die Viewport3D enthalten ist, wie der Inhalt eines Layoutelements wie Zeichenbereich, Angeben der Größe der Viewport3D durch Festlegen seiner Height und Width Eigenschaften (geerbt von FrameworkElement).When the Viewport3D is included as the content of a layout element like Canvas, specify the size of the Viewport3D by setting its Height and Width properties (inherited from FrameworkElement).

<UserControl x:Class="HostingWpfUserControlInWf.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    >
  
    <Grid>

      <!-- Place a Label control at the top of the view. -->
      <Label 
                HorizontalAlignment="Center" 
                TextBlock.TextAlignment="Center" 
                FontSize="20" 
                Foreground="Red" 
                Content="Model: Cone"/>

      <!-- Viewport3D is the rendering surface. -->
      <Viewport3D Name="myViewport" >

        <!-- Add a camera. -->
        <Viewport3D.Camera>
          <PerspectiveCamera 
                        FarPlaneDistance="20" 
                        LookDirection="0,0,1" 
                        UpDirection="0,1,0" 
                        NearPlaneDistance="1" 
                        Position="0,0,-3" 
                        FieldOfView="45" />
        </Viewport3D.Camera>

        <!-- Add models. -->
        <Viewport3D.Children>

          <ModelVisual3D>
            <ModelVisual3D.Content>

              <Model3DGroup >
                <Model3DGroup.Children>

                  <!-- Lights, MeshGeometry3D and DiffuseMaterial objects are added to the ModelVisual3D. -->
                  <DirectionalLight Color="#FFFFFFFF" Direction="3,-4,5" />

                  <!-- Define a red cone. -->
                  <GeometryModel3D>

                    <GeometryModel3D.Geometry>
                      <MeshGeometry3D 
    Positions="0.293893 -0.5 0.404509  0.475528 -0.5 0.154509  0 0.5 0  0.475528 -0.5 0.154509  0 0.5 0  0 0.5 0  0.475528 -0.5 0.154509  0.475528 -0.5 -0.154509  0 0.5 0  0.475528 -0.5 -0.154509  0 0.5 0  0 0.5 0  0.475528 -0.5 -0.154509  0.293893 -0.5 -0.404509  0 0.5 0  0.293893 -0.5 -0.404509  0 0.5 0  0 0.5 0  0.293893 -0.5 -0.404509  0 -0.5 -0.5  0 0.5 0  0 -0.5 -0.5  0 0.5 0  0 0.5 0  0 -0.5 -0.5  -0.293893 -0.5 -0.404509  0 0.5 0  -0.293893 -0.5 -0.404509  0 0.5 0  0 0.5 0  -0.293893 -0.5 -0.404509  -0.475528 -0.5 -0.154509  0 0.5 0  -0.475528 -0.5 -0.154509  0 0.5 0  0 0.5 0  -0.475528 -0.5 -0.154509  -0.475528 -0.5 0.154509  0 0.5 0  -0.475528 -0.5 0.154509  0 0.5 0  0 0.5 0  -0.475528 -0.5 0.154509  -0.293892 -0.5 0.404509  0 0.5 0  -0.293892 -0.5 0.404509  0 0.5 0  0 0.5 0  -0.293892 -0.5 0.404509  0 -0.5 0.5  0 0.5 0  0 -0.5 0.5  0 0.5 0  0 0.5 0  0 -0.5 0.5  0.293893 -0.5 0.404509  0 0.5 0  0.293893 -0.5 0.404509  0 0.5 0  0 0.5 0  " 
    Normals="0.7236065,0.4472139,0.5257313  0.2763934,0.4472138,0.8506507  0.5308242,0.4294462,0.7306172  0.2763934,0.4472138,0.8506507  0,0.4294458,0.9030925  0.5308242,0.4294462,0.7306172  0.2763934,0.4472138,0.8506507  -0.2763934,0.4472138,0.8506507  0,0.4294458,0.9030925  -0.2763934,0.4472138,0.8506507  -0.5308242,0.4294462,0.7306172  0,0.4294458,0.9030925  -0.2763934,0.4472138,0.8506507  -0.7236065,0.4472139,0.5257313  -0.5308242,0.4294462,0.7306172  -0.7236065,0.4472139,0.5257313  -0.858892,0.429446,0.279071  -0.5308242,0.4294462,0.7306172  -0.7236065,0.4472139,0.5257313  -0.8944269,0.4472139,0  -0.858892,0.429446,0.279071  -0.8944269,0.4472139,0  -0.858892,0.429446,-0.279071  -0.858892,0.429446,0.279071  -0.8944269,0.4472139,0  -0.7236065,0.4472139,-0.5257313  -0.858892,0.429446,-0.279071  -0.7236065,0.4472139,-0.5257313  -0.5308242,0.4294462,-0.7306172  -0.858892,0.429446,-0.279071  -0.7236065,0.4472139,-0.5257313  -0.2763934,0.4472138,-0.8506507  -0.5308242,0.4294462,-0.7306172  -0.2763934,0.4472138,-0.8506507  0,0.4294458,-0.9030925  -0.5308242,0.4294462,-0.7306172  -0.2763934,0.4472138,-0.8506507  0.2763934,0.4472138,-0.8506507  0,0.4294458,-0.9030925  0.2763934,0.4472138,-0.8506507  0.5308249,0.4294459,-0.7306169  0,0.4294458,-0.9030925  0.2763934,0.4472138,-0.8506507  0.7236068,0.4472141,-0.5257306  0.5308249,0.4294459,-0.7306169  0.7236068,0.4472141,-0.5257306  0.8588922,0.4294461,-0.27907  0.5308249,0.4294459,-0.7306169  0.7236068,0.4472141,-0.5257306  0.8944269,0.4472139,0  0.8588922,0.4294461,-0.27907  0.8944269,0.4472139,0  0.858892,0.429446,0.279071  0.8588922,0.4294461,-0.27907  0.8944269,0.4472139,0  0.7236065,0.4472139,0.5257313  0.858892,0.429446,0.279071  0.7236065,0.4472139,0.5257313  0.5308242,0.4294462,0.7306172  0.858892,0.429446,0.279071  "                   TriangleIndices="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 " />
                    </GeometryModel3D.Geometry>

                    <GeometryModel3D.Material>
                      <DiffuseMaterial>
                        <DiffuseMaterial.Brush>
                          <SolidColorBrush 
                            Color="Red" 
                            Opacity="1.0"/>
                        </DiffuseMaterial.Brush>
                      </DiffuseMaterial>
                    </GeometryModel3D.Material>

                  </GeometryModel3D>

                </Model3DGroup.Children>
              </Model3DGroup>

            </ModelVisual3D.Content>

          </ModelVisual3D>

        </Viewport3D.Children>

      </Viewport3D>
    </Grid>
  
</UserControl>

Siehe auchSee Also

Viewport3D
PerspectiveCamera
DirectionalLight
Material
Übersicht über 3D-Transformationen3-D Transformations Overview
Maximieren der 3D-Leistung von WPFMaximize WPF 3D Performance
Themen zu VorgehensweisenHow-to Topics
Übersicht über Formen und die grundlegenden Funktionen zum Zeichnen in WPFShapes and Basic Drawing in WPF Overview
Zeichnen mit Bildern, Zeichnungen und visuellen ElementenPainting with Images, Drawings, and Visuals