Karmaşık 3B dönüştürmeler gerçekleştirme

Flash Player 10 ve üstü, Adobe AIR 1.5 ve üstü

Matrix3D sınıfı, bir koordinat alanı içinde 3B noktaları dönüştürmenize veya 3B noktaları bir koordinat alanından diğerine eşlemenize olanak sağlar.

Matrix3D sınıfını kullanmak için matris matematiğini anlamanız gerekmez. En yaygın dönüştürme işlemlerinin çoğu, sınıfın yöntemleri kullanılarak işlenebilir. Matristeki her öğenin değerlerini açıkça ayarlama veya hesaplama konusunda endişelenmeniz gerekmez.

Görüntüleme nesnesinin z özelliğini sayısal bir değere ayarladıktan sonra, görüntüleme nesnesinin Transform nesnesinin Matrix3D özelliğini kullanarak, nesnenin dönüştürme matrisini alabilirsiniz:

var leafMatrix:Matrix3D = this.transform.matrix3D;

Görüntüleme nesnesi üzerinde çevirme, döndürme, ölçekleme ve perspektif projeksiyonu gerçekleştirerek Matrix3D nesnesinin yöntemlerini kullanabilirsiniz.

3B noktaların yönetilmesine yönelik x, y ve z özellikleriyle Vector 3D sınıfını kullanın. Bu, bir yön ve büyüklüğe sahip olan, fizikteki bir uzamsal vektörü temsil eder. Vector3D sınıfının yöntemleri, ekleme, nokta üretimi ve çapraz ürün hesaplamaları gibi uzamsal vektörlerle yaygın hesaplamaları gerçekleştirmenizi sağlar.

Not: Vector3D sınıfı, ActionScript Vector sınıfıyla ilgili değildir. Vector3D sınıfı, 3B noktaların tanımlanmasına ve işlenmesine yönelik özellikler ve yöntemler içerirken vector sınıfı, türlenmiş nesnelerin dizilerini destekler.

Matrix3D nesneler oluşturma

Matrix3D nesnelerini oluşturmanın ve almanın üç ana yolu vardır:

  1. Yeni bir matris başlatmak için Matrix3D() yapıcı yöntemini kullanın. Matrix3D() yapıcısı, 16 sayısal değer içeren bir Vector nesnesini alır ve değerlerin her birini bir matris hücresine yerleştirir. Örneğin:

    var rotateMatrix:Matrix3D = new Matrix3D(1,0,0,1, 0,1,0,1, 0,0,1,1, 0,0,0,1);
  2. Görüntüleme nesnesinin z özelliğinin değerini ayarlayın. Daha sonra, o nesnenin transform.matrix3D özelliğinden dönüştürme matrisini alın.

  3. Kök görüntüleme nesnesinin perspectiveProjection.matrix3D özelliğinin değerini alarak, sahne alanındaki 3B nesnelerin görüntülenmesini denetleyen Matrix3D nesnesini alın.

Birden çok 3B dönüştürmesi uygulama

Matrix3D nesnesi kullanarak bir defada çok sayıda 3B dönüştürme uygulayabilirsiniz. Örneğin, bir küpü döndürmek, ölçeklemek ve sonra taşımak isterseniz, küpün her bir ucuna üç ayrı dönüştürme uygulayabilirsiniz. Ancak tek bir Matrix3D nesnesinde birden çok dönüştürmeyi önceden hesaplamak ve sonra noktaların her birinde tek bir matris dönüştürmesi gerçekleştirmek çok daha etkilidir.

Not: Matris dönüştürmelerinin uygulanma sırası önemlidir. Matris hesaplamaları komütatif değildir. Örneğin, önce bir döndürme ve sonra bir çevirme uygulanması, aynı çevirmenin önce ve aynı döndürmenin sonra uygulanmasından farklı bir sonuç verir.

Şu örnek, birden çok 3B dönüştürme uygulanmasının iki yolunu gösterir.

