Aracılığıyla paylaş


3B Dönüşümlere Genel Bakış

Bu konuda, Windows Presentation Foundation (WPF) grafik sistemindeki 3B modellere dönüştürmelerin nasıl uygulanacağı açıklanmaktadır. Dönüştürmeler, geliştiricinin modelleri tanımlayan temel değerleri değiştirmeden yeniden konumlandırmasına, yeniden boyutlandırmasına ve yeniden düzenlemesine olanak tanır.

3B Koordinat Alanı

Windows Presentation Foundation'daki (WPF) 3B grafik içeriği, Viewport3Diki boyutlu öğe yapısına katılabilen bir öğesinde kapsüllenmiş olur. Grafik sistemi, Viewport3D'yi Windows Presentation Foundation'daki (WPF) diğerleri gibi iki boyutlu bir görsel öğe olarak ele alır. Viewport3D, üç boyutlu bir görünümde pencere (görünüm penceresi) işlevi görür. Daha doğru bir şekilde, bir 3B sahnenin yansıtıldığı bir yüzeydir. Viewport3D'yi aynı sahne grafiğindeki diğer 2B çizim nesneleriyle birlikte kullanabilirsiniz, ancak Viewport3D içindeki 2B ve 3B nesneleri birbirine aktaramazsınız. Aşağıdaki tartışmada, açıklanan koordinat alanı Viewport3D öğesi tarafından yer alır.

2B grafikler için Windows Presentation Foundation (WPF) koordinat sistemi, işleme yüzeyinin 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ı ekranı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 çıkış noktası dışına, görüntüleyiciye doğru ilerler.

Coordinate systems
Koordinat Sistemi Karşılaştırması

Bu eksenler tarafından tanımlanan alan, Windows Presentation Foundation'daki (WPF) 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.

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 yönlendirebileceğ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.

Çeviri Dönüştürmeleri

3B dönüşümler soyut temel sınıfından Transform3Ddevralır; bunlar, , ScaleTransform3Dve RotateTransform3Daffine dönüştürme sınıflarını TranslateTransform3Diçerir. Windows Presentation Foundation (WPF) 3D sistemi, daha kısa matris işlemlerinde aynı dönüştürmeleri belirtmenize olanak tanıyan bir MatrixTransform3D sınıf da sağlar.

TranslateTransform3DModel3D'deki tüm noktaları, , OffsetYve OffsetZ özellikleriyle belirttiğiniz uzaklık vektörünün yönüne OffsetXtaşır. Örneğin, (2,2,2) bir küp köşesi verüldüğünde, uzaklık vektörü (0,1,6,1) bu köşeyi (2,2,2) (2,3,6,3) taşır. Küp köşesi hala model alanında (2,2,2) ancak model uzayı dünya uzayı ile ilişkisini değiştirerek model uzayında (2,2,2) dünya uzayında (2,3,6,3) yer alır.

Translation figure
Uzaklık ile çeviri

Aşağıdaki kod örneklerde çevirinin nasıl uygulanacağı gösterilmektedir.

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

Dönüştürmeleri Ölçeklendirme

ScaleTransform3D modelin ölçeğini belirli bir ölçek vektörine göre değiştirir ve bir merkez noktasına başvuruda bulunur. Modelin boyutunu orantılı olarak değiştirmek için modeli X, Y ve Z eksenlerinde aynı değere göre ölçeklendirerek tekdüzen bir ölçek belirtin. Örneğin, dönüşümün ScaleX, ScaleYve ScaleZ özelliklerinin 0,5 olarak ayarlanması modelin boyutunu yarıya indirer; aynı özellikleri 2 olarak ayarlamak üç eksende de ölçeğini ikiye katlar.

Uniform ScaleTransform3D
ScaleVector Örneği

X, Y ve Z değerlerinin tümü aynı olmayan bir ölçek dönüştürmesi olan tekdüzen olmayan bir ölçek dönüştürmesi belirterek modelin diğerlerini etkilemeden bir veya iki boyutta esnetilmesine veya daraltmasına neden olabilirsiniz. Örneğin, 1, ScaleY 2 ve ScaleZ 1 olarak ayarlanmasıScaleX, dönüştürülen modelin yüksekliğinin iki katına çıkarmasına, ancak X ve Z eksenleri boyunca değişmeden kalmasına neden olur.

