3B Grafiklere Genel Bakış

Windows Presentation Foundation'daki (WPF) 3B işlevselliği, geliştiricilerin hem işaretleme hem de yordam kodunda 3B grafikler çizmesine, dönüştürmesine ve animasyon eklemesine olanak tanır. Geliştiriciler zengin denetimler oluşturmak, karmaşık veri çizimleri sağlamak veya bir uygulamanın arabiriminin kullanıcı deneyimini geliştirmek için 2B ve 3B grafikleri birleştirebilir. WPF'de 3B destek, tam özellikli bir oyun geliştirme platformu sağlamak için tasarlanmamıştır. Bu konu başlığında WPF grafik sistemindeki 3B işlevlere genel bir bakış sağlanır.

2B Kapsayıcıda 3B

WPF'deki 3B grafik içeriği, Viewport3Diki boyutlu öğe yapısına katılabilen bir öğesinde kapsüllenmiş. Grafik sistemi, WPF'deki diğer birçok öğe gibi iki boyutlu bir görsel öğe olarak davranır Viewport3D . Viewport3D üç boyutlu bir görünüm penceresi olarak işlev görür. Daha doğru bir şekilde, bir 3B sahnenin yansıtıldığı bir yüzeydir.

Geleneksel bir 2B uygulamada, Kılavuz veya Tuval gibi başka bir kapsayıcı öğesinde olduğu gibi kullanın Viewport3D . Aynı sahne grafında diğer 2B çizim nesneleriyle birlikte kullanabilirsiniz Viewport3D , ancak içindeki 2B ve 3B nesneler Viewport3Darasında bağlantı kuramazsınız. Bu konu, içinde 3B grafiklerin nasıl çizileceğine Viewport3Dodaklanacaktır.

3B Koordinat Alanı

2B grafikler için WPF koordinat sistemi, işleme alanının sol üst köşesindeki (genellikle ekran) kaynağı bulur. 2B sistemde pozitif x ekseni değerleri sağa, pozitif y ekseni değerleri aşağı doğru ilerler. Ancak 3B koordinat sisteminde, çıkış noktası işleme alanının ortasında bulunur; bunun yerine pozitif x ekseni değerleri sağa doğru ilerlerken pozitif y ekseni değerleri yukarı doğru ilerler ve pozitif z ekseni değerleri kaynaktan dışarı, görüntüleyiciye doğru ilerler.

Coordinate systems
Geleneksel 2B ve 3B koordinat sistemi gösterimleri

Bu eksenler tarafından tanımlanan alan, WPF'deki 3B nesneler için sabit başvuru çerçevesidir. Bu alanda modeller oluştururken ve bunları görüntülemek için ışıklar ve kameralar oluştururken, dönüşümleri uyguladığınızda her model için oluşturduğunuz yerel başvuru çerçevesinden bu sabit başvuru çerçevesini veya "dünya alanını" ayırt etmek yararlı olur. Ayrıca dünya uzayında bulunan nesnelerin ışık ve kamera ayarlarına bağlı olarak tamamen farklı görünebileceğini veya hiç görünmeyebileceğini, ancak kameranın konumunun nesnelerin dünya uzayı içindeki konumunu değiştirmediğini unutmayın.

Kamera ve Projeksiyonlar

2B olarak çalışan geliştiriciler, çizim temel öğelerini iki boyutlu bir ekranda konumlandırmaya alışkındır. Bir 3B sahne oluşturduğunuzda, 3B nesnelerin 2B gösterimini oluşturduğunuzu unutmamanız önemlidir. 3B sahne, düşeyaranın bakış açısına bağlı olarak farklı göründüğünden, bu bakış açısını belirtmeniz gerekir. sınıfı, Camera bir 3B sahne için bu bakış açısını belirtmenize olanak tanır.

