Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie opisano sposób stosowania przekształceń do modeli 3D w systemie graficznym Windows Presentation Foundation (WPF). Przekształcenia umożliwiają deweloperowi zmianę położenia, zmiany rozmiaru i ponownego zorientowania modeli bez zmieniania wartości podstawowych, które je definiują.
Przestrzeń współrzędna 3-W
Zawartość grafiki 3D w programie Windows Presentation Foundation (WPF) jest hermetyzowana w elememencie , Viewport3Dktóry może uczestniczyć w dwuwymiarowej strukturze elementów. System graficzny traktuje Viewport3D jako dwuwymiarowy element wizualny, jak wiele innych w Programie Windows Presentation Foundation (WPF). Viewport3D działa jako okno — widokport — do trójwymiarowej sceny. Dokładniej jest to powierzchnia, na której jest projektowana scena 3D. Chociaż można użyć widokuport3D z innymi obiektami rysunkowymi 2D w tym samym grafie sceny, nie można przeplatać obiektów 2D i 3D w widokuport3D. W poniższej dyskusji przestrzeń współrzędna opisana jest zawarta przez element Viewport3D.
System współrzędnych programu Windows Presentation Foundation (WPF) dla grafiki 2D lokalizuje źródło w lewym górnym rogu powierzchni renderowania (zazwyczaj ekran). W systemie 2D dodatnie wartości osi x są kontynuowane do prawej i dodatniej wartości osi y w dół. Jednak w układzie współrzędnych 3D źródło znajduje się na środku ekranu, z dodatnimi wartościami osi x przechodzącymi do prawej, ale dodatnich wartości osi y w górę, a dodatnie wartości osi z przechodzące na zewnątrz od źródła, w kierunku osoby przeglądanej.
Porównanie układu współrzędnych
Przestrzeń zdefiniowana przez te osie to nieruchoma rama odniesienia dla obiektów 3D w programie Windows Presentation Foundation (WPF). Podczas tworzenia modeli w tej przestrzeni i tworzenia świateł i kamer do ich wyświetlania warto odróżnić tę nieruchomą ramę odniesienia lub "przestrzeń światową" z lokalnej ramki odniesienia tworzonej dla każdego modelu podczas stosowania przekształceń do niego. Należy również pamiętać, że obiekty w przestrzeni światowej mogą wyglądać zupełnie inaczej lub w ogóle nie być widoczne, w zależności od ustawień światła i aparatu, ale pozycja aparatu nie zmienia lokalizacji obiektów w przestrzeni światowej.
Przekształcanie modeli
Podczas tworzenia modeli mają one określoną lokalizację w scenie. Aby przenieść te modele w scenie, obrócić je lub zmienić ich rozmiar, nie jest praktyczne, aby zmienić wierzchołki, które definiują same modele. Zamiast tego, podobnie jak w przypadku 2D, stosujesz przekształcenia do modeli.
Każdy obiekt modelu ma Transform właściwość, za pomocą której można przenosić, zmieniać orientację lub zmieniać rozmiar modelu. Po zastosowaniu przekształcenia skutecznie zrównoważysz wszystkie punkty modelu za pomocą dowolnego wektora lub wartości określonej przez przekształcenie. Innymi słowy, przekształcono przestrzeń współrzędnych, w której zdefiniowano model ("przestrzeń modelu"), ale nie zmieniono wartości tworzących geometrię modelu w układzie współrzędnych całej sceny ("przestrzeń światowa").
Przekształcenia tłumaczenia
Przekształcenia 3D dziedziczą z abstrakcyjnej klasy Transform3Dbazowej ; obejmują one klasy TranslateTransform3Dtransformacji affine , ScaleTransform3Di RotateTransform3D. System 3D programu Windows Presentation Foundation (WPF) udostępnia również klasę MatrixTransform3D , która umożliwia określenie tych samych przekształceń w bardziej zwięzłych operacjach macierzy.
TranslateTransform3D przenosi wszystkie punkty w modelu3D w kierunku wektora przesunięcia określonego za OffsetXpomocą właściwości , OffsetYi OffsetZ . Na przykład, biorąc pod uwagę jeden wierzchołek modułu (2,2,2), wektor przesunięcia (0,1,6,1) przeniesie ten wierzchołek (2,2,2) do (2,3,6,3). Wierzchołek modułu jest nadal (2,2,2) w przestrzeni modelu, ale teraz, gdy przestrzeń modelu zmieniła relację z przestrzenią światową, tak aby (2,2,2) w przestrzeni modelowej było (2,3,6,3) w przestrzeni światowej.
Tłumaczenie z przesunięciem
W poniższych przykładach kodu pokazano, jak zastosować tłumaczenie.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="600" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="600" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- Defines the camera used to view the 3D object. -->
<Viewport3D.Camera>
<PerspectiveCamera x:Name="myPerspectiveCamera" Position="0,0,2" LookDirection="0,0,-1"
FieldOfView="60" />
</Viewport3D.Camera>
<!-- The ModelVisual3D children contain the 3D models -->
<Viewport3D.Children>
<!-- This ModelVisual3D defines the light cast in the scene. Without light, the
3D object cannot be seen. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created. -->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5 " />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Cyan" Opacity="0.3"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. The OffsetX property is animated
in the Storyboard below. -->
<GeometryModel3D.Transform>
<TranslateTransform3D x:Name="myTranslateTransform3D" OffsetX="0" OffsetY="0" OffsetZ="0" />
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the TranslateTransform3D animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
<!-- This animation animates the OffsetX property of the TranslateTransform3D. -->
<DoubleAnimation
Storyboard.TargetName="myTranslateTransform3D"
Storyboard.TargetProperty="OffsetX"
To="-0.8"
AutoReverse="True" RepeatBehavior="Forever" />
<!-- If you want to animate OffsetY and/or OffsetZ, create similar DoubleAnimations
respectively. -->
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Skalowanie przekształceń
ScaleTransform3D zmienia skalę modelu według określonego wektora skalowania z odwołaniem do punktu środkowego. Określ jednolitą skalę, która skaluje model według tej samej wartości w osiach X, Y i Z, aby proporcjonalnie zmienić rozmiar modelu. Na przykład ustawienie właściwości przekształcenia ScaleXna ScaleYScaleZ 0,5 po połowę rozmiaru modelu; ustawienie tych samych właściwości na 2 dwukrotnie zwiększa skalę we wszystkich trzech osiach.
Przykład skalowaniavectora
Określając niez jednolitą transformację skali — transformację skali, której wartości X, Y i Z nie są takie same — można spowodować rozciągnięcie modelu lub kontrakt w jednym lub dwóch wymiarach bez wpływu na inne. Na przykład ustawienie ScaleX wartości 1, 2 i ScaleZ 1 spowodowałoby, że przekształcony model podwoił wysokość, ScaleY ale pozostał niezmieniony wzdłuż osi X i Z.
Domyślnie funkcja ScaleTransform3D powoduje rozwinięcie wierzchołków lub zakontraktowanie źródła (0,0,0). Jeśli model, który chcesz przekształcić, nie jest pobierany ze źródła, jednak skalowanie modelu ze źródła nie spowoduje skalowania modelu "na miejscu". Zamiast tego, gdy wierzchołki modelu są mnożone przez wektor skalowania, operacja skalowania będzie miała wpływ na tłumaczenie modelu, a także skalowanie go.
Przykład centrum skalowania
Aby skalować model "na miejscu", określ środek modelu, ustawiając właściwości i właściwości ScaleTransform3DCenterXCenterYCenterZ. Dzięki temu system graficzny skaluje przestrzeń modelu, a następnie tłumaczy ją na środek w określonym Point3Dobiekcie . Z drugiej strony, jeśli model został utworzony na temat źródła i określ inny punkt środkowy, spodziewaj się, że model zostanie przetłumaczony z dala od źródła.
Przekształcenia obrotu
Model można obracać w 3D na kilka różnych sposobów. Typowa transformacja obrotu określa oś i kąt obrotu wokół tej osi. Klasa RotateTransform3D umożliwia zdefiniowanie obiektu Rotation3D z jej Rotation właściwością. Następnie należy określić Axis właściwości i Angle w rotacji3D, w tym przypadku AxisAngleRotation3D, aby zdefiniować przekształcenie. Poniższe przykłady obracają model o 60 stopni wokół osi Y.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- Defines the camera used to view the 3D object. -->
<Viewport3D.Camera>
<PerspectiveCamera x:Name="myPerspectiveCamera" Position="0,0,2" LookDirection="0,0,-1"
FieldOfView="60" />
</Viewport3D.Camera>
<!-- The ModelVisual3D children contain the 3D models -->
<Viewport3D.Children>
<!-- Two ModelVisual3D define the lights cast in the scene. Without light, the
3D object cannot be seen. Also, the direction of the lights affect shadowing. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created. -->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5 " />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. The properties of the
Rotation object are animated causing the 3D object to rotate and "wobble" (see Storyboard below).-->
<GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="myAngleRotation" Axis="0,3,0" Angle="40" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the rotation animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
<!-- This animation animates the Angle property of the AxisAngleRotation3D
making the 3D object rotate from -60 degrees to 60 degrees. -->
<DoubleAnimation
Storyboard.TargetName="myAngleRotation"
Storyboard.TargetProperty="Angle"
From="-60" To="60" Duration="0:0:4" AutoReverse="True" RepeatBehavior="Forever"/>
<!-- This animation animates the Axis property of the AxisAngleRotation3D
making the 3D wobble as it rotates. -->
<Vector3DAnimation
Storyboard.TargetName="myAngleRotation"
Storyboard.TargetProperty="Axis"
From="0,3,0" To="1,0,1" Duration="0:0:4" AutoReverse="True" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Uwaga: Windows Presentation Foundation (WPF) 3D to system praworęczny, co oznacza, że dodatnia wartość kąta dla obrotu powoduje obrót w kierunku przeciwnym do zegara o osi.
Rotacje kątów osi zakładają rotację źródła, jeśli wartość nie jest określona dla CenterXwłaściwości , CenterYi CenterZ w obrótceTransform3D. Podobnie jak w przypadku skalowania, warto pamiętać, że rotacja przekształca całą przestrzeń współrzędnych modelu. Jeśli model nie został utworzony na temat źródła lub został wcześniej przetłumaczony, rotacja może "przestawiać się" na temat źródła zamiast obracać się na miejscu.
Rotacja z określonym nowym środkiem
Aby obrócić model "na miejscu", określ rzeczywiste centrum modelu jako środek obrotu. Ponieważ geometria jest zwykle modelowana na temat źródła, najczęściej można uzyskać oczekiwany wynik zestawu przekształceń, najpierw określając rozmiar modelu (skalowanie go), a następnie ustawiając jego orientację (obracając ją), a następnie przenosząc go do żądanej lokalizacji (tłumacząc ją).
Przykład rotacji
Rotacje kątów osi dobrze sprawdzają się w przypadku przekształceń statycznych i niektórych animacji. Należy jednak rozważyć rotację modelu modułu 60 stopni wokół osi X, a następnie 45 stopni wokół osi Z. Tę transformację można opisać jako dwie dyskretne przekształcenia affine lub macierz. Jednak płynne animowanie rotacji zdefiniowanej w ten sposób może być trudne. Mimo że początkowe i końcowe pozycje modelu obliczone przez jedną z metod są takie same, pozycje pośrednie podjęte przez model są obliczanie niepewne. Kwanty reprezentują alternatywny sposób obliczania interpolacji między rozpoczęciem i końcem rotacji.
Quaternion reprezentuje oś w przestrzeni 3D i obrót wokół tej osi. Na przykład quaternion może reprezentować oś (1,1,2) i obrót 50 stopni. Potęga Quaternions w definiowaniu rotacji pochodzi z dwóch operacji, które można wykonać na nich: kompozycji i interpolacji. Kompozycja dwóch kwaternionów zastosowanych do geometrii oznacza "obracanie geometrii wokół osi 2 przez obrót2, a następnie obracanie jej wokół osi 1 przez obrót1". Używając kompozycji, można połączyć dwie rotacje na geometrii, aby uzyskać pojedynczy kwantion, który reprezentuje wynik. Ponieważ interpolacja kwestionów może obliczyć gładką i rozsądną ścieżkę z jednej osi i orientacji na drugą, można interpolować z oryginalnej do skomponowanej kwanty, aby osiągnąć płynne przejście z jednej do drugiej, umożliwiając animowanie transformacji. W przypadku modeli, które chcesz animować, można określić miejsce docelowe Quaternion dla rotacji przy użyciu elementu QuaternionRotation3D dla Rotation właściwości .
Korzystanie z kolekcji przekształceń
Podczas tworzenia sceny często stosuje się więcej niż jedną transformację do modelu. Dodawanie przekształceń do Children kolekcji Transform3DGroup klasy w celu grupowania przekształca się wygodnie w celu zastosowania do różnych modeli w scenie. Często wygodne jest ponowne użycie przekształcenia w kilku różnych grupach, w sposób, w jaki można ponownie użyć modelu, stosując inny zestaw przekształceń do każdego wystąpienia. Należy pamiętać, że kolejność dodawania przekształceń do kolekcji jest znacząca: przekształcenia w kolekcji są stosowane od pierwszego do ostatniego.
Animowanie przekształceń
Implementacja 3D programu Windows Presentation Foundation (WPF) uczestniczy w tym samym chronometrażu i systemie animacji co grafika 2D. Innymi słowy, aby animować scenę 3D, animować właściwości swoich modeli. Można animować właściwości pierwotnych bezpośrednio, ale zazwyczaj łatwiej jest animować przekształcenia, które zmieniają położenie lub wygląd modeli. Ponieważ przekształcenia można stosować do Model3DGroup obiektów, a także poszczególnych modeli, można zastosować jeden zestaw animacji do elementów podrzędnych grupy Model3Dgroup, a drugi zestaw animacji do grupy obiektów. Aby uzyskać podstawowe informacje na temat systemu chronometrażu i animacji programu Windows Presentation Foundation (WPF), zobacz Omówienie animacji i scenorysy — omówienie.
Aby animować obiekt w programie Windows Presentation Foundation (WPF), utwórz oś czasu, zdefiniuj animację (która jest naprawdę zmianą w niektórych wartościach właściwości w czasie) i określ właściwość, do której ma zostać zastosowana animacja. Ta właściwość musi być właściwością elementu FrameworkElement. Ponieważ wszystkie obiekty w scenie 3D są elementami podrzędnymi viewport3D, właściwości przeznaczone dla każdej animacji, którą chcesz zastosować do sceny, są właściwościami właściwości Viewport3D. Ważne jest, aby dokładnie wypracować ścieżkę właściwości dla animacji, ponieważ składnia może być szczegółowa.
Załóżmy, że chcesz obrócić obiekt na miejscu, ale także zastosować ruch kołyszący w celu uwidocznienia większej liczby obiektów do wyświetlenia. Możesz zastosować do modelu obróćTransform3D i animować oś jego obrotu z jednego wektora do drugiego. W poniższym przykładzie kodu pokazano zastosowanie elementu Vector3DAnimation do właściwości Oś przekształcenia Rotation3D, przy założeniu, że funkcja RotateTransform3D ma być jedną z kilku przekształceń zastosowanych do modelu za pomocą TransformGroupelementu .
//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
Użyj podobnej składni, aby kierować inne właściwości transformacji do przenoszenia lub skalowania obiektu. Na przykład można zastosować element Point3DAnimation do właściwości ScaleCenter w przekształceniu skali, aby spowodować, że model płynnie zniekształca jego kształt.
Chociaż powyższe przykłady przekształcają właściwości GeometryModel3D, można również przekształcić właściwości innych modeli w scenie. Na przykład poprzez animowanie tłumaczeń zastosowanych do obiektów Light można na przykład utworzyć poruszające się efekty światła i cienia, które mogą znacząco zmienić wygląd modeli.
Ponieważ aparaty fotograficzne są również modelami, można również przekształcić właściwości aparatu. Chociaż z pewnością można zmienić wygląd sceny, przekształcając lokalizację aparatu lub odległości płaszczyzny — w efekcie przekształcając całą projekcję sceny — należy pamiętać, że wiele efektów, które można osiągnąć w ten sposób, może nie sprawić, że tak samo "wizualne poczucie" dla osoby przeglądającej, jak przekształcenia zastosowane do lokalizacji lub położenia modeli w scenie.
Zobacz też
.NET Desktop feedback