Varsayılan olarak, ScaleTransform3D köşelerin kaynak (0,0,0) hakkında genişlemesine veya daralmasına neden olur. Dönüştürmek istediğiniz model kaynaktan çizilmemişse, modeli kaynaktan ölçeklendirmek modeli "yerinde" ölçeklendirmez. Bunun yerine, modelin köşeleri ölçek vektörle çarpıldığında, ölçek işlemi modeli çevirmenin yanı sıra ölçeklendirmenin de etkisine sahip olur.

Three cubes scaled with center point specified
Ölçek Merkezi Örneği

Modeli "yerinde" ölçeklendirmek için ScaleTransform3D'nin CenterX, CenterYve CenterZ özelliklerini ayarlayarak modelin merkezini belirtin. Bu, grafik sisteminin model alanını ölçeklendirmesini ve ardından belirtilen Point3Düzerinde ortalamaya çevirmesini sağlar. Buna karşılık, modeli kaynak hakkında oluşturup farklı bir merkez noktası belirttiyseniz modelin kaynaktan uzağa çevrildiğini görmeyi bekleyebilirsiniz.

Döndürme Dönüşümleri

Modeli birkaç farklı yolla 3B olarak döndürebilirsiniz. Tipik bir döndürme dönüşümü, bir ekseni ve bu eksenin çevresinde döndürme açısını belirtir. sınıfı, RotateTransform3D özelliğiyle Rotation bir Rotation3D tanımlamanızı sağlar. Ardından, dönüşümü tanımlamak için Rotation3D'de AxisAngleRotation3Dve Angle özelliklerini belirtirsinizAxis. Aşağıdaki örnekler bir modeli Y ekseni çevresinde 60 derece döndürü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>

Not:Windows Presentation Foundation (WPF) 3D sağ elle kullanılan bir sistemdir ve bu da döndürme için pozitif açı değerinin eksen hakkında saat yönünün tersine dönmesine neden olduğu anlamına gelir.

Eksen açısı döndürmeleri, RotateTransform3D üzerindeki , CenterYve CenterZ özellikleri için CenterXbir değer belirtilmezse, çıkış noktası hakkında döndürme olduğunu varsayar. Ölçeklendirmede olduğu gibi, döndürmenin modelin tüm koordinat alanını dönüştürdüğünü unutmamak yararlı olur. Model kaynak hakkında oluşturulmamışsa veya daha önce çevrilmişse döndürme, yerinde döndürmek yerine çıkış noktası hakkında "özetlenebilir".

Rotation with new center point
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ğinden, en çok modeli boyutlandırarak (ölçeklendirerek), ardından yönünü ayarlayarak (döndürerek) ve son olarak istenen konuma taşıyarak (çeviri yaparak) bir dizi dönüştürmenin beklenen sonucunu elde edebilirsiniz.

Rotation by 60 degrees in x- and y-axes
Döndürme Örneği

Eksen açısı döndürmeleri statik dönüşümler ve bazı animasyonlar için iyi çalışır. Ancak, bir küp modelini X ekseni etrafında 60 derece, Z ekseni çevresinde 45 derece döndürmeyi göz önünde bulundurun. Bu dönüşümü iki ayrı benzeşim dönüşümü olarak veya matris olarak tanımlayabilirsiniz. Ancak, bu şekilde tanımlanan bir döndürmeye sorunsuz bir şekilde animasyon eklemek zor olabilir. Her iki yaklaşımla hesaplanan modelin başlangıç ve bitiş konumları aynı olsa da, modelin aldığı ara konumlar hesaplama açısından belirsizdir. Quaternions, döndürmenin başlangıcı ve sonu arasındaki ilişkilendirmeyi hesaplamak için alternatif bir yoldur.

