3B Dönüşümlere Genel Bakış
bu konu, Windows Presentation Foundation (WPF) grafik sisteminde 3b modellere nasıl dönüşüm uygulanacağını açıklar. Dönüşümler, geliştiricilerin bunları tanımlayan Taban değerleri değiştirmeden modelleri yeniden konumlandırmasına, yeniden boyutlandırmasına ve yeniden erişmesine izin verir.
3B koordinat alanı
Windows Presentation Foundation (WPF) içindeki 3b grafik içeriği, Viewport3D iki boyutlu öğe yapısına katılabileceğiniz bir öğede kapsüllenir. grafik sistemi, Viewport3D (WPF) ' Windows Presentation Foundation de birçok diğer gibi iki boyutlu bir görsel öğe olarak davranır. Viewport3D, üç boyutlu bir sahneye bir pencere görünümü (Görünüm penceresi) olarak çalışır. Daha doğru bir şekilde, 3B sahnenin yansıtılmasına yönelik bir yüzey vardır. Viewport3D 'i aynı sahne grafiğinde diğer 2B çizim nesneleriyle birlikte kullanabilseniz de bir Viewport3D içindeki 2B ve 3B nesneleri birbirine karışamaz. Aşağıdaki tartışmada, açıklanan koordinat alanı Viewport3D öğesinin içindedir.
2b grafik için Windows Presentation Foundation (WPF) koordinat sistemi, işleme yüzeyinin sol üst kısmındaki kaynağı bulur (genellikle ekran). 2B sistemde, pozitif x ekseni değerleri doğru ve pozitif y ekseni değerleri aşağı devam ediyor. Ancak 3B koordinat sisteminde, kaynak ekranın ortasında bulunur, pozitif x ekseni değerleri sağa devam ediyor ancak pozitif y ekseni değerleri sıfırdan devam ediyor, ancak pozitif z ekseni değerleri, görüntüleyiciye doğru bir başlangıç noktasından dışarı doğru devam ediyor.

Koordinat sistemi karşılaştırması
bu eksenlerde tanımlanan alan, Windows Presentation Foundation (WPF) içindeki 3b nesneler için başvuru sabit çerçevesidir. Bu alanda modeller oluştururken ve bunları görüntülemek için ışıklar ve kameralar oluşturdığınızda, buna dönüşümler uyguladığınızda, bu sabit başvuru çerçevesini veya "Dünya alanı" ' nı her bir model için oluşturduğunuz yerel başvuru çerçevelerinden ayırt etmek yararlı olur. Ayrıca, açık ve kamera ayarlarına bağlı olarak dünya alanındaki nesnelerin tamamen farklı görünebileceğini veya hiç görünmediğine de unutmayın, ancak kameranın konumu Dünya alanındaki nesnelerin konumunu değiştirmez.
Modelleri dönüştürme
Modeller oluşturduğunuzda, sahnede belirli bir konum vardır. Bu modelleri sahne içinde hareket ettirmek, döndürmek veya boyutunu değiştirmek için modelleri tanımlayan köşeleri değiştirmek pratik değildir. Bunun yerine, 2B ' de olduğu gibi modellere dönüşümler uygularsınız.
Her model nesnesi, Transform modeli taşıyabileceğiniz, yeniden yönlendirebileceğiniz veya yeniden boyutlandırabileceğiniz bir özelliğine sahiptir. Bir dönüşüm uyguladığınızda, dönüşüm tarafından belirtilen vektör veya değere göre modelin tüm noktalarını etkin bir şekilde fark edersiniz. Diğer bir deyişle, modelin tanımlandığı koordinat alanını ("model alanı") dönüştürürsünüz, ancak tüm sahnenin koordinat sisteminde modelin geometrisini oluşturan değerleri ("Dünya alanı") değiştirmezsiniz.
Çeviri dönüştürmeleri
3B dönüşümler soyut temel sınıftan devralınır Transform3D ; Bunlar, ve ' yi kapsayan dönüştürme sınıflarını içerir TranslateTransform3DScaleTransform3DRotateTransform3D . Windows Presentation Foundation (WPF) 3b sistem ayrıca MatrixTransform3D , daha kısa matris işlemlerinde aynı dönüştürmeleri belirtmenize imkan tanıyan bir sınıf sağlar.
TranslateTransform3D Model3D içindeki tüm noktaları,, ve özellikleriyle belirttiğiniz konum vektörünün yönünde taşıtırın OffsetXOffsetYOffsetZ . Örneğin, (2, 2, 2) konumundaki bir küpün bir köşesi söz konusu olduğunda (0, 1.6, 1), bu köşeyi (2, 2, 2) (2, 3.6, 3) öğesine taşıyabilecek. Küpün köşesi model alanında hala (2, 2, 2), ancak model alanının (2, 2, 2) dünya alanında (2, 3.6, 3) olması için bu model alanı dünya alanı ilişkisini değiştirdi.

