Sdílet prostřednictvím


Přehled 3D grafiky

Funkce 3D ve Windows Presentation Foundation (WPF) umožňuje vývojářům kreslit, transformovat a animovat 3D grafiku v kódu přirážky i procedurálního kódu. Vývojáři můžou kombinovat 2D a 3D grafiku a vytvářet bohaté ovládací prvky, poskytovat složité ilustrace dat nebo vylepšit uživatelské prostředí rozhraní aplikace. Podpora 3D ve WPF není navržená tak, aby poskytovala plnohodnotnou platformu pro vývoj her. Toto téma obsahuje přehled 3D funkcí v grafickém systému WPF.

3D v 2D kontejneru

3D grafický obsah wpF je zapouzdřen v elementu, Viewport3Dkterý se může účastnit dvourozměrné struktury elementu. Grafický systém považuje Viewport3D dvojrozměrný vizuální prvek jako mnoho dalších prvků WPF. Viewport3D funguje jako okno – oblast zobrazení – do trojrozměrné scény. Přesněji řečeno, jedná se o povrch, na kterém se promítá 3D scéna.

V konvenční 2D aplikaci použijte Viewport3D stejně jako jiný prvek kontejneru, jako je Grid nebo Canvas. I když můžete použít Viewport3D s jinými 2D nakreslenými objekty ve stejném grafu scény, nemůžete interpenetrate 2D a 3D objekty v rámci objektu Viewport3D. Toto téma se zaměří na to, jak kreslit 3D grafiku Viewport3Duvnitř .

Prostor souřadnic 3D

Souřadnicový systém WPF pro 2D grafiku vyhledá původ v levém horním rohu oblasti vykreslování (obvykle na obrazovce). V 2D systému se kladné hodnoty osy x posunou doprava a kladné hodnoty osy y se posunou směrem dolů. V 3D souřadnicovém systému je však původ umístěn ve středu vykreslovací oblasti, přičemž kladné hodnoty osy x budou pokračovat doprava, ale kladné hodnoty osy y budou pokračovat vzhůru a kladné hodnoty osy z směrem od počátku směrem k prohlížeči.

Coordinate systems
Konvenční reprezentace 2D a 3D souřadnicového systému

Prostor definovaný těmito osami je statický rámec odkazu pro 3D objekty ve WPF. Při vytváření modelů v tomto prostoru a vytváření světel a kamer pro jejich prohlížení je užitečné odlišit tento statický rámec odkazu nebo "světový prostor" od místního rámce odkazu, který vytvoříte pro každý model při použití transformací. Mějte také na paměti, že objekty ve světě mohou vypadat úplně jinak, nebo nemusí být viditelné vůbec v závislosti na nastavení světla a kamery, ale umístění kamery nezmění umístění objektů ve světě vesmíru.

Kamera a projekce

Vývojáři, kteří pracují ve 2D, jsou zvyklí na umístění primitiv kreslení na dvojrozměrné obrazovce. Při vytváření 3D scény je důležité si uvědomit, že opravdu vytváříte 2D reprezentaci 3D objektů. Vzhledem k tomu, že 3D scéna vypadá jinak v závislosti na pohledulookera, musíte určit tento pohled. Třída Camera umožňuje určit tento pohled pro 3D scénu.

Dalším způsobem, jak pochopit, jak je 3D scéna reprezentována na 2D povrchu, je popis scény jako projekce na prohlížecí plochu. Umožňuje ProjectionCamera zadat různé projekce a jejich vlastnosti a změnit způsob zobrazení 3D modelů. Určuje PerspectiveCamera projekci, která předepisuje scénu. Jinými slovy, poskytuje PerspectiveCamera zmizet perspektivu. Můžete určit pozici kamery v souřadnicovém prostoru scény, směr a pole zobrazení kamery a vektor, který definuje směr "nahoru" ve scéně. Následující diagram znázorňuje PerspectiveCameraprojekci.

Vlastnosti NearPlaneDistance a FarPlaneDistance omezení ProjectionCamera rozsahu projekce kamery. Vzhledem k tomu, že kamery mohou být umístěny kdekoli ve scéně, je možné, že fotoaparát bude skutečně umístěn uvnitř modelu nebo velmi blízko modelu, takže je obtížné správně odlišit objekty. NearPlaneDistance umožňuje určit minimální vzdálenost od kamery, za kterou objekty nebudou kresleny. Naopak FarPlaneDistance umožňuje určit vzdálenost od kamery, za kterou objekty nebudou kresleny, což zajišťuje, že objekty příliš daleko, aby byly rozpoznatelné, nebudou zahrnuty do scény.