package { 
    import flash.display.Sprite;     
    import flash.display.Shape; 
    import flash.display.Graphics; 
    import flash.geom.*; 
 
public class Matrix3DTransformsExample extends Sprite 
    { 
        private var rect1:Shape; 
        private var rect2:Shape; 
         
public function Matrix3DTransformsExample():void 
        { 
            var pp:PerspectiveProjection = this.transform.perspectiveProjection; 
            pp.projectionCenter = new Point(275,200); 
            this.transform.perspectiveProjection = pp; 
             
            rect1 = new Shape(); 
            rect1.x = -70; 
            rect1.y = -40; 
            rect1.z = 0; 
            rect1.graphics.beginFill(0xFF8800); 
            rect1.graphics.drawRect(0,0,50,80); 
            rect1.graphics.endFill(); 
            addChild(rect1); 
 
            rect2 = new Shape(); 
            rect2.x = 20; 
            rect2.y = -40; 
            rect2.z = 0; 
            rect2.graphics.beginFill(0xFF0088); 
            rect2.graphics.drawRect(0,0,50,80); 
            rect2.graphics.endFill(); 
            addChild(rect2); 
             
            doTransforms(); 
        } 
 
        private function doTransforms():void 
        { 
            rect1.rotationX = 15; 
            rect1.scaleX = 1.2; 
            rect1.x += 100; 
            rect1.y += 50; 
            rect1.rotationZ = 10; 
 
            var matrix:Matrix3D = rect2.transform.matrix3D; 
            matrix.appendRotation(15, Vector3D.X_AXIS); 
            matrix.appendScale(1.2, 1, 1); 
            matrix.appendTranslation(100, 50, 0); 
            matrix.appendRotation(10, Vector3D.Z_AXIS); 
            rect2.transform.matrix3D = matrix; 
        } 
    } 
}

doTransforms() yönteminde, birinci kod bloğu, dikdörtgen şeklinin dönüşünü, ölçeklemesini ve konumunu değiştirmek için DisplayObject özelliklerini kullanır. İkinci kod bloğu ise, aynı dönüştürmeleri yapmak için Matrix3D sınıfının yöntemlerini kullanır.

Matrix3D yöntemlerinin kullanılmasının ana avantajı, tüm hesaplamaların ilk olarak matriste gerçekleştirilmesidir. Bunlar daha sonra transform.matrix3D özelliği ayarlandığında yalnızca bir defa görüntüleme nesnesine uygulanır. DisplayObject özelliklerinin ayarlanması, kaynak kodun okunmasını biraz daha kolaylaştırır. Ancak, döndürme veya ölçekleme özelliği her ayarlandığında, birden çok hesaplamaya neden olur ve birden çok görüntüleme nesnesi özelliğini değiştirir.

Kodunuz, görüntüleme nesnelerine birden çok defa aynı karmaşık dönüştürmeleri uygulayacaksa, Matrix3D nesnesini bir değişken olarak kaydedin ve sonra bunu art arda uygulayın.

Görüntünün yeniden sıralanması için Matrix3D nesnelerini kullanma

Daha önce de belirtildiği gibi, görüntüleme listesindeki görüntüleme nesnelerinin katmanlama sırası, göreceli z eksenlerine bakılmaksızın görüntü katmanlama sırasını belirler. Animasyonunuz, görüntüleme nesnelerinin özelliklerini görüntüleme listesi sıralamasından farklı bir sıralamaya dönüştürürse, izleyici, z ekseni katmanlamasına karşılık gelmeyen görüntüleme nesnesini görebilir. Bu nedenle, izleyiciden uzaklaşıyor gibi görünen bir nesne, izleyiciye daha yakındaki bir nesnenin önünde görünebilir.

3B görüntüleme nesnelerinin katmanlamasının, nesnelerin göreceli derinliklerine karşılık geldiğinden emin olmak için, şunun gibi bir yaklaşım kullanın:

  1. Alt 3B görüntüleme nesnelerinin göreceli z-axes öğelerini almak için, Transform nesnesinin getRelativeMatrix 3D() yöntemini kullanın.

  2. Nesneleri görüntüleme listesinden kaldırmak için removeChild() yöntemini kullanın.

  3. Görüntüleme nesnelerini, göreceli z ekseni değerlerini esas alarak sıralayın.

  4. Alt öğeleri, ters sıralamayla geri görüntüleme listesine eklemek için addChild() yöntemini kullanın.

Bu yeniden sıralama, nesnelerinizin göreceli z eksenlerine göre görüntülenmesini sağlar.

Şu kod, bir 3B kutunun altı yüzünün doğru görüntülenmesini zorlar. Kutuya döndürmeler uygulandıktan sonra kutunun yüzlerini yeniden sıralar:

public var faces:Array; . . . 
 
public function ReorderChildren() 
{     
    for(var ind:uint = 0; ind < 6; ind++) 
    { 
        faces[ind].z = faces[ind].child.transform.getRelativeMatrix3D(root).position.z; 
        this.removeChild(faces[ind].child); 
    } 
    faces.sortOn("z", Array.NUMERIC | Array.DESCENDING); 
    for (ind = 0; ind < 6; ind++) 
    { 
        this.addChild(faces[ind].child); 
    } 
}

Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr. Uygulama dosyaları, Samples/ReorderByZ klasöründedir.