Uzaklığa sahip çeviri
Aşağıdaki kod örnekleri, bir çevirinin nasıl uygulanacağını gösterir.
<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>
Ölçek dönüşümleri
ScaleTransform3D modelin ölçeğini, bir orta noktaya başvuru ile belirtilen bir ölçek vektörüne dönüştürür. Modelin boyutunu orantılı olarak değiştirmek için modeli X, Y ve Z eksenlerinde aynı değere göre ölçeklendirerek bir Tekdüzen ölçeği belirtin. Örneğin, dönüşümün ScaleX , ScaleY ve ScaleZ özelliklerinin 0,5 olarak ayarlanması, modelin boyutunu durdurur; aynı özellikleri 2 ' ye ayarlamak üç eksende ölçeğini iki katına çıkarır.

ScaleVector örneği
Tek biçimli olmayan bir ölçek dönüştürmesi belirterek — X, Y ve Z değerleri aynı olmayan bir ölçek dönüşümü — bir modelin, diğerlerini etkilemeden bir veya iki boyutta genişlemesine veya anlaşmasına neden olabilirsiniz. Örneğin, ScaleX 1 ' e ScaleY ve 2 ' ye ayarlandığında, ScaleZ dönüştürülmüş modelin yükseklik içinde çift olmasına neden olur, ancak X ve Z eksenleri boyunca değişmeden kalır.
ScaleTransform3D, varsayılan olarak köşelerin (0, 0, 0) kaynak hakkında genişlemesine veya anlaşmasına neden olur. Dönüştürmek istediğiniz model kaynaktan çizilmemişse, modelin kaynaktan ölçeklendirilmesi, modeli "yerinde" ölçeklendirmeyecektir. Bunun yerine, modelin köşeleri ölçek vektörü ile çarpıldığı zaman, ölçek işlemi modeli çevirme ve ölçeklendirmeyi de etkiler.

Ölçek merkezi örneği
"Yerinde" bir modeli ölçeklendirmek için, ScaleTransform3D's CenterX , CenterY , ve özelliklerini ayarlayarak modelin merkezini belirtin CenterZ . Bu, grafik sisteminin model alanını ölçeklendirmesini ve sonra belirtilen ' ı ortasına çevirmesini sağlar Point3D . Buna karşılık, kaynak hakkında modeli derlediyseniz ve farklı bir orta nokta belirttiğinizde, modelin kaynaktan uzağa çevrildiğini görmeniz beklenir.
Döndürme dönüştürmeleri
3D olarak bir modeli birkaç farklı şekilde döndürebilirsiniz. Tipik bir döndürme dönüştürmesi bir ekseni ve bu eksen etrafında döndürme açısını belirtir. RotateTransform3DSınıfı, Rotation3D özelliği ile birlikte tanımlamanızı sağlar Rotation . Daha sonra, AxisAngle Bu örnekte, dönüşümü tanımlamak için Rotation3D üzerinde ve özelliklerini belirtirsiniz AxisAngleRotation3D . Aşağıdaki örneklerde, Y ekseni etrafında bir model 60 derece döndürülür.
<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>
Note: Windows Presentation Foundation (WPF) 3b, doğru bir döndürme sistemidir, yani bir dönüşle ilgili pozitif bir açı değeri, eksen ile ilgili olarak saat yönünde bir dönüşle sonuçlanır.
Eksen-açı döndürmeler CenterX , CenterY RotateTransform3D üzerindeki,, ve özellikleri için bir değer belirtilmemişse, Origin ile ilgili dönüşü kabul eder CenterZ . Ölçeklendirmeyle birlikte, döndürmenin modelin tüm koordinat alanını dönüştürdüğünü hatırlamak yararlı olur. Model, kaynak hakkında oluşturulmadıysa veya daha önce çevrilmişse, döndürme yerine, kaynak hakkında "Özet" olabilir.