Camera setup
pozice Kamera

OrthographicCamera určuje orthogonální projekci 3D modelu na 2D vizuální plochu. Stejně jako ostatní kamery určuje pozici, směr zobrazení a směrem nahoru. Na rozdíl od PerspectiveCameravšak popisuje projekce, OrthographicCamera která nezahrnuje perspektivu proeshortening. Jinými slovy, popisuje pole pro zobrazení, OrthographicCamera jehož strany jsou paralelní, místo jedné strany, jejichž strany se setkávají v místě na fotoaparátu. Následující obrázek ukazuje stejný model jako zobrazený pomocí PerspectiveCamera a OrthographicCamera.

Orthographic and perspective projection
Perspektivní a ortografické projekce

Následující kód ukazuje některá typická nastavení fotoaparátu.

// 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

Primitiva modelu a sítě

Model3D je abstraktní základní třída, která představuje obecný 3D objekt. K vytvoření 3D scény potřebujete některé objekty k zobrazení a objekty, které tvoří graf scény odvozený z Model3D. WPF v současné době podporuje modelování geometrií s GeometryModel3D. Vlastnost Geometry tohoto modelu přebírá primitivní síť.

Pokud chcete vytvořit model, začněte vytvořením primitivního objektu nebo sítě. 3D primitiv je kolekce vrcholů, které tvoří jednu 3D entitu. Většina 3D systémů poskytuje primitivy modelované na nejjednodušší uzavřeném obrázku: trojúhelník definovaný třemi vrcholy. Vzhledem k tomu, že tři body trojúhelníku jsou koplanární, můžete pokračovat v přidávání trojúhelníků, aby bylo možné modelovat složitější obrazce označované jako mřížky.

Systém WPF 3D v současné době poskytuje MeshGeometry3D třídu, která umožňuje určit libovolnou geometrii. V současné době nepodporuje předdefinované 3D primitivy, jako jsou koule a krychlové formy. Začněte vytvářet MeshGeometry3D zadáním seznamu vrcholů trojúhelníku jako jeho Positions vlastnosti. Každý vrchol je určen jako Point3D. (V XAML zadejte tuto vlastnost jako seznam čísel seskupených do tří, které představují souřadnice každého vrcholu.) V závislosti na geometrii se vaše síť může skládat z mnoha trojúhelníků, z nichž některé sdílejí stejné rohy (vrcholy). Aby bylo možné síť správně nakreslit, wpF potřebuje informace o tom, které vrcholy jsou sdíleny, pomocí kterých trojúhelníků. Tyto informace zadáte zadáním seznamu indexů trojúhelníku TriangleIndices s vlastností. Tento seznam určuje pořadí, ve kterém body zadané v Positions seznamu určují trojúhelník.

<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>

V předchozím příkladu Positions seznam určuje čtyři vrcholy pro definování obdélníkové mřížky. Vlastnost TriangleIndices určuje seznam dvou skupin tří indexů. Každé číslo v seznamu odkazuje na posun do Positions seznamu. Například první tři vrcholy určené seznamem Positions jsou (-1,-1,0), (1,-1,0)a (-1,1,0). První tři indexy určené seznamem TriangleIndices jsou 0, 1 a 2, které odpovídají prvním, druhému a třetím bodům Positions v seznamu. Výsledkem je, že první trojúhelník, který tvoří obdélníkový model, bude složen z (-1,-1,0) do (1,-1,0)(-1,1,0)a druhý trojúhelník bude určen podobně.

Model můžete dále definovat zadáním hodnot pro vlastnosti Normals a TextureCoordinates vlastnosti. K vykreslení povrchu modelu potřebuje grafický systém informace o směru, ve kterém je povrch zobrazen v libovolném trojúhelníku. Tyto informace používá k provádění výpočtů osvětlení modelu: povrchy, které jsou přímo směrem ke zdroji světla světlejší, než ty, které jsou úhlové od světla. I když WPF dokáže určit výchozí normální vektory pomocí souřadnic pozice, můžete také určit různé normální vektory pro přibližný vzhled zakřivených ploch.

