Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Met de 3D-functionaliteit in Windows Presentation Foundation (WPF) kunnen ontwikkelaars 3D-afbeeldingen tekenen, transformeren en animeren in zowel markeringen als procedurele code. Ontwikkelaars kunnen 2D- en 3D-afbeeldingen combineren om uitgebreide besturingselementen te maken, complexe illustraties van gegevens te bieden of de gebruikerservaring van de interface van een toepassing te verbeteren. 3D-ondersteuning in WPF is niet ontworpen om een volledig platform voor gameontwikkeling te bieden. In dit onderwerp vindt u een overzicht van de 3D-functionaliteit in het WPF-grafische systeem.
3D in een 2D-container
3D-grafische inhoud in WPF wordt ingekapseld in een element, Viewport3Ddat kan deelnemen aan de tweedimensionale elementstructuur. Het grafische systeem beschouwt Viewport3D als een tweedimensionaal visueel element, zoals vele andere in WPF. Viewport3D fungeert als een venster( een viewport) in een driedimensionale scène. Nauwkeuriger is het een oppervlak waarop een 3D-scène wordt geprojecteerd.
Gebruik in een conventionele 2D-toepassing Viewport3D als een ander containerelement, zoals Grid of Canvas. Hoewel u Viewport3D kunt gebruiken met andere 2D-tekenobjecten in dezelfde scène-grafiek, kunt u 2D- en 3D-objecten binnen een Viewport3D scène-grafiek niet interpenetreren. In dit onderwerp wordt aandacht besteed aan het tekenen van 3D-afbeeldingen binnen de Viewport3D.
3D-coördinaatruimte
Het WPF-coördinaatsysteem voor 2D-afbeeldingen zoekt de oorsprong in de linkerbovenhoek van het renderinggebied (meestal het scherm). In het 2D-systeem gaan positieve x-aswaarden naar de rechter- en positieve y-aswaarden omlaag. In het 3D-coördinaatsysteem bevindt de oorsprong zich echter in het midden van het renderinggebied, waarbij positieve x-aswaarden naar de rechter, maar positieve y-aswaarden naar boven gaan en positieve z-aswaarden naar buiten gaan vanaf de oorsprong, naar de kijker.
Conventionele 2D- en 3D-coördinaatsysteemweergaven
De ruimte die door deze assen is gedefinieerd, is het stationaire referentiekader voor 3D-objecten in WPF. Wanneer u modellen in deze ruimte bouwt en lichten en camera's maakt om ze te bekijken, is het handig om dit stationaire referentiekader of 'wereldruimte' te onderscheiden van het lokale referentiekader dat u voor elk model maakt wanneer u er transformaties op toepast. Houd er ook rekening mee dat objecten in de wereldruimte er helemaal anders uitzien, of helemaal niet zichtbaar zijn, afhankelijk van de licht- en camera-instellingen, maar de positie van de camera verandert niet de locatie van objecten in de wereldruimte.
Cameras en projecties
Ontwikkelaars die in 2D werken, zijn gewend om tekenprimitieven op een tweedimensionaal scherm te positioneren. Wanneer u een 3D-scène maakt, is het belangrijk om te onthouden dat u echt een 2D-weergave van 3D-objecten maakt. Omdat een 3D-scène er anders uitziet, afhankelijk van het oogpunt van de onlooker, moet u dat standpunt opgeven. Met de Camera klasse kunt u dit weergavepunt voor een 3D-scène opgeven.
Een andere manier om te begrijpen hoe een 3D-scène wordt weergegeven op een 2D-oppervlak, is door de scène te beschrijven als een projectie op het kijkoppervlak. Hiermee ProjectionCamera kunt u verschillende projecties en hun eigenschappen opgeven om te wijzigen hoe de onlooker 3D-modellen ziet. Een PerspectiveCamera specificeert een projectie die de scène verkort. Met andere woorden, het PerspectiveCamera biedt verdwijnpuntperspectief. U kunt de positie van de camera opgeven in de coördinaatruimte van de scène, de richting en het weergaveveld voor de camera en een vector die de richting 'omhoog' in de scène definieert. Het volgende diagram illustreert de projectie van PerspectiveCamera.
De NearPlaneDistance en FarPlaneDistance eigenschappen van ProjectionCamera het beperken van het bereik van de cameraprojectie. Omdat camera's zich overal in de scène kunnen bevinden, is het mogelijk dat de camera daadwerkelijk in een model of in de buurt van een model wordt geplaatst, waardoor het moeilijk is om objecten goed te onderscheiden. NearPlaneDistance hiermee kunt u een minimale afstand van de camera opgeven waarbinnen geen objecten worden getekend. U kunt daarentegen FarPlaneDistance een afstand opgeven van de camera waarbuiten objecten niet worden getekend, waardoor objecten die te ver van elkaar te herkennen zijn, niet worden opgenomen in de scène.
Camerapositie
OrthographicCamera geeft een orthogonale projectie van een 3D-model aan op een 2D-visualoppervlak. Net als andere camera's geeft het een positie, weergaverichting en "opwaartse" richting aan. In tegenstelling tot PerspectiveCamera, OrthographicCamera wordt echter een projectie beschreven die geen perspectief vooreshortening bevat. Met andere woorden, OrthographicCamera beschrijft een kijkvak waarvan de zijkanten parallel zijn, in plaats van één waarvan de zijkanten elkaar ontmoeten op een punt op de camera. In de volgende afbeelding ziet u hetzelfde model als het model dat wordt bekeken met en PerspectiveCameraOrthographicCamera.
Perspectief- en ortografische projecties
De volgende code toont enkele typische camera-instellingen.
// 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 en Mesh Primitives
Model3D is de abstracte basisklasse die een algemeen 3D-object vertegenwoordigt. Als u een 3D-scène wilt maken, hebt u enkele objecten nodig om te bekijken en de objecten waaruit de scènegrafiek is afgeleid Model3D. Momenteel ondersteunt de WPF modelleringsgeometrieën met GeometryModel3D. De Geometry eigenschap van dit model maakt gebruik van een mesh-primitieve.
Begin met het maken van een primitief object of mesh om een model te bouwen. Een 3D-primitieve is een verzameling hoekpunten die één 3D-entiteit vormen. De meeste 3D-systemen bieden primitieven die zijn gemodelleerd op de eenvoudigste gesloten figuur: een driehoek die wordt gedefinieerd door drie hoekpunten. Omdat de drie punten van een driehoek coplanar zijn, kunt u driehoeken blijven toevoegen om complexere vormen te modelleren, ook wel meshes genoemd.
Het WPF 3D-systeem biedt momenteel de MeshGeometry3D klasse, waarmee u elke geometrie kunt opgeven; het biedt momenteel geen ondersteuning voor vooraf gedefinieerde 3D-primitieven, zoals bollen en kubieke vormen. Begin met het maken van een MeshGeometry3D door een lijst met driehoekpunten op te geven als Positions eigenschap. Elk hoekpunt wordt opgegeven als een Point3D. (Geef in XAML deze eigenschap op als een lijst met getallen gegroepeerd in drieen die de coördinaten van elk hoekpunt vertegenwoordigen.) Afhankelijk van de geometrie kan uw mesh bestaan uit veel driehoeken, waarvan sommige dezelfde hoeken (hoekpunten) delen. Om de mesh correct te tekenen, heeft de WPF informatie nodig over welke hoekpunten worden gedeeld door welke driehoeken. U geeft deze informatie op door een lijst met driehoekindexen met de TriangleIndices eigenschap op te geven. Deze lijst geeft de volgorde aan waarin de punten die in de Positions lijst zijn opgegeven, een driehoek bepalen.
<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>
In het voorgaande voorbeeld geeft de Positions lijst vier hoekpunten op om een rechthoek-mesh te definiëren. De TriangleIndices eigenschap geeft een lijst van twee groepen van drie indexen. Elk getal in de lijst verwijst naar een offset in de Positions lijst. De eerste drie hoekpunten die door de Positions lijst zijn opgegeven, zijn (-1,-1,0)bijvoorbeeld , (1,-1,0)en (-1,1,0). De eerste drie indexen die door de TriangleIndices lijst worden opgegeven, zijn 0, 1 en 2, die overeenkomen met de eerste, tweede en derde punten in de Positions lijst. Als gevolg hiervan wordt het eerste driehoekje waaruit het rechthoekmodel bestaat samengesteld van (-1,-1,0) naar (1,-1,0)(-1,1,0), en wordt de tweede driehoek op dezelfde manier bepaald.
U kunt het model blijven definiëren door waarden voor de Normals en TextureCoordinates eigenschappen op te geven. Om het oppervlak van het model weer te geven, heeft het grafische systeem informatie nodig over welke richting het oppervlak zich op een bepaalde driehoek bevindt. Deze informatie wordt gebruikt om verlichtingsberekeningen voor het model te maken: oppervlakken die rechtstreeks naar een lichtbron kijken, lijken helderder dan de lichtbronnen die van het licht af zijn gehoekt. Hoewel de WPF standaard normale vectoren kan bepalen met behulp van de positiecoördinaten, kunt u ook verschillende normale vectoren opgeven om het uiterlijk van gebogen oppervlakken te benaderen.
De TextureCoordinates eigenschap geeft een verzameling Points op die het grafische systeem vertelt hoe de coördinaten moeten worden toegewezen die bepalen hoe een textuur wordt getekend op de hoekpunten van de mesh. TextureCoordinates worden opgegeven als een waarde tussen nul en 1, inclusief. Net als bij de Normals eigenschap kan het grafische systeem standaardpatrooncoördinaten berekenen, maar u kunt er ook voor kiezen om verschillende patrooncoördinaten in te stellen om de toewijzing van een patroon te bepalen dat deel uitmaakt van een herhalend patroon, bijvoorbeeld. Meer informatie over patrooncoördinaten vindt u in volgende onderwerpen of in de Managed Direct3D SDK.
In het volgende voorbeeld ziet u hoe u één gezicht van het kubusmodel maakt in procedurele code. U kunt de hele kubus als één GeometryModel3D
tekenen; in dit voorbeeld wordt het vlak van de kubus als een afzonderlijk model getekend om later aparte texturen op elk vlak toe te passen.
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))
Materialen toepassen op het model
Voor een mesh die eruitziet als een driedimensionaal object, moet het een toegepast patroon hebben om het oppervlak te bedekken dat is gedefinieerd door de hoekpunten en driehoeken, zodat het kan worden verlicht en geprojecteerd door de camera. In 2D gebruikt u de Brush klasse om kleuren, patronen, kleurovergangen of andere visuele inhoud toe te passen op gebieden van het scherm. Het uiterlijk van 3D-objecten is echter een functie van het verlichtingsmodel, niet alleen van de kleur of het patroon dat erop is toegepast. Echte objecten weerspiegelen licht anders, afhankelijk van de kwaliteit van hun oppervlakken: glanzende en glanzende oppervlakken zien er niet hetzelfde uit als ruwe of matte oppervlakken, en sommige objecten lijken licht te absorberen terwijl andere gloeien. U kunt dezelfde kwasten toepassen op 3D-objecten die u op 2D-objecten kunt toepassen, maar u kunt ze niet rechtstreeks toepassen.
WpF gebruikt de abstracte klasse om de kenmerken van het Material oppervlak van een model te definiëren. De concrete subklassen van materiaal bepalen enkele van de uiterlijkkenmerken van het oppervlak van het model en elk biedt ook een kwasteigenschap waaraan u een SolidColorBrush, TileBrush of VisualBrush kunt doorgeven.
DiffuseMaterial geeft aan dat de borstel wordt toegepast op het model alsof dat model diffuus is verlicht. Het gebruik van DiffuseMaterial lijkt het meest op het gebruik van borstels rechtstreeks op 2D-modellen; modeloppervlakken weerspiegelen geen licht alsof ze glanzend zijn.
SpecularMaterial geeft aan dat de borstel wordt toegepast op het model alsof het oppervlak van het model hard of glanzend is, waardoor markeringen kunnen worden weerspiegeld. U kunt de mate instellen waarop de textuur deze reflecterende kwaliteit voorstelt, of 'glans', door een waarde voor de SpecularPower eigenschap op te geven.
EmissiveMaterial hiermee kunt u opgeven dat de textuur wordt toegepast alsof het model licht heeft verzonden dat gelijk is aan de kleur van de borstel. Dit maakt het model niet licht; het zal echter anders deelnemen aan schaduw dan het zou doen als het wordt getextureerd met Diffuse Material of SpecularMaterial.
Voor betere prestaties worden de achtergronden van een GeometryModel3D (die gezichten die niet in beeld zijn omdat ze zich aan de tegenovergestelde kant van het model van de camera bevinden) uit de scène verwijderd. Als u een Material wilt opgeven die moet worden toegepast op de achterkant van een model, zoals een vlak, stelt u de eigenschap van BackMaterial het model in.
Als u enkele oppervlaktekwaliteiten wilt bereiken, zoals gloeiende of reflecterende effecten, wilt u misschien meerdere verschillende borstels op een model achter elkaar toepassen. U kunt meerdere materialen toepassen en hergebruiken met behulp van de MaterialGroup klasse. De kinderen van de MaterialGroup worden van eerst tot laatst toegepast in meerdere renderingpasses.
In de volgende codevoorbeelden ziet u hoe u een effen kleur en een tekening als penselen toepast op 3D-modellen.
<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))
De scène verlichten
Lichten in 3D-graphics doen wat lichten in de echte wereld doen: ze maken oppervlakken zichtbaar. Meer tot op het punt bepalen lichten welk deel van een scène in de projectie wordt opgenomen. Lichtobjecten in WPF creëren een verscheidenheid aan licht- en schaduweffecten en worden gemodelleerd na het gedrag van verschillende echte lichten. Neem ten minste één licht op in uw scène of er zijn geen modellen zichtbaar.
De volgende lichten zijn afgeleid van de basisklasse Light:
AmbientLight: Biedt omgevingsverlichting die alle objecten uniform verlicht, ongeacht hun locatie of oriëntatie.
DirectionalLight: Schijnt als een verre lichtbron. Directionele lichten hebben een Direction opgegeven als vector3D, maar geen opgegeven locatie.
PointLight: Verlicht zoals een nabijgelegen lichtbron. PointLights hebben een positie en werpen licht vanuit die positie. Objecten in de scène worden verlicht, afhankelijk van hun positie en afstand met betrekking tot het licht. PointLightBase geeft een Range eigenschap weer, die een afstand bepaalt waarbuiten modellen niet door het licht zullen worden verlicht. PointLight geeft ook attenuatie-eigenschappen weer, die bepalen hoe de intensiteit van het licht over afstand afneemt. U kunt constante, lineaire of kwadratische interpolaties opgeven voor de attenuatie van het licht.
SpotLight: neemt over van PointLight. Spotlights verlichten zoals PointLight en hebben zowel positie als richting. Ze projecteren licht in een kegelvormig gebied dat is ingesteld door InnerConeAngle en OuterConeAngle eigenschappen, opgegeven in graden.
Lichten zijn Model3D objecten, zodat u lichteigenschappen kunt transformeren en animeren, waaronder positie, kleur, richting en bereik.
<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)
Modellen transformeren
Wanneer u modellen maakt, hebben ze een bepaalde locatie in de scène. Als u deze modellen in de scène wilt verplaatsen, ze wilt draaien of de grootte ervan wilt wijzigen, is het niet praktisch om de hoekpunten te wijzigen die de modellen zelf definiëren. Net als in 2D past u transformaties toe op modellen.
Elk modelobject heeft een Transform eigenschap waarmee u het model kunt verplaatsen, wijzigen of het formaat ervan kunt wijzigen. Wanneer u een transformatie toepast, worden alle punten van het model effectief verschoven door elke vector of waarde die is opgegeven door de transformatie. Met andere woorden, u hebt de coördinaatruimte waarin het model is gedefinieerd ('modelruimte') getransformeerd, maar u hebt de waarden waaruit de geometrie van het model bestaat niet gewijzigd in het coördinatensysteem van de hele scène ('wereldruimte').
Zie het overzicht van 3D-transformaties voor meer informatie over het transformeren van modellen.
Animatiemodellen
De WPF 3D-implementatie neemt deel aan hetzelfde timing- en animatiesysteem als 2D-afbeeldingen. Met andere woorden, om een 3D-scène te animeren, moet je de eigenschappen van de modellen animeren. Het is mogelijk om eigenschappen van primitieven rechtstreeks te animeren, maar het is meestal eenvoudiger om transformaties te animeren die de positie of het uiterlijk van modellen wijzigen. Omdat transformaties kunnen worden toegepast op Model3DGroup objecten en afzonderlijke modellen, is het mogelijk om één set animaties toe te passen op een onderliggend element van een Model3DGroup en een andere set animaties op een groep onderliggende objecten. U kunt ook verschillende visuele effecten bereiken door de eigenschappen van de belichting van uw scène aan te passen. Ten slotte kunt u ervoor kiezen om de projectie zelf te animeren door de camerapositie of het beeldveld te animeren. Zie de onderwerpen Animatieoverzicht, Storyboards Overview en Freezable Objects Overview voor achtergrondinformatie over het WPF-timing- en animatiesysteem.
Als u een object in WPF wilt animeren, maakt u een tijdlijn, definieert u een animatie (wat in feite een wijziging is in een bepaalde eigenschapswaarde in de loop van de tijd) en geeft u de eigenschap op waarop de animatie moet worden toegepast. Omdat alle objecten in een 3D-scène kinderen van Viewport3D zijn, zijn de eigenschappen van de scène die worden gewijzigd door een animatie eigenschappen van Viewport3D.
Stel dat je een model wil laten schommelen op dezelfde plek. U kunt ervoor kiezen om een RotateTransform3D op het model toe te passen en de as van de rotatie van de ene vector naar de andere te animeren. In het volgende codevoorbeeld ziet u hoe u een Vector3DAnimation toepast op de aseigenschap van de rotatie3D van de transformatie, ervan uitgaande dat de RotateTransform3D een van de verschillende transformaties is die zijn toegepast op het model met een 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)
3D-inhoud toevoegen aan het venster
Als u de scène wilt weergeven, voegt u modellen en lichten toe aan een Model3DGroup, en stelt u de Model3DGroup in als het Content van een ModelVisual3D. Voeg de ModelVisual3D toe aan de Children verzameling van de Viewport3D. Voeg camera's toe aan de Viewport3D door de Camera-eigenschap in te stellen.
Voeg ten slotte het Viewport3D venster toe. Wanneer de Viewport3D is opgenomen als de inhoud van een indelingselement zoals Canvas, specificeert u de grootte van de Viewport3D door de eigenschappen Height en Width ervan in te stellen (overgenomen van 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>
Zie ook
.NET Desktop feedback