Bir 3B sahnenin 2B yüzey üzerinde nasıl temsil olduğunu anlamanın bir diğer yolu da sahneyi görüntüleme yüzeyine bir projeksiyon olarak tanımlamaktır. , ProjectionCamera 3B modellerin nasıl görüntüleneceğini değiştirmek için farklı projeksiyonlar ve bunların özelliklerini belirtmenize olanak tanır. A PerspectiveCamera , sahneyi engelleyen bir projeksiyon belirtir. Başka bir deyişle, PerspectiveCamera ufuk noktası perspektifi sağlar. Kameranın sahnenin koordinat alanında konumunu, kameranın görüş yönünü ve alanını ve sahnedeki "yukarı" yönünü tanımlayan bir vektör belirtebilirsiniz. Aşağıdaki diyagramda ' nin projeksiyonu PerspectiveCameragösterilmektedir.

NearPlaneDistance ve FarPlaneDistance özellikleriProjectionCamera, kameranın projeksiyon aralığını sınırlar. Kameralar sahnenin herhangi bir yerinde bulunabildiğinden, kameranın aslında bir modelin içinde veya bir modelin çok yakınında konumlandırılması mümkündür ve bu da nesneleri düzgün bir şekilde ayırt etmek zorlaşır. NearPlaneDistance , nesnelerin çizilmeyecek olduğu kameradan en düşük uzaklığı belirtmenize olanak tanır. Buna karşılık, FarPlaneDistance kameradan nesnenin çizilmeyeceği bir uzaklık belirtmenize olanak tanır ve bu da tanınamayacak kadar uzakta olan nesnelerin sahnede yer almamasını sağlar.

Camera setup
Kamera konumu

OrthographicCamera 3B modelin 2B görsel yüzeye dikgen projeksiyonu belirtir. Diğer kameralar gibi bir konum, görüntüleme yönü ve "yukarı" yönü belirtir. Ancak, aksine PerspectiveCamera, OrthographicCamera perspektif foreshortening içermeyen bir projeksiyon açıklar. Başka bir deyişle, OrthographicCamera kenarları kameradaki bir noktada bir araya gelen bir yerine yanları paralel olan bir görüntüleme kutusunu açıklar. Aşağıdaki görüntüde ve OrthographicCamerakullanılarak PerspectiveCamera görüntülenen modelin aynısı gösterilmektedir.

Orthographic and perspective projection
Perspektif ve Ortografik 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 3B nesneyi temsil eden soyut temel sınıftır. Bir 3B sahne oluşturmak için, görüntülemek için bazı nesnelere ve sahne grafiğini oluşturan nesnelerin 'den Model3Dtüretilmiş olmasına ihtiyacınız vardır. WPF şu anda ile GeometryModel3Dmodelleme geometrilerini destekler. Geometry Bu modelin özelliği bir mesh temel öğesini alır.

Model oluşturmak için ilkel veya ağ oluşturarak başlayın. 3B ilkel, tek bir 3B varlığı oluşturan köşelerden oluşan bir koleksiyondur. Çoğu 3B sistem, en basit kapalı şekilde modellenen ilkel öğeler sağlar: üç köşe ile tanımlanan üçgen. Üçgenin üç noktası çift noktalı olduğundan, daha karmaşık şekilleri (tireler olarak adlandırılır) modellemek için üçgenler eklemeye devam edebilirsiniz.

