Megosztás a következőn keresztül:


3D grafikus áttekintés

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

Koordinátarendszerek
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 beállítása
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.

ortográfiai és perspektivikus vetítés
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