Vlastnost TextureCoordinates určuje kolekci Points, která říká grafickému systému, jak mapovat souřadnice, které určují, jak je textura vykreslena na vrcholy sítě. TextureCoordinates jsou zadány jako hodnota mezi nulou a 1 včetně. Stejně jako u Normals vlastnosti může grafický systém vypočítat výchozí souřadnice textury, ale můžete se rozhodnout nastavit různé souřadnice textury pro řízení mapování textury, která zahrnuje například část opakujícího se vzoru. Další informace o souřadnicích textury najdete v následujících tématech nebo ve spravované sadě Direct3D SDK.

Následující příklad ukazuje, jak vytvořit jednu tvář modelu datové krychle v procedurálním kódu. Celou datovou krychli můžete nakreslit jako jednu GeometryModel3D. Tento příklad nakreslí tvář datové krychle jako odlišný model, aby se na každý obličej později použily samostatné textury.

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))

'

Použití materiálů na model

Aby síť vypadala jako trojrozměrný objekt, musí mít použitou texturu pro pokrytí povrchu definovaného jeho vrcholy a trojúhelníky, aby bylo možné ho zasvítit a promítnout fotoaparátem. Ve 2D použijete Brush třídu k použití barev, vzorů, přechodů nebo jiného vizuálního obsahu na oblasti obrazovky. Vzhled 3D objektů je však funkcí modelu osvětlení, nejen barvy nebo vzorku použitého na ně. Skutečné objekty odrážejí světlo odlišně v závislosti na kvalitě jejich povrchů: lesklé a lesklé povrchy nevypadají stejně jako drsné nebo matné povrchy a některé objekty se zdají absorbovat světlo, zatímco jiné záře. Všechny stejné štětce můžete použít u 3D objektů, které můžete použít u 2D objektů, ale nemůžete je použít přímo.

K definování charakteristik povrchu modelu používá Material WPF abstraktní třídu. Konkrétní podtřídy materiálu určují některé vlastnosti vzhledu povrchu modelu a každá také poskytuje vlastnost štětce, ke které můžete předat SolidColorBrush, TileBrush nebo VisualBrush.

  • DiffuseMaterial určuje, že se štětec použije na model, jako by byl model rozsvícený difuzorně. Použití difuzorníhomaterialu se podobá použití štětců přímo na 2D modelech; povrchy modelu neodráží světlo, jako by byly lesklé.

  • SpecularMaterial určuje, že štětec se použije na model, jako by povrch modelu byl tvrdý nebo lesklý, schopný reflektovat zvýraznění. Můžete nastavit stupeň, do kterého textura navrhne tuto reflexní kvalitu nebo "lesk", zadáním hodnoty vlastnosti SpecularPower .

  • EmissiveMaterial umožňuje určit, že textura bude použita, jako by model emitoval světlo stejné jako barva štětce. To nevytáčí model jako světlo; ale bude se účastnit jinak stínování, než by bylo texturováno difuzorním nebo SpecularMaterial.

Kvůli lepšímu výkonu jsou zadní plochy GeometryModel3D (ty tváře, které jsou mimo pohled, protože jsou na opačné straně modelu z fotoaparátu) odpočítány ze scény. Chcete-li zadat Material , aby se použil na zadní stranu modelu, jako je rovina, nastavte vlastnost modelu BackMaterial .

Pokud chcete dosáhnout některých vlastností povrchu, jako jsou záře nebo reflexní efekty, můžete na model po sobě použít několik různých štětců. Pomocí třídy můžete použít a znovu použít více materiálů MaterialGroup . Podřízené položky materialgroup se použijí jako první na poslední v několika průchodech vykreslování.

Následující příklady kódu ukazují, jak použít plnou barvu a kresbu jako štětce na 3D modely.

<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))

Osvětlení scény

Světla v 3D grafikách dělají to, co světla dělají ve skutečném světě: zviditelní povrchy. Více k bodu, světla určují, jaká část scény bude zahrnuta v projekci. Světlé objekty ve WPF vytvářejí různé světlé a stínové efekty a jsou modelovány po chování různých skutečných světel. Do scény zahrňte aspoň jedno světlo nebo se nezobrazí žádné modely.

