Karmaşık 3B dönüştürmeler gerçekleştirmeFlash 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şturmaMatrix3D nesnelerini oluşturmanın ve almanın üç ana yolu vardır:
Birden çok 3B dönüştürmesi uygulamaMatrix3D 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 kullanmaDaha ö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:
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. |
|