Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 kontejner
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 objekty pro kreslení ve stejném grafu scény, nemůžete prolínat 2D a 3D objekty v rámci objektu Viewport3D. Toto téma se zaměří na to, jak kreslit 3D grafiku uvnitř Viewport3D.
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 počátek umístěn ve středu zobrazovacího prostoru, přičemž kladné hodnoty osy x pokračují doprava, kladné hodnoty osy y vzhůru a kladné hodnoty osy z směrem od počátku k prohlížeči.
CoordSystem-1
Konvenční reprezentace 2D a 3D souřadnicového systému
Prostor definovaný těmito osami je stacionární referenční rámec pro 3D objekty ve Windows Presentation Foundation (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.
Kamery 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ů. Protože 3D scéna vypadá jinak v závislosti na úhlu pohledu pozorovatele, musíte určit tento úhel pohledu. 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ů. Specifikuje PerspectiveCamera projekci, která zkracuje scénu. Jinými slovy, PerspectiveCamera poskytuje perspektivu úběžného bodu. 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 FarPlaneDistanceProjectionCamera omezují rozsah 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.
Umístění kamery
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 PerspectiveCamera však OrthographicCamera popisuje projekci, která nezahrnuje perspektivní zkreslení. Jinými slovy, OrthographicCamera popisuje prohlížecí box, jehož strany jsou paralelní, místo boxu, jehož strany se setkávají v bodě u fotoaparátu. Následující obrázek ukazuje stejný model jako zobrazený pomocí PerspectiveCamera a OrthographicCamera.
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 primitiva je sbírka 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 tím, že jako jeho vlastnost Positions zadáte seznam vrcholů trojúhelníku. Každý vrchol je specifikován 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 mezi trojúhelníky. 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 uvnitř 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 proti zdroji světla, jsou světlejší než ty, které jsou odkloněné 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 modelu
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í difúzního materiálu se podobá použití štětců přímo na 2D modelech; povrchy modelů neodráží světlo tak, jako by byly lesklé.
SpecularMaterial určuje, že štětec bude aplikován na model tak, jako kdyby povrch modelu byl tvrdý nebo lesklý a schopný odrážet jasné odlesky. Můžete nastavit stupeň, do kterého textura vyjádří tuto reflexní kvalitu, zvaný "lesk", zadáním hodnoty pro vlastnost SpecularPower.
EmissiveMaterial umožňuje určit, že textura bude použita, jako by model emitoval světlo stejné jako barva štětce. Nestane se z modelu světlo, ale bude se účastnit stínování jinak, než kdyby byl texturován difuzním nebo speculárním materiálem.
Kvůli lepšímu výkonu jsou zadní strany GeometryModel3D (ty plochy, které jsou mimo pohled, protože jsou na opačné straně modelu od kamery) odstraněny ze scény. Chcete-li zadat Material, aby byl použit na zadní stranu modelu, jako je letadlo, 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 MaterialGroup můžete použít a znovu využít více materiálů. Podřízené položky MaterialGroup se použijí od první po 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í definovaný Direction jako Vector3D, ale nemají určené umístění.
PointLight: Svítí jako blízký zdroj světla. PointLights mají pozici a vrhají 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. PointLightBase odhaluje vlastnost Range, která určuje vzdálenost, za kterou 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. Reflektory osvětlují podobně 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ů
Modely mají při vytváření 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 mohou být aplikovány jak na Model3DGroup objekty, tak na jednotlivé modely, je možné použít jednu sadu animací na podřízený objekt Model3DGroup a jinou sadu animací na 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ými Viewport3D, vlastnosti, na které cílí jakákoliv animace, kterou chcete použít na scénu, jsou vlastnosti Viewport3D.
Předpokládejme, že chcete, aby se model na místě pohyboval vratce. 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 vlastnost Axis transformace Rotation3D za předpokladu, že RotateTransform3D je jednou z několika transformací v modelu, který používá 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 Model3DGroup, pak nastavte Model3DGroup jako Content pro ModelVisual3D. Přidejte ModelVisual3D do kolekce Children z Viewport3D. Přidejte do objektu Viewport3D kamery nastavením jeho Camera vlastnosti.
Nakonec přidejte Viewport3D do okna. 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é
.NET Desktop feedback