Následující světla jsou odvozena od základní třídy Light:

  • AmbientLight: Poskytuje okolní osvětlení, které rovnoměrně svítí všechny objekty bez ohledu na jejich umístění nebo orientaci.

  • DirectionalLight: Svítí jako vzdálený zdroj světla. Směrová světla mají zadanou Direction funkci Vector3D, ale žádné zadané umístění.

  • PointLight: Svítí jako blízký zdroj světla. PointLights mají pozici a přetypovávat světlo z této pozice. Objekty ve scéně jsou osvětleny v závislosti na jejich poloze a vzdálenosti vzhledem k světlu. PointLightBaseRange zveřejňuje vlastnost, která určuje vzdálenost nad rámec toho, které modely nebudou osvětleny světlem. PointLight také zveřejňuje vlastnosti ztlumení, které určují, jak intenzita světla klesá přes vzdálenost. Pro ztlumení světla můžete určit konstantní, lineární nebo kvadratické interpolace.

  • SpotLight: Dědí z PointLight. Spotlighty svítí jako PointLight a mají jak polohu, tak směr. Promítají světlo do kuželové oblasti nastavené podle InnerConeAngle a OuterConeAngle vlastností zadaných ve stupních.

Světla jsou Model3D objekty, takže můžete transformovat a animovat vlastnosti světla, včetně pozice, barvy, směru a rozsahu.

<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)

Transformace modelů

Při vytváření modelů mají ve scéně konkrétní umístění. Pokud chcete tyto modely přesunout ve scéně, otočit je nebo změnit jejich velikost, není praktické změnit vrcholy, které definují samotné modely. Místo toho stejně jako v 2D použijete transformace na modely.

Každý objekt modelu má Transform vlastnost, pomocí které můžete model přesunout, změnit jeho orientaci nebo změnit jeho velikost. Při použití transformace efektivně posunete všechny body modelu jakýmkoli vektorem nebo hodnotou určenou transformací. Jinými slovy jste transformovali souřadnicový prostor, ve kterém je model definovaný ("prostor modelu"), ale nezměnili jste hodnoty, které tvoří geometrii modelu v souřadnicovém systému celé scény ("světový prostor").

Další informace o transformaci modelů najdete v tématu Přehled 3D transformací.

Animace modelů

Implementace WPF 3D se účastní stejného časování a animačního systému jako 2D grafika. Jinými slovy, pokud chcete animovat 3D scénu, animujte vlastnosti svých modelů. Vlastnosti primitiv je možné animovat přímo, ale obvykle je jednodušší animovat transformace, které mění pozici nebo vzhled modelů. Protože transformace lze použít u Model3DGroup objektů i jednotlivých modelů, je možné použít jednu sadu animací na podřízenou skupinu model3DGroup a další sadu animací pro skupinu podřízených objektů. Můžete také dosáhnout různých vizuálních efektů animací vlastností osvětlení scény. Nakonec se můžete rozhodnout animovat samotnou projekci animací pozice kamery nebo pole zobrazení. Základní informace o časování a animačním systému WPF najdete v tématech Přehled animací, Přehled scénářů a Zamrznutelné objekty.

Pokud chcete animovat objekt ve WPF, vytvoříte časovou osu, definujete animaci (což je skutečně změna hodnoty určité vlastnosti v průběhu času) a určete vlastnost, na kterou se má animace použít. Vzhledem k tomu, že všechny objekty ve 3D scéně jsou podřízené Viewport3D, vlastnosti cílené jakoukoli animací, kterou chcete na scénu použít, jsou vlastnosti Viewport3D.

Předpokládejme, že chcete, aby se model zobrazoval na místě. Můžete se rozhodnout použít RotateTransform3D pro model a animovat osu jeho otočení z jednoho vektoru do druhého. Následující příklad kódu ukazuje použití Vector3DAnimation na osu Vlastnost Rotation3D transformace za předpokladu, že RotateTransform3D je jednou z několika transformací použitých v modelu s 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)

Přidání 3D obsahu do okna

Pokud chcete scénu vykreslit, přidejte modely a světla do Model3DGroupa pak nastavte Model3DGroup jako Content .ModelVisual3D Přidejte do ModelVisual3DChildren kolekce objektu Viewport3D. Přidejte do objektu Viewport3D kamery nastavením jeho Camera vlastnosti.

Nakonec přidejte okno Viewport3D . Viewport3D Pokud je součástí prvku rozložení, jako je Canvas, zadejte velikost Viewport3D nastavením jeho Height a Width vlastností (zděděno z 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>

Viz také