3B Grafiklere Genel Bakış
Windows Presentation Foundation (WPF) içinde 3B işlevsellik, geliştiricilerin hem işaretleme hem de yordam kodunda 3B grafikler çizmesini, dönüştürmesini ve animasyonlarını oluşturmalarını sağlar. Geliştiriciler zengin denetimler oluşturmak, verilerin karmaşık çizimlerini sağlamak veya bir uygulama arabiriminin kullanıcı deneyimini geliştirmek için 2D ve 3D grafikleri bir araya oluşturabilir. WPF'de 3B destek, tam özellikli bir oyun geliştirme platformu sağlamak için tasarlanmaz. Bu konu, WPF grafik sistemi 3B işlevselliğine genel bir bakış sağlar.
2D Kapsayıcıda 3D
WPF'de 3B grafik içeriği, iki boyutlu öğe yapısına katabilirsiniz Viewport3D öğesinde kapsüller. Grafik sistemi, Viewport3D WPF'de diğer birçok öğe gibi iki boyutlu bir görsel öğe olarak davranır. Viewport3D üç boyutlu bir görünüme pencere (görünüm penceresi) olarak işlev gösterir. Daha doğru bir şekilde, 3D sahnenin üzerinde tahmin edilen bir yüzeydir.
Geleneksel bir 2D uygulamasında, Kılavuz Viewport3D veya Tuval gibi başka bir kapsayıcı öğesi gibi kullanın. Aynı sahne grafında diğer 2D çizim nesneleriyle birlikte kullanabilirsiniz, ancak bir içindeki Viewport3D 2D ve 3D nesneleri arasında etkileşim kuramazsiniz. Viewport3D Bu konu, içinde 3D grafik çizmeye Viewport3D odaklanacak.
3D Koordinat Alanı
2B grafikler için WPF koordinat sistemi, işleme alanı (genellikle ekran) sol üst köşesinde kaynağı yerini alır. 2D sistemde pozitif x ekseni değerleri sağa, pozitif y ekseni değerleri ise aşağı doğru ilerler. Ancak 3B koordinat sisteminde çıkış noktası, işleme alanı merkezinde bulunur ve pozitif x ekseni değerleri sağa, pozitif y ekseni değerleri ise yukarı doğru ilerler ve pozitif z ekseni değerleri çıkıştan dışa doğru görüntüleyiciye doğru ilerler.

Geleneksel 2D ve 3D koordinat sistemi gösterimleri
Bu eksenler tarafından tanımlanan alan, WPF'de 3B nesneler için sabit başvuru çerçevesidir. Bu alanda modeller oluşturduktan ve bunları görüntülemek için ışık ve kameralar oluşturduktan sonra, bu sabit başvuru çerçevesini veya "dünya alanı"nın, her model için dönüşümleri uygulayan yerel başvuru çerçevesinden ayırt etmek yararlı olur. Ayrıca, ışık ve kamera ayarlarına bağlı olarak dünya alanı nesnelerinin tamamen farklı görünebilir veya hiç görünür olamayabilirsiniz, ancak kameranın konumu, dünya uzaydaki nesnelerin konumunu değiştirmez.
Kameralar ve Projeksiyonlar
2 boyutlu olarak çalışan geliştiriciler çizim temellerini iki boyutlu bir ekranda konumlandırmaya alışkındır. 3D sahne oluştururken, 3D nesnelerin gerçekten 2D gösterimini oluşturmakta olduğunu unutmanız önemlidir. 3D sahne, ilgili görünüme bağlı olarak farklı bir görünüme sahip olduğundan, bu görünüm noktasını belirtmeniz gerekir. sınıfı, Camera bir 3D sahne için bu görünüm noktasını belirtmenize olanak sağlar.
3D sahnenin 2D yüzeyde nasıl temsil edildiklerini anlamanın bir diğer yolu da sahneyi görüntüleme yüzeyine yansıtma olarak ifade etmektir. , farklı projeksiyonları ve bunların özelliklerini belirtmenize olanak sağlar. Bu sayede, kişi ProjectionCamera 3D modelleri nasıl görür? , PerspectiveCamera sahneyi foreshortens bir projeksiyon belirtir. Başka bir deyişle, PerspectiveCamera yok olan nokta perspektifi sağlar. Kameranın konumunu sahnenin koordinat alanında, kameranın yönünü ve görünümünün alanını ve sahnenin "yukarı" yönünü tanımlayan vektörü belirtebilirsiniz. Aşağıdaki diyagramda PerspectiveCamera projeksiyonu göstermektedir.
ve NearPlaneDistanceFarPlaneDistanceProjectionCamera özellikleri, kamera projeksiyonu aralığını sınırlar. Kameralar sahnenin herhangi bir yerinde yer alade olduğundan, kamera aslında bir modelin içine veya modelin çok yakınında yer alıyor olabilir ve bu da nesneleri düzgün ayırt etmek için zor hale geliyor. NearPlaneDistance , kameradan nesnelerin çekilemayacak en düşük mesafeyi belirtmenize olanak sağlar. Buna karşılık, kameradan çekilen nesnelerin ötesinde bir mesafe belirtmenize olanak sağlar ve bu sayede tanınmayacak kadar uzak nesneler sahneye dahil FarPlaneDistance edilemez.