Yeni Merkezi belirtilen döndürme
Modeli "yerinde" döndürmek için, modelin gerçek merkezini döndürme merkezi olarak belirtin. Geometri genellikle kaynak hakkında modellendiği için, önce modeli boyutlandırarak (ölçeklendirirken) bir dönüştürme kümesinin beklenen sonucunu elde edebilir, sonra da onun yönünü ayarlayabilir (onu döndürerek) ve son olarak istediğiniz konuma taşıyabilirsiniz (çevirme).

Döndürme örneği
Eksen-açı döndürmeler, statik dönüşümler ve bazı animasyonlar için iyi çalışır. Ancak, X ekseninin bir küp modeli 60 derece, sonra da Z ekseni etrafında 45 derece döndürmeyi düşünün. Bu dönüştürmeyi iki ayrı afin dönüştürmesi veya matris olarak tanımlayabilirsiniz. Ancak, bu şekilde tanımlanan bir dönüşü sorunsuzca hareketlendirmek zor olabilir. Her iki yaklaşım tarafından hesaplanan modelin başlangıç ve bitiş konumları aynı olsa da, model tarafından alınan ara konumlar hesaplama açısından kesin değildir. Dördegenler, bir döndürmenin başlangıcı ve bitişi arasındaki ilişkilendirmeyi hesaplamak için alternatif bir yol temsil eder.
Dörde, 3B alanda bir ekseni ve bu eksenin etrafında bir döndürme temsil eder. Örneğin, dörde bir (1, 1, 2) ekseni ve 50 derece dönüşü temsil edebilir. Döndürmeler 'in tanımlanmasıyla ilgili olarak, bu işlemler üzerinde gerçekleştirebileceğiniz iki işlemden geliyor: bileşim ve ilişkilendirme. Bir geometriye uygulanan iki dörde 'nın bileşimi, "rotation2 by Axis2 etrafında geometriyi döndürme, sonra rotation1 ile axis1 ile döndürme" anlamına gelir. Kompozisyonu kullanarak, sonucu temsil eden tek bir dörde elde etmek için geometrideki iki ölçütü birleştirebilirsiniz. Dörde enterpolasyon, bir eksenden ve hizalamalardan sorunsuz ve makul bir yolu hesaplayabildiğinden, bir diğerinden diğerine kesintisiz bir geçiş elde etmek için, dönüşüme animasyon uygulamanızı sağlayarak orijinalden oluşan dörde daha fazla enterpolabilirsiniz. Hareketlendirmek istediğiniz modeller için, Quaternion özelliği için bir kullanarak döndürme için bir hedef belirtebilirsiniz QuaternionRotation3DRotation .
Dönüşüm koleksiyonları kullanma
Bir sahne oluştururken bir modele birden fazla dönüşüm uygulamak yaygındır. ChildrenTransform3DGroup Dönüştürmeleri gruplamak için sınıf koleksiyonuna dönüşümler ekleyerek, sahnedeki çeşitli modellere kolayca uygulayabilirsiniz. Her örneğe farklı bir dönüşüm kümesi uygulayarak bir modeli yeniden kullanabilmenin pek çok farklı grupta bir dönüştürmeyi yeniden kullanmak genellikle yararlıdır. Dönüştürmelerin koleksiyona eklendiği sıra önemli olduğunu unutmayın: koleksiyondaki dönüşümler birinciden en son ' a uygulanır.
Dönüşümleri Hareketlendirme
Windows Presentation Foundation (WPF) 3b uygulama, 2b grafiklerle aynı zamanlama ve animasyon sistemine katılır. Diğer bir deyişle, 3B sahneye animasyon uygulamak için modellerinin özelliklerine animasyon ekleyin. Temel elemanların özelliklerine doğrudan animasyon eklemek mümkündür, ancak modellerin konumunu veya görünümünü değiştiren dönüştürmelerin animasyonunu genellikle daha kolay hale gelir. Dönüşümler Model3DGroup nesnelere ve ayrı modellere uygulanabileceğinden, bir animasyon kümesini bir Model3DGroup alt öğesine ve başka bir animasyon kümesinin bir nesne grubuna uygulamak mümkündür. Windows Presentation Foundation (WPF) zamanlama ve animasyon sistemiyle ilgili arka plan bilgileri için bkz. animasyon genel bakış ve görsel taslaklara genel bakış.
Windows Presentation Foundation (WPF) içindeki bir nesneye animasyon uygulamak için, bir zaman çizelgesi oluşturun, bir animasyon tanımlayın (zaman içinde bazı özellik değerlerindeki bir değişiklik) ve animasyonun uygulanacağı özelliği belirtin. Bu özellik FrameworkElement 'in bir özelliği olmalıdır. Bir 3B sahnedeki tüm nesneler Viewport3D alt öğesi olduğundan, sahneye uygulamak istediğiniz herhangi bir animasyonun hedeflediği Özellikler Viewport3D özelliklerinin özellikleridir. Söz dizimi ayrıntılı olabileceğinden animasyon için özellik yolunun dikkatli bir şekilde çalışması önemlidir.
Bir nesneyi yerinde döndürmek istediğinizi varsayalım, ancak daha fazla nesne görüntülemek için bir uygulama hareketi uygulamak için de bir hareket uygulayın. Modele bir RotateTransform3D uygulamayı ve döndürme eksenini bir vektörden diğerine hareketlendirmek tercih edebilirsiniz. Aşağıdaki kod örneği, Vector3DAnimation RotateTransform3D ile modele uygulanan birkaç dönüşümden biri olduğunu varsayarak, dönüştürmenin Rotation3D Axis özelliğine uygulanmasını gösterir 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
Nesneyi taşımak veya ölçeklendirmek için diğer dönüştürme özelliklerini hedeflemek üzere benzer bir sözdizimi kullanın. Örneğin, bir Point3DAnimation modelin şeklini sorunsuz bir şekilde bozmasına yol açmak için ölçek dönüşümünden ScaleCenter özelliğine bir uygulayabilirsiniz.
Önceki örnekler öğesinin özelliklerini dönüştürse GeometryModel3D de, sahnedeki diğer modellerin özelliklerini dönüştürmek de mümkündür. Örneğin, ışık nesnelerine uygulanan çevirileri canlandırarak, modellerinizin görünüşünü önemli ölçüde değiştirebilmesini sağlayan hareketli ışık ve gölge etkileri oluşturabilirsiniz.
Kameralar da modeller olduğundan, kamera özelliklerini de dönüştürmek mümkündür. Kamera konumunu veya düzlem mesafelerini dönüştürerek sahnenin görünümünü büyük ölçüde değiştirebilirken (efekt, tüm sahne projeksiyonunu dönüştürerek), bu şekilde elde ettiğiniz etkilerin, sahnedeki modellerin konumuna veya konumuna uygulanan dönüşümler olarak görüntüleyiciye "görsel anlam" sunabileceğini unutmayın.