Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Windows Presentation Foundation (WPF) 3D funkciója lehetővé teszi a fejlesztők számára, hogy 3D-s ábrákat rajzoljanak, alakítsa át és animáljanak korrektúra- és eljárási kódban. A fejlesztők a 2D és a 3D grafikus elemek kombinálásával gazdag vezérlőket hozhatnak létre, összetett ábrákat készíthetnek az adatokról, vagy növelhetik az alkalmazás felületének felhasználói élményét. A WPF 3D-s támogatása nem teljes értékű játékfejlesztési platformot biztosít. Ez a témakör áttekintést nyújt a WPF grafikus rendszer 3D funkcióiról.
3D egy 2D-tárolóban
A WPF 3D grafikus tartalma egy olyan elembe van beágyazva, Viewport3D, amely részt vehet a kétdimenziós elemszerkezetben. A grafikus rendszer a Viewport3D kétdimenziós vizuális elemként kezeli, mint sok más a WPF-ben. Viewport3D ablakként, nézőablakként működik egy háromdimenziós jelenetben. Pontosabban ez egy felület, amelyen egy 3D-s jelenetet vetítettek ki.
Egy hagyományos 2D alkalmazásban használja a Viewport3D, mint egy másik tárolóelemet, például a Gridet vagy a Vászont. Bár a Viewport3D más 2D rajzobjektumokkal is használható ugyanabban a jelenet gráfban, a 2D és 3D objektumok nem hatolhatnak át egymáson a Viewport3D-ben. Ennek a témakörnek az a célja, hogy bemutassa, hogyan lehet 3D-s ábrákat rajzolni a Viewport3D-en belül.
Térbeli koordináta-tér
A 2D ábrák WPF koordináta-rendszere a renderelési terület (általában a képernyő) bal felső részén található. A 2D rendszerben a pozitív x tengely értékei jobbra haladnak, a pozitív y tengely értékei pedig lefelé haladnak. A 3D koordinátarendszerben azonban a forrás a renderelési terület közepén helyezkedik el, a pozitív x tengely értékei jobbra haladnak, a pozitív y tengely értékei viszont felfelé haladnak, a pozitív z tengely értékei pedig kifelé haladnak a forrástól a megtekintő felé.
Hagyományos 2D és 3D koordinátarendszer-reprezentációk
Az e tengelyek által meghatározott tér a WPF 3D objektumainak helyhez kötött referenciakerete. Amikor modelleket hoz létre ebben a térben, és fényeket és kamerákat hoz létre, hasznos megkülönböztetni ezt a helyhez kötött referenciakeretet vagy "világteret" az egyes modellekhez létrehozott helyi referenciakerettől, amikor átalakításokat alkalmaz rá. Ne feledje, hogy a világűrben lévő objektumok a fény és a kamera beállításaitól függően teljesen másnak tűnhetnek, vagy egyáltalán nem láthatók, de a kamera pozíciója nem változtatja meg a világűrben lévő objektumok helyét.
Kamerák és vetítések
A 2D-ben dolgozó fejlesztők megszokták, hogy rajzprimitíveket helyeznek el egy kétdimenziós képernyőn. Amikor 3D-s jelenetet hoz létre, fontos megjegyezni, hogy valóban 3D objektumok 2D-s ábrázolását hozza létre. Mivel a 3D jelenet a megfigyelő nézőpontjától függően eltérően néz ki, meg kell adnia ezt a nézőpontot. A Camera osztály lehetővé teszi, hogy ezt a nézetet egy 3D-s jelenethez adja meg.
A 3D-s jelenet 2D-s felületeken való ábrázolásának egy másik módja, ha a jelenetet kivetítésként írja le a megtekintő felületre. A ProjectionCamera lehetővé teszi, hogy különböző vetítéseket és azok tulajdonságait adja meg, hogy megváltoztassa, hogyan látja a 3D modelleket az onlooker. A PerspectiveCamera egy olyan vetítést határoz meg, amely lerövidíti a jelenetet. Más szóval a PerspectiveCamera eltűnőpont-perspektívát biztosít. Megadhatja a kamera pozícióját a jelenet koordinátáiban, a kamera irányát és látóterét, valamint egy vektort, amely meghatározza a jelenet "fel" irányát. Az alábbi ábra a PerspectiveCameravetületét szemlélteti.
A NearPlaneDistanceFarPlaneDistance és ProjectionCamera tulajdonságai korlátozzák a kamera kivetítésének tartományát. Mivel a kamerák bárhol elhelyezhetők a jelenetben, lehetséges, hogy a kamera valójában egy modellben vagy egy modell közelében helyezkedik el, így nehéz megkülönböztetni az objektumokat. NearPlaneDistance lehetővé teszi a kamera minimális távolságának megadását, amelyen túl az objektumok nem lesznek megrajzolva. Ezzel szemben a FarPlaneDistance lehetővé teszi a kamera távolságának megadását, amelyen túl az objektumok nem lesznek megrajzolva, ami biztosítja, hogy a túl messze lévő objektumok ne legyenek belefoglalva a jelenetbe.
Kamera helyzete
OrthographicCamera egy 3D modell ortogonális vetületét adja meg egy 2D vizualizációs felületre. A többi kamerához hasonlóan ez is meghatározza a pozíciót, a megtekintési irányt és a "felfelé" irányt. Azonban a PerspectiveCamera-val ellentétben a OrthographicCamera egy olyan vetületet ír le, amely nem tartalmaz perspektivikus rövidülést. Más szóval, OrthographicCamera egy olyan megjelenítő dobozt ír le, amelynek oldalai párhuzamosak, nem pedig az egyik, amelynek oldalai a kamera egy pontján találkoznak. Az alábbi képen ugyanaz a modell látható, amelyet a PerspectiveCamera és a OrthographicCamerahasználatával tekinthetünk meg.
Perspektíva és ortográfiai előrejelzések
Az alábbi kód néhány tipikus kamerabeállítást mutat be.
// 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
Model- és hálóprimitívek
Model3D egy általános 3D objektumot képviselő absztrakt alaposztály. Térhatású jelenet létrehozásához szüksége van néhány objektumra, és a jelenetgráfot alkotó objektumok a Model3D-ból származnak. A WPF jelenleg támogatja a geometriák modellezését GeometryModel3D. A Geometry tulajdonsága ennél a modellnél egy háló primitívet használ.
A modell létrehozásához először egy primitív vagy hálót kell létrehoznia. A 3D primitívek csúcspontok gyűjteményei, amelyek egyetlen 3D entitást alkotnak. A legtöbb 3D rendszer a legegyszerűbb zárt ábrán modellezett primitíveket biztosít: egy háromszöget, amelyet három csúcs határoz meg. Mivel a háromszög három pontja koplanáris, továbbra is hozzáadhat háromszögeket, hogy összetettebb alakzatokat, úgynevezett hálókat modellezhessen.
A WPF 3D rendszer jelenleg a MeshGeometry3D osztályt biztosítja, amely lehetővé teszi bármilyen geometria megadását; jelenleg nem támogatja az előre definiált 3D primitíveket, például a gömböket és a köbös formákat. Kezdje el létrehozni a MeshGeometry3D a háromszög csúcsok listájának megadásával Positions tulajdonságaként. Minden csúcs Point3D-ként van megadva. (XAML-ben adja meg ezt a tulajdonságot az egyes csúcspontok koordinátáit képviselő számok háromba csoportosított listájaként.) A geometriától függően a háló számos háromszögből állhat, amelyek némelyike azonos sarkokkal (csúcsokkal) rendelkezik. A háló helyes rajzolásához a WPF-nek információra van szüksége arról, hogy mely csúcsokat melyik háromszögek osztják meg. Ezt az információt a háromszögindexek listájának megadásával adja meg a TriangleIndices tulajdonsággal. Ez a lista azt a sorrendet határozza meg, amelyben a Positions listában megadott pontok háromszöget határoznak meg.
<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>
Az előző példában a Positions lista négy csúcspontot határoz meg egy téglalapháló definiálásához. A TriangleIndices tulajdonság három indexből álló két csoport listáját adja meg. A lista minden egyes száma a Positions listába való eltolásra hivatkozik. Például a Positions lista által meghatározott első három csúcs: (-1,-1,0), (1,-1,0)és (-1,1,0). Az TriangleIndices lista első három indexe a 0, 1 és 2, amely a Positions lista első, második és harmadik pontjának felel meg. Ennek eredményeképpen a téglalapmodellt alkotó első háromszög a (-1,-1,0), (1,-1,0) és (-1,1,0)pontokból lesz összeállítva, a második háromszög pedig hasonló módon lesz meghatározva.
A modell definiálását a Normals és TextureCoordinates tulajdonságok értékének megadásával folytathatja. A modell felületének megjelenítéséhez a grafikus rendszernek információra van szüksége arról, hogy a felület melyik irányba néz egy adott háromszögnél. Ez az információ a modell megvilágítási számításainak elvégzésére szolgál: a közvetlenül a fényforrás felé irányuló felületek világosabbnak tűnnek, mint a fénytől távolodó felületek. Bár a WPF a pozíciókoordináták használatával meg tudja határozni az alapértelmezett normál vektorokat, különböző normál vektorokat is megadhat az ívelt felületek megjelenésének közelítéséhez.
A TextureCoordinates tulajdonság olyan Point-gyűjteményt határoz meg, amelyből megtudhatja a grafikus rendszernek, hogyan térképezi le azokat a koordinátákat, amelyek meghatározzák, hogy a háló csúcsai hogyan rajzolják meg az anyagmintát. TextureCoordinates nulla és 1 közötti értékként vannak megadva, az 1-et is beleértve. A Normals tulajdonsághoz hasonlóan a grafikus rendszer is kiszámíthatja az alapértelmezett textúrakoordinátákat, de különböző anyagminta-koordináták beállításával szabályozhatja például az ismétlődő mintázat egy részét tartalmazó textúra leképezését. A textúrakoordinátákról további információt a következő témakörökben vagy a Felügyelt Direct3D SDK-ban talál.
Az alábbi példa bemutatja, hogyan hozhat létre egy arcot a kockamodellből az eljárási kódban. A teljes kockát egyetlen GeometryModel3D
-ként rajzolhatja meg; ebben a példában a kocka lapját külön kiemeltük, hogy később külön textúrákat alkalmazhassunk az egyes lapokra.
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))
Anyagok alkalmazása a modellre
Ahhoz, hogy a háló háromdimenziós objektumként nézzen ki, alkalmazott anyagmintával kell rendelkeznie ahhoz, hogy lefedje a csúcsai és háromszögei által meghatározott felületet, hogy a kamera megvilágíthassa és kivetíthesse. A 2D-ben a Brush osztály használatával színeket, mintákat, színátmeneteket vagy egyéb vizuális tartalmakat alkalmazhat a képernyő területeire. A 3D objektumok megjelenése azonban a világítási modell függvénye, nem csak a rájuk alkalmazott szín vagy minta. A valós tárgyak a felületük minőségétől függően eltérően tükrözik a fényt: a fényes és fényes felületek nem ugyanúgy néznek ki, mint a durva vagy matt felületek, és egyes objektumok úgy tűnik, hogy elnyelik a fényt, míg mások ragyognak. Ugyanazokat az ecseteket alkalmazhatja a 3D objektumokra, amelyeket 2D objektumokra alkalmazhat, de közvetlenül nem alkalmazhatja őket.
A modell felületének jellemzőinek meghatározásához a WPF az Material absztrakt osztályt használja. Az Anyag betonalosztályai meghatározzák a modell felületének néhány megjelenési jellemzőjét, és mindegyik rendelkezik egy Brush tulajdonsággal is, amelyhez SolidColorBrush, TileBrush vagy VisualBrush elemet adhat át.
DiffuseMaterial megadja, hogy az ecsetet úgy alkalmazza a modellre, mintha a modell diffúz megvilágítással volna ellátva. A DiffuseMaterial használata leginkább a 2D modelleken használt kefékre hasonlít; a modell felületei nem úgy tükrözik a fényt, mintha fényes lenne.
SpecularMaterial megadja, hogy a kefét a rendszer úgy alkalmazza a modellre, mintha a modell felülete kemény vagy fényes lenne, és képes tükrözni a kiemeléseket. A SpecularPower tulajdonság értékének megadásával megadhatja, hogy a textúra milyen mértékben javasolja ezt a tükröző minőséget vagy "ragyogást".
EmissiveMaterial lehetővé teszi annak megadását, hogy a textúra úgy legyen alkalmazva, mintha a modell az ecset színével megegyező fényt bocsát ki. Ez nem teszi a modellt világítássá; azonban másképpen fog részt venni az árnyékolásban, mint ha DiffuseMaterial vagy SpecularMaterial anyaggal lenne textúrázva.
A jobb teljesítmény érdekében a GeometryModel3D hátoldalai (azok a felületek, amelyek nem láthatók, mert a modell ellentétes oldalán vannak a kamerához képest) eltávolításra kerülnek a jelenetből. Ha meg szeretne adni egy Material, amely a modell hátlapjára, például síkra vonatkozik, állítsa be a modell BackMaterial tulajdonságát.
Egyes felületi tulajdonságok, például a ragyogás vagy a fényvisszaverő effektusok eléréséhez érdemes lehet egymás után több különböző kefét alkalmazni egy modellre. A MaterialGroup osztály használatával több anyagot is alkalmazhat és használhat újra. A MaterialGroup gyermekei az elsőtől az utolsóig több renderelési folyamatban kerülnek alkalmazásra.
Az alábbi példakódok azt mutatják be, hogyan alkalmazhat egy szilárd színt és egy rajzot ecsetként a 3D modellekre.
<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))
A jelenet megvilágítása
A 3D-s ábrák fényei a valóságban azt teszik, amit a fények csinálnak: láthatóvá teszik a felületeket. Ennél is fontosabb, hogy a fények határozzák meg, hogy a jelenet mely része szerepel majd a kivetítésben. A WPF fényobjektumai számos fény- és árnyékeffektust hoznak létre, és a különböző valós fények viselkedése után modellezettek. Helyezzen el legalább egy fényt a jelenetben, különben nem lesznek láthatóak a modellek.
A következő fények az alaposztály Lightszármaznak:
AmbientLight: Környezeti világítást biztosít, amely minden objektumot egységesen világít, helyüktől vagy tájolásuktól függetlenül.
DirectionalLight: Úgy világít, mint egy távoli fényforrás. Az irányított fények Direction vektor3D-ként vannak megadva, de nincs megadva hely.
PointLight: Úgy világít, mint egy közeli fényforrás. A PointLight-nak van helyzete, és ebből a pozícióból sugároznak fényt. A jelenetben lévő tárgyak a helyzetüktől és a fénytől való távolságuktól függően világítanak. PointLightBase egy Range tulajdonságot tesz elérhetővé, amely meghatározza, hogy mely távolságon túl melyik modelleket ne világítsa meg a fény. A PointLight emellett csillapítási tulajdonságokat is elérhetővé tesz, amelyek meghatározzák, hogy a fény intenzitása hogyan csökken a távolságon keresztül. A fény csillapításához konstans, lineáris vagy kvadratikus interpolációt is megadhat.
SpotLighta PointLight-t örökli. A reflektorfények a PointLighthoz hasonlóan világítanak, és pozíciójuk és irányuk is van. A fényt egy kúp alakú, InnerConeAngle és OuterConeAngle tulajdonságok által meghatározott, fokban megadott területen vetik ki.
A fények Model3D objektumok, így átalakíthatja és animálhatja a fény tulajdonságait, beleértve a pozíciót, a színt, az irányt és a tartományt.
<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)
Modellek átalakítása
Amikor modelleket hoz létre, azok egy adott helyen találhatók a jelenetben. Ha ezeket a modelleket a jelenetben szeretné mozgatni, elforgatni vagy a méretüket módosítani, nem célszerű módosítani a modelleket meghatározó csúcspontokat. Ehelyett ugyanúgy, mint a 2D-ben, átalakításokat alkalmaz a modellekre.
Minden modellobjektum rendelkezik egy Transform tulajdonsággal, amellyel áthelyezheti, átirányíthatja vagy átméretezheti a modellt. Átalakítás alkalmazásakor a modell összes pontját hatékonyan el kell tolni az átalakítás által megadott vektorral vagy értékkel. Más szóval átalakította azt a koordinátatert, amelyben a modell definiálva van ("modelltér"), de nem módosította a modell geometriájaként szolgáló értékeket a teljes jelenet (világtér) koordinátarendszerében.
A modellek átalakításáról további információt a 3D átalakítások áttekintésecímű témakörben talál.
Modellek animálása
A WPF 3D implementáció ugyanabban az időzítési és animációs rendszerben vesz részt, mint a 2D grafikus elemek. Más szóval, egy 3D-s jelenet animálásához a modellek tulajdonságait kell animálni. A primitívek tulajdonságai közvetlenül animálhatók, de általában egyszerűbb az olyan átalakítások animálása, amelyek megváltoztatják a modellek pozícióját vagy megjelenését. Mivel az átalakítások alkalmazhatók Model3DGroup objektumokra és egyéni modellekre is, lehetőség van ugyanazon animációkészletet alkalmazni a Model3DGroup egy gyermekére, míg egy másik animációkészlet alkalmazható egy gyermekobjektumok csoportjára. A jelenet megvilágításának tulajdonságainak animálásával különféle vizuális effektusokat is elérhet. Végül dönthet úgy, hogy magát a vetítést animálja a kamera helyzetének vagy nézetének animálásával. A WPF időzítésével és animációs rendszerével kapcsolatos háttérinformációkat az Animáció áttekintése, a Storyboards áttekintésiés Fagyásos objektumok áttekintése témakörökben talál.
Ha egy objektumot a WPF-ben szeretne animálni, hozzon létre egy ütemtervet, definiáljon egy animációt (ami valójában egy tulajdonságérték időbeli változása), és adja meg azt a tulajdonságot, amelyre alkalmazni szeretné az animációt. Mivel a 3D jelenet összes objektuma Viewport3Dgyermeke, a jelenetre alkalmazni kívánt animációk által megcélzott tulajdonságok a Viewport3D tulajdonságai.
Tételezzük fel, hogy azt szeretné, ha egy modell úgy jelenne meg, mintha a helyén ingadozna. Úgy dönthet, hogy egy RotateTransform3D-t alkalmaz a modellre, és animálja forgástengelyét egyik vektorból a másikba. Az alábbi példakód bemutatja a Vector3DAnimation tengely tulajdonságára való alkalmazást az átalakítás Rotation3D-jére, feltételezve, hogy a RotateTransform3D egyike azon számos transzformációnak, amelyeket a modellre a TransformGroup segítségével alkalmaztak.
//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)
Térhatású tartalom hozzáadása az ablakhoz
A jelenet megjelenítéséhez adjon hozzá modelleket és fényeket egy Model3DGroup-hoz, majd állítsa be a Model3DGroup-et a ContentModelVisual3D-eként. Adja hozzá a ModelVisual3D a ChildrenViewport3D gyűjteményéhez. A Viewport3D tulajdonság beállításával adjon hozzá kamerákat a Camera-hoz.
Végül adja hozzá a(z) Viewport3D-t az ablakhoz. Ha a Viewport3D szerepel egy elrendezéselem, például Vászon, tartalmaként, adja meg a Viewport3D méretét a Height és Width tulajdonságok beállításával, amelyeket a FrameworkElementörököl.
<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>
Lásd még
.NET Desktop feedback