WPF 3D sistemi şu anda herhangi bir geometri belirtmenize olanak tanıyan sınıfını sağlar MeshGeometry3D ; şu anda küreler ve kübik formlar gibi önceden tanımlanmış 3B temelleri desteklemez. Özelliği olarak Positions üçgen köşelerin listesini belirterek bir oluşturmaya MeshGeometry3D başlayın. Her köşe olarak Point3Dbelirtilir. (XAML'de, bu özelliği her köşenin koordinatlarını temsil eden üç sayı olarak gruplandırılmış sayıların listesi olarak belirtin.) Geometrisine bağlı olarak ağınız, bazıları aynı köşeleri (köşeler) paylaşan birçok üçgenden oluşuyor olabilir. Mesh'i doğru çizmek için WPF'nin hangi köşelerin hangi üçgenler tarafından paylaşıldığı hakkında bilgi alması gerekir. Özelliğine sahip TriangleIndices üçgen dizinlerin listesini belirterek bu bilgileri sağlarsınız. Bu liste, listede belirtilen noktaların üçgeni belirleyeceği sırayı Positions 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, Positions liste dikdörtgen ağı tanımlamak için dört köşe belirtir. özelliği, TriangleIndices üç dizinden oluşan iki grubun listesini belirtir. Listedeki her sayı, listedeki bir uzaklığa Positions başvurur. Örneğin, liste tarafından Positions belirtilen ilk üç köşe , (1,-1,0)ve (-1,1,0)şeklindedir(-1,-1,0). Liste tarafından TriangleIndices belirtilen ilk üç dizin, listedeki birinci, ikinci ve üçüncü noktalara karşılık gelen 0, 1 ve 2'dir Positions . Sonuç olarak, dikdörtgen modelini oluşturan ilk üçgen ile (-1,-1,0)(1,-1,0)(-1,1,0)arasında oluşturulur ve ikinci üçgen de benzer şekilde belirlenir.

ve TextureCoordinates özellikleri için değerler belirterek modeli tanımlamaya Normals devam edebilirsiniz. Modelin yüzeyini işlemek için grafik sistemi, herhangi bir üçgende yüzeyin hangi yöne baktığı hakkında bilgiye ihtiyaç duyar. Model için aydınlatma hesaplamaları yapmak için bu bilgileri kullanır: doğrudan bir ışık kaynağına doğru yüze gelen yüzeyler, ışıktan uzağa açılı olan yüzeylerden daha parlak görünür. WPF, konum koordinatlarını kullanarak varsayılan normal vektörleri belirleyebilse de, eğri yüzeylerin görünümünü yaklaşık olarak belirlemek için farklı normal vektörler de belirtebilirsiniz.

özelliği, TextureCoordinates grafik sistemine bir dokunun Pointağın köşelerine nasıl çizildiğini belirleyen koordinatların nasıl eşleneceğini belirten bir s koleksiyonu belirtir. TextureCoordinates sıfır ile 1 (dahil) arasında bir değer olarak belirtilir. Özelliğinde Normals olduğu gibi, grafik sistemi varsayılan doku koordinatlarını hesaplayabilir, ancak yinelenen desenin bir kısmını içeren bir doku eşlemesini denetlemek için farklı doku koordinatları ayarlamayı seçebilirsiniz. Doku koordinatları hakkında daha fazla bilgi sonraki konularda veya Yönetilen Direct3D SDK'sında bulunabilir.

Aşağıdaki örnekte yordam kodunda küp modelinin bir yüzünün nasıl oluşturulacağı gösterilmektedir. Tüm küpü tek GeometryModel3Dbir şekilde çizebilirsiniz; bu örnek, daha sonra her yüze ayrı dokular uygulamak için küp yüzünü ayrı bir model olarak çizer.

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 ağın üç boyutlu bir nesne gibi görünmesi için, kamera tarafından aydınlatılabilmesi ve yansıtılabilmesi için köşeleri ve üçgenleri tarafından tanımlanan yüzeyi kaplayacak şekilde uygulanmış bir dokuya sahip olması gerekir. 2B'de sınıfını Brush kullanarak ekranın alanlarına renk, desen, gradyan veya diğer görsel içerikleri uygularsınız. Ancak 3B nesnelerin görünümü, yalnızca onlara uygulanan rengin veya desenin 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 pürüzlü veya mat yüzeylerle aynı görünmez ve bazı nesneler ışığı emerken diğerleri parlar. 2B nesnelere uygulayabileceğiniz 3B nesnelere aynı fırçaların tümünü uygulayabilirsiniz, ancak bunları doğrudan uygulayamazsınız.

Bir modelin yüzeyinin özelliklerini tanımlamak için WPF soyut sınıfını Material kullanır. Malzeme'nin somut alt sınıfları, modelin yüzeyinin bazı görünüm özelliklerini belirler ve her biri solidColorBrush, TileBrush veya VisualBrush geçirebileceğiniz bir Brush özelliği de sağlar.

  • DiffuseMaterial fırçanın modele uygulanacağını, bu modelin dağınık bir şekilde aydınlatılmış gibi uygulanacağını belirtir. DiffuseMaterial kullanımı, fırçaların doğrudan 2B modellerde kullanılmasına benzer; model yüzeyleri parlakmış gibi ışığı yansıtmaz.

  • SpecularMaterial fırçanın, modelin yüzeyi sert veya parlakmış gibi, vurguları yansıtabilecek şekilde modele uygulanacağını belirtir. Özelliği için bir değer belirterek dokunun bu yansıtıcı kaliteyi önerme derecesini SpecularPower veya "parlaklık" değerini ayarlayabilirsiniz.

  • EmissiveMaterial , dokunun modelin fırça rengine eşit ışık yayıyormuş gibi uygulanacağını belirtmenize olanak tanır. Bu, modeli hafif yapmaz; ancak, DiffuseMaterial veya SpecularMaterial ile dokulanmışsa gölgelendirmeye farklı şekilde katılır.

Daha iyi performans için, bir GeometryModel3D öğesinin arka yüzleri (kameradan modelin karşı tarafında oldukları için görüş alanı dışında olan yüzler) sahneden çıkarılır. Düzlem gibi bir modelin arka yüzüne uygulanacak bir belirtmek Material için modelin BackMaterial özelliğini ayarlayın.

Parlama veya yansıtıcı efektler gibi bazı yüzey nitelikleri elde etmek için, bir modele arka arkaya birkaç farklı fırça uygulamak isteyebilirsiniz. sınıfını MaterialGroup kullanarak birden çok Malzeme uygulayabilir ve yeniden kullanabilirsiniz. MaterialGroup'un alt öğeleri ilk olarak birden çok işleme geçişinde sona erecek şekilde uygulanır.

Aşağıdaki kod örneklerinde 3B modellere düz renk ve fırça olarak çizim uygulama gösterilmektedir.

<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

3B grafiklerdeki ışıklar, ışıkların gerçek dünyada ne yaptığını yapar: yüzeyleri görünür hale getirir. Daha da önemlisi, ışıklar bir sahnenin hangi bölümünün projeksiyona dahil olacağını belirler. WPF'deki ışık nesneleri çeşitli ışık ve gölge efektleri oluşturur ve çeşitli gerçek dünya ışıklarının davranışından sonra modellenir. Sahnenize en az bir ışık ekleyin; aksi takdirde hiçbir model görünmez.

Aşağıdaki ışıklar temel sınıftan Lighttüretilir:

  • AmbientLight: Konumlarından veya yönlendirmelerinden bağımsız olarak tüm nesneleri düzgün bir şekilde aydınlatan ortam aydınlatması sağlar.

  • DirectionalLight: Uzak bir ışık kaynağı gibi yanar. Yön ışıklarının Vector3D olarak belirtilen bir Direction konumu vardır, ancak belirtilen konumu yoktur.

  • PointLight: Yakındaki bir ışık kaynağı gibi yanar. PointLight'lar bir konuma sahiptir ve bu konumdan ışık yayınlar. Sahnedeki nesneler, ışığa göre konumlarına ve uzaklıklarına bağlı olarak aydınlatılır. PointLightBase , hangi modellerin ışık tarafından aydınlatılmayacağı mesafeyi belirleyen bir Range özelliği kullanıma sunar. PointLight ayrıca ışığın yoğunluğunun uzaklıkta nasıl azaldığını belirleyen azaltma özelliklerini de kullanıma sunar. Işığın hafifletilmesi için sabit, doğrusal veya ikinci dereceden ilişkilendirmeler belirtebilirsiniz.

  • SpotLight: öğesinden PointLightdevralır. Spotlar PointLight gibi yanar ve hem konum hem de yöne sahiptir. Işıkları derece cinsinden belirtilen ve OuterConeAngle özellikleriyle InnerConeAngle ayarlanan koni şeklindeki bir alana yansıtırlar.

Işıklar nesnelerdir Model3D , bu nedenle konum, renk, yön ve aralık gibi ışık özelliklerini dönüştürebilir ve bunlara animasyon uygulayabilirsiniz.

<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şturduğunuzda, bunların sahne içinde belirli bir konumu vardır. Bu modelleri sahne içinde hareket ettirmek, döndürmek veya boyutlarını 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üştürmeler uygularsınız.

Her model nesnesinin, modeli taşıyabileceğiniz, yeniden boyutlandırabileceğiniz veya yeniden boyutlandırabileceğiniz bir Transform özelliği vardır. Bir dönüşüm uyguladığınızda, modelin tüm noktalarını dönüşüm tarafından belirtilen vektöre veya değere göre etkili bir şekilde kaydırmış olursunuz. Başka bir deyişle, modelin tanımlandığı koordinat alanını ("model alanı") dönüştürdün, ancak modelin geometrisini oluşturan değerleri sahnenin tamamında ("dünya uzayı") değiştirmediniz.

Modelleri dönüştürme hakkında daha fazla bilgi için bkz . 3B Dönüşümlere Genel Bakış.

Modelleri Animasyona Alma

WPF 3D uygulaması, 2B grafiklerle aynı zamanlama ve animasyon sistemine katılır. Başka bir deyişle, bir 3B görünüme animasyon eklemek için modellerinin özelliklerine animasyon ekleyin. İlkellerin özelliklerine doğrudan animasyon eklemek mümkündür, ancak modellerin konumunu veya görünümünü değiştiren dönüşümlere animasyon eklemek genellikle daha kolaydır. Dönüştürmeler hem nesnelere hem de tek tek modellere Model3DGroup uygulanabildiğinden, bir Model3DGroup'un alt öğesine bir animasyon kümesi ve bir alt nesne grubuna başka bir animasyon kümesi uygulamak mümkündür. Ayrıca, sahnenizin aydınlatma özelliklerini canlandırarak çeşitli görsel efektler elde edebilirsiniz. Son olarak, kamera konumunu veya görüş alanını canlandırarak projeksiyonun kendisine animasyon uygulamayı seçebilirsiniz. WPF zamanlama ve animasyon sistemi hakkında arka plan bilgileri için Animasyona Genel Bakış, Görsel Taslaklara Genel Bakış ve Donabilir Nesnelere Genel Bakış konularına bakın.

WPF'de bir nesneye animasyon eklemek için bir zaman çizelgesi oluşturur, bir animasyon tanımlarsınız (zaman içinde bazı özellik değerlerinde gerçekten bir değişikliktir) ve animasyonun uygulanacağı özelliği belirtirsiniz. Bir 3B sahnedeki tüm nesneler öğesinin Viewport3Dalt öğeleri olduğundan, görünüme uygulamak istediğiniz animasyonların hedeflediği özellikler Viewport3D'nin özellikleridir.

Modelin yerinde sallanıyor gibi görünmesini istediğinizi varsayalım. Modele bir RotateTransform3D uygulamayı ve döndürme eksenine bir vektörden diğerine animasyon eklemeyi seçebilirsiniz. Aşağıdaki kod örneğinde, RotateTransform3D'nin TransformGroup ile modele uygulanan çeşitli dönüşümlerden biri olduğu varsayılarak dönüşümün Rotation3D'sinin Axis özelliğine Vector3DAnimation uygulanması gösterilmektedir.

//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 3B İçerik Ekleme

Sahneyi işlemek için bir öğesine Model3DGroupmodel ve ışık ekleyin, ardından öğesini olarak ayarlayın Model3DGroupContentModelVisual3D. ModelVisual3DChildren öğesini koleksiyonuna Viewport3Dekleyin. özelliğini ayarlayarak'a Viewport3DCamera kamera ekleyin.

Son olarak, öğesini pencereye ekleyin Viewport3D . Viewport3D tuval gibi bir düzen öğesinin içeriği olarak eklendiğinde, ve Width özelliklerini ayarlayarak Height (öğesinden FrameworkElementdevralınan) Viewport3D boyutunu belirtin.

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

Ayrıca bkz.