Kamera konumu
OrthographicCamera 3D modelin 2D görsel yüzeyine dik bir projeksiyonu belirtir. Diğer kameralarda olduğu gibi konumu, görüntüleme yönünü ve "yukarı" yönü belirtir. Ancak, PerspectiveCameraOrthographicCamera aksine, perspektif foreshortening içermemiş bir projeksiyon açıklar. Başka bir deyişle, yanları kamerada bir noktada bir araya geliyorsa, yanları paralel OrthographicCamera olan bir görüntüleme kutusunu açıklar. Aşağıdaki görüntüde, ve kullanılarak görüntüle aynı modelin nasıl görüntüll olduğu PerspectiveCameraOrthographicCamera gösterir.

Perspektif ve Görsel Projeksiyonlar
Aşağıdaki kod bazı tipik kamera ayarlarını gösterir.
// 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 ve Mesh TemelLeri
Model3D , genel bir 3D nesnesini temsil eden soyut temel sınıftır. Bir 3D sahne oluşturmak için, görüntülemek için bazı nesnelere ihtiyacınız vardır ve sahne grafiğini oluşturur nesneleri ' den Model3D türetilen. WpF şu anda ile geometri modellemeyi GeometryModel3D destekler. Bu Geometry modelin özelliği bir ilkel örgü alır.
Model oluşturmak için ilkel veya örgü oluşturmayla başlayabilirsiniz. 3D temel öğe, tek bir 3D varlık formuna sahip köşelerden bir koleksiyondur. Çoğu 3D sistem, en basit kapalı şekilde modelli ilkeller sağlar: üç köşeyle tanımlanan bir üçgen. Bir üçgenin üç noktası birden çok olduğu için, daha karmaşık şekiller (meshes) modeline sahip olmak için üçgen eklemeye devam edersiniz.
WPF 3D sistemi şu anda herhangi bir geometri belirtmenize olanak sağlayan sınıfını sağlar; şu anda, küreler ve çeşitli formlar gibi önceden tanımlanmış 3B temelleri MeshGeometry3D desteklemez. Özelliği olarak MeshGeometry3D üçgen köşelerin listesini belirterek bir oluşturmaya Positions başlayabilirsiniz. Her köşe olarak Point3D belirtilir. (Extensible Application Markup Language (XAML) içinde, bu özelliği her köşenin koordinatlarını temsil eden üçler içinde gruplandı bir sayı listesi olarak belirtin.) Ağınız geometriye bağlı olarak birçok üçgenden ve bazıları aynı köşeleri (köşeleri) paylaşıyor olabilir. WPF, ağı doğru şekilde çizmek için hangi köşelerin hangi üçgenler tarafından paylaşıldıkları hakkında bilgi almak istiyor. Bu bilgileri, özelliğiyle birlikte üçgen dizinlerinin bir listesini belirterek TriangleIndices sağlar. Bu liste, listede belirtilen noktaların bir Positions üçgeni belirleme sırası belirtir.
<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>
Yukarıdaki örnekte liste, Positions küp şeklinde bir örgü tanımlamak için sekiz köşe belirtir. TriangleIndicesözelliği, üç dizinden on iki grup listesini belirtir. Listede yer alan her sayı, listede bir kaydırmaya Positions başvurur. Örneğin, liste tarafından belirtilen ilk üç köşe Positions (1,1,0), (0,1,0) ve (0,0,0) köşelerdir. Liste tarafından belirtilen ilk üç dizin 0, 2 ve 1'tir ve bu da listenin ilk, üçüncü ve TriangleIndices ikinci noktalarına Positions karşılık gelen dizindir. Sonuç olarak, küp modelini yapan ilk üçgen (1,1,0) ile (0,1,0) ile (0,0,0) arasında oluşur ve kalan on bir üçgen de benzer şekilde belirlenir.
ve özellikleri için değerler belirterek modeli tanımlamaya Normals devam TextureCoordinates edersiniz. Grafik sistemi, modelin yüzeyini işlemek için belirli bir üçgende yüzeyin hangi yöne dönük olduğuyla ilgili bilgilere ihtiyaç gösterir. Model için aydınlatma hesaplamaları yapmak üzere bu bilgileri kullanır: doğrudan bir ışık kaynağına doğru yüz yüze gelen yüzeyler, ışıktan uzak olanlardan daha parlak görünür. WPF konum koordinatlarını kullanarak varsayılan normal vektörleri belirleyese de, eğri yüzeylerin görünümünü yaklaşık olarak belirlemek için farklı normal vektörler de belirtabilirsiniz.
özelliği, grafik sistemine dokuların mesh'in köşeleri ile nasıl çizil olduğunu belirleyen koordinatları eşlemeyi belirten TextureCoordinatesPoint bir koleksiyonu belirtir. TextureCoordinates sıfır ile 1 (dahil) arasında bir değer olarak belirtilir. özelliğinde olduğu gibi, grafik sistemi varsayılan doku koordinatlarını hesaplıyor olabilir, ancak yinelenen desenin bir parçası içeren doku eşlemesini kontrol etmek için farklı doku koordinatları Normals ayarlamayı seçebilirsiniz, örneğin. Doku koordinatları hakkında daha fazla bilgi sonraki konu başlıklarında veya Yönetilen Direct3D SDK'da bulunabilir.
Aşağıdaki örnekte, yordamsal kodda küp modelinin bir yüzünün nasıl oluşturulacakları gösterir. Küpün tamamını tek bir GeometryModel3D olarak çizebilirsiniz; Bu örnek, daha sonra her yüze ayrı dokular uygulamak için küpün yüzünü ayrı bir model olarak çizilir.
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))
Modele Malzeme Uygulama
Bir örgünin üç boyutlu bir nesneye bensil edebilmek için köşeleri ve üçgenleri ile tanımlanan yüzeyi kapsayarak kamera tarafından yanarak projek için uygulanmış bir dokuya sahip olması gerekir. 2D'de, ekranın Brush alanlarına renkleri, desenleri, gradyanları veya diğer görsel içeriği uygulamak için sınıfını kullanırsiniz. Ancak 3D nesnelerin görünümü, yalnızca uygulanan renk veya desenden değil, aydınlatma modelinin bir işlevidir. Gerçek dünya nesneleri, yüzeylerinin kalitesine bağlı olarak ışığı farklı şekilde yansıtır: parlak ve parlak yüzeyler kaba veya mat yüzeyler ile aynı görünmez ve bazı nesneler ışığın yanı sıra diğerleri parlıyor gibi görünüyor. 2D nesnelere uygulayabilecek 3D nesnelere aynı fırçaları uygulayabilirsiniz, ancak bunları doğrudan uygulayamazsiniz.
WPF, modelin yüzeyinin özelliklerini tanımlamak için soyut Material sınıfı kullanır. Material'in somut alt sınıfları, modelin yüzeyinin bazı görünüm özelliklerini belirler ve her biri solidColorBrush, TileBrush veya VisualBrush'a geçilen bir Brush özelliği de sağlar.
DiffuseMaterial fırçanın modele, modelin dağınık bir şekilde yanmış gibi uygulan olacağını belirtir. En çok 2D modellerde fırça kullanımına benzeyen Vensmaterial kullanmak; model yüzeyleri ışığı parlak gibi yansıtmaz.
SpecularMaterial fırçanın modele, modelin yüzeyi sabit veya parlak gibi uygulanacak ve vurguları yansıtabilecek şekilde olacağını belirtir. özelliği için bir değer belirterek dokuda bu yansıtıcı kaliteyi önerme derecesini veya "parlak" değeri belirterek bunu SpecularPower belirtabilirsiniz.
EmissiveMaterial dokuyu, modelin fırça rengine eşit bir ışık yayan bir şekilde uygulanacak şekilde belirtmenizi sağlar. Bu, modeli hafif bir hale değildir; ancak, Gölgelemede, TextureMaterial veya SpecularMaterial ile dokulu ise farklı şekilde gölgelemede yer alar.
Daha iyi performans için, bir (kameradan modelin ters tarafında olduğundan görünümün dışında olan yüzler) arka yüzleri GeometryModel3D sahneden dorsa. Düzlem gibi Material bir modelin arka yüzüne uygulanacak bir belirtmek için, modelin özelliğini BackMaterial ayarlayın.
Parıldayan veya yansıtıcı etkiler gibi bazı yüzey niteliklerini elde etmek için, bir modele tekrar tekrar birkaç farklı fırça uygulamak iyi olabilir. sınıfını kullanarak birden çok Malzeme uygulayabilir ve yeniden MaterialGroup kullanabilirsiniz. MaterialGroup alt grupları, önce birden çok işleme geçişte en son olarak uygulanır.
Aşağıdaki kod örnekleri, 3D modellere fırça olarak düz renk ve çizim uygulamayı gösterir.
<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))
Sahneyi Aydınlatma
3D grafiklere sahip işıklar, gerçek dünyada ışıklarla birlikte yüzeyleri görünür hale gelir. Daha açık bir noktaya kadar, işıklar bir sahnenin projeksiyona hangi kısmının dahil olacağını belirler. WPF'de ışık nesneleri çeşitli ışık ve gölge etkileri oluşturur ve çeşitli gerçek dünya ışıklarının davranışına göre model oluşturur. Sahnenize en az bir ışık dahil edildi, yoksa hiçbir model görünmez.
Aşağıdaki lambalar temel sınıftan Light türetildi:
AmbientLight: Konumlarından veya yönlerinden bağımsız olarak tüm nesneleri aynı şekilde uyaran ortam aydınlatması sağlar.
DirectionalLight: Uzak bir ışık kaynağı gibi olur. Yön farları Direction Vector3D olarak belirtilir, ancak belirli bir konum belirtilmez.
PointLight: Yakındaki bir ışık kaynağı gibi içerikler. PointLight'lar bir konuma sahip olur ve bu konumdan ışık döküme sahip olur. Sahnedeki nesneler, ışıkla ilgili konumlarına ve mesafelerine bağlı olarak hafifletilen nesnelerdir. PointLightBase , Range modellerin ışık tarafından maruzmayacakları mesafeyi belirleyen bir özelliği ortaya çıkarır. PointLight ayrıca ışığın yoğunluğunun mesafeye göre nasıl azaldığını belirleyen zayıflama özelliklerini de ortaya çıkarır. ışığın hafifletme için sabit, doğrusal veya kuaratik ilişkilendirmeler belirtsiniz.
SpotLight: 'den PointLight devralıyor. PointLight gibi öne çıkanlar hem konuma hem de yöne sahip olur. ışık, derece olarak belirtilen ve özellikleri tarafından ayarlanmış InnerConeAngle külah OuterConeAngle şeklindeki bir alanda ışık gösterir.
Işıklar nesnelerdir; bu nedenle konum, renk, yön ve aralık gibi ışık özelliklerini Model3D dönüştürebilirsiniz ve buna animasyon sızabilirsiniz.
<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)
Modelleri Dönüştürme
Model oluşturma, sahnenin belirli bir konumuna sahiptir. Bu modelleri sahnenin etrafında taşımak, döndürmek veya boyutunu değiştirmek için modelleri tanımlayan köşeleri değiştirmek pratik değildir. Bunun yerine, 2D'de olduğu gibi modellere dönüştürmeler uygulayabilirsiniz.
Her model Transform nesnesinin, modeli taşımak, yeniden boyutlandırmak veya yeniden boyutlandırmak için bir özelliği vardır. Bir dönüştürmeyi uygulayan, modelin tüm noktalarını dönüştürme tarafından belirtilen vektör veya değerle etkili bir şekilde dengelersiniz. Başka bir deyişle, modelin tanımlandığı koordinat alanı ("model alanı") dönüştürüldü, ancak tüm sahnenin koordinat sisteminde modelin geometrisini ("dünya alanı") değiştiren değerleri değiştirmemişsinizdir.
Modelleri dönüştürme hakkında daha fazla bilgi için bkz. 3D Dönüşümlere Genel Bakış.
Modellere Animasyon Animasyonu
WPF 3B uygulaması, 2B grafiklerle aynı zamanlamayı ve animasyon sistemini sunar. Başka bir deyişle, bir 3D sahneye animasyonu yapmak için modellerinin özelliklerine animasyon sızabilirsiniz. İlkellerin özelliklerine doğrudan animasyon animasyonu yapmak mümkündür, ancak modellerin konumunu veya görünümünü değiştiren dönüşümlere animasyon animasyonu yapmak genellikle daha kolaydır. Dönüştürmeler hem nesnelere hem de tek tek modellere uygulanaa olduğundan, bir Model3DGroup alt grubuna bir animasyon kümesi ve bir alt nesne grubuna başka bir animasyon Model3DGroup kümesi uygulamak mümkündür. Ayrıca sahnenizin aydınlatma özelliklerine animasyonlar kullanarak da çeşitli görsel etkiler eldeebilirsiniz. Son olarak, kamera konumunu veya görünümünün alanına animasyonunu kullanarak projeksiyona animasyonu ebilirsiniz. WPF zamanlama ve animasyon sistemi hakkında arka plan bilgileri için Animasyona Genel Bakış,Görsel Panolara Genel Bakışve Serbest Bırakılabilir Nesnelere Genel Bakış konularına bakın.
WPF'de bir nesneye animasyon uygulamak için bir zaman çizelgesi oluşturur, bir animasyon tanımlarsınız (bu, zaman içinde bazı özellik değerlerde bir değişikliktir) ve animasyonun uygulanacak özelliğini belirtirsiniz. Bir 3D sahnedeki tüm nesneler'in children olduğundan, görünüme uygulamak istediğiniz herhangi bir animasyon tarafından hedeflenen özellikler Viewport3D Viewport3D'nin özellikleridir.
Bir modelin yerinde sallanıyor gibi görünmesini istediğinizi varsayalım. Modele bir uygulama ve döndürme eksenine bir vektörden diğerine RotateTransform3D animasyonu uygulayabilirsiniz. Aşağıdaki kod örneği, RotateTransform3D'nin TransformGroup ile modele uygulanan birkaç dönüştürmeden biri olduğu varsayıldıktan sonra dönüştürmenin Rotation3D'sinde Axis özelliğine Vector3DAnimation uygulamayı gösterir.
//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)
Pencereye 3D İçerik Ekleme
Sahneyi işlemek için, modeli ve lambayı bir 'ye Model3DGroup ekleyin, ardından Model3DGroup olarak ContentModelVisual3D ayarlayın. koleksiyonunun ModelVisual3DChildren koleksiyonuna Viewport3D ekleyin. özelliğini ayarerek Viewport3D kamera Camera ekleyin.
Son olarak, Viewport3D pencereye ekleyin. Tuval gibi bir düzen öğesinin içeriği olarak dahil edilirken, ve özelliklerini Viewport3D ayarerek Viewport3D boyutunu HeightWidth belirtin (öğesinden FrameworkElement devralınır).
<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>