Quaternion, 3B boşluktaki bir ekseni ve bu eksenin çevresinde bir döndürmeyi temsil eder. Örneğin, bir quaternion bir (1,1,2) ekseni ve 50 derece döndürmeyi temsil edebilir. Quaternions'ın döndürmeleri tanımlama gücü, bunlar üzerinde gerçekleştirebileceğiniz iki işlemden gelir: bileşim ve ilişkilendirme. Geometriye uygulanan iki quaternasyonun bileşimi "geometriyi eksen2 etrafında döndürme2 döndürmek, sonra eksen1 çevresinde döndürmek1 döndürmek" anlamına gelir. Bileşimi kullanarak geometrideki iki döndürmeyi birleştirerek sonucu temsil eden tek bir quaternion elde edebilirsiniz. Quaternion ilişkilendirmesi bir eksenden diğerine doğru düzgün ve makul bir yol hesaplayabildiği için, bir eksenden diğerine sorunsuz bir geçiş elde etmek için özgünden oluşturulan kuaternyona ilişkilendirme yaparak dönüştürmeye animasyon eklemenizi sağlayabilirsiniz. Animasyon eklemek istediğiniz modeller için, özelliği için bir kullanarak döndürme için Rotation bir QuaternionRotation3D hedef Quaternion belirtebilirsiniz.

Dönüştürme Koleksiyonlarını Kullanma

Bir görünüm oluştururken, modele birden fazla dönüştürme uygulamak yaygın bir durum olabilir. Dönüşümleri kolayca sahnedeki Children çeşitli modellere uygulamak üzere gruplandırmak için sınıfın koleksiyonuna Transform3DGroup dönüşümler ekleyin. Genellikle, her örneğe farklı bir dönüşüm kümesi uygulayarak modeli yeniden kullanabileceğiniz şekilde birkaç farklı grupta dönüştürmeyi yeniden kullanmak uygundur. Dönüştürmelerin koleksiyona eklenme sırasının önemli olduğunu unutmayın: koleksiyondaki dönüşümler ilkten sona uygulanır.

Dönüşümleri Animasyona Ekleme

Windows Presentation Foundation (WPF) 3B 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 öğelerine bir animasyon kümesi ve bir nesne grubuna başka bir animasyon kümesi uygulamak mümkündür. Windows Presentation Foundation (WPF) zamanlama ve animasyon sistemi hakkında arka plan bilgileri için bkz . Animasyona Genel Bakış ve Görsel Taslaklara Genel Bakış.

Windows Presentation Foundation'da (WPF) bir nesneye animasyon eklemek için bir zaman çizelgesi oluşturun, bir animasyon tanımlayın (zaman içinde bazı özellik değerlerinde gerçekten bir değişikliktir) ve animasyonun uygulanacağı özelliği belirtin. Bu özellik bir FrameworkElement özelliği olmalıdır. Bir 3B sahnedeki tüm nesneler Viewport3D'nin alt öğeleri olduğundan, görünüme uygulamak istediğiniz animasyonların 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, aynı zamanda görüntülenecek nesnenin daha fazlasını ortaya çıkarmak için sallanan bir hareket uygulamak 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ği, RotateTransform3D'nin ile modele uygulanan çeşitli dönüşümlerden biri olduğu varsayılarak dönüşümün Rotation3D'sinin Axis özelliğine bir TransformGroupuygulama Vector3DAnimation işlemini 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

Nesneyi taşımak veya ölçeklendirmek için diğer dönüştürme özelliklerini hedeflemek için benzer bir söz dizimi kullanın. Örneğin, bir Point3DAnimation modelin şeklini sorunsuz bir şekilde deforme etmelerine neden olmak için ölçek dönüşümündeki ScaleCenter özelliğine bir uygulayabilirsiniz.

Yukarıdaki örnekler özelliklerini GeometryModel3Ddönüştürse de, sahnedeki diğer modellerin özelliklerini dönüştürmek de mümkündür. Örneğin, Açık nesnelere uygulanan çevirileri animasyonla hareket ettirerek modellerinizin görünümünü önemli ölçüde değiştirebilecek hareketli ışık ve gölge efektleri oluşturabilirsiniz.

Kameralar da model olduğundan, kamera özelliklerini de dönüştürmek mümkündür. Kamera konumunu veya düzlem uzaklıklarını dönüştürerek (aslında, sahne projeksiyonunun tamamını dönüştürerek) sahnenin görünümünü kesinlikle değiştirebilirsiniz, ancak bu şekilde elde ettiğiniz efektlerin birçoğunun, görünümdeki modellerin konumuna veya konumuna uygulanan dönüştürmeler kadar görüntüleyiciye "görsel" bir anlam kazandırmayabileceğini unutmayın.

Ayrıca bkz.