2009-12-14 24 views
8

Bir Sprite'ı merkez noktası etrafında üç boyutta döndürmeye çalışıyorum ve matrix3D'nin bazı davranışlarını anlamaya çalışıyorum.matrix3D kullanarak AS3'te merkez etrafında 3D döndürme nasıl yapılır?

override public function set rotationX (_rotationX:Number) : void { 

    this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0); 
    this.transform.matrix3D.prependRotation(-this.rotationX, Vector3D.X_AXIS); 
    this.transform.matrix3D.prependRotation(_rotationX, Vector3D.X_AXIS); 
    this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0); 

} 

override public function set rotationY (_rotationY:Number) : void { 

    this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0); 
    this.transform.matrix3D.prependRotation(-this.rotationY, Vector3D.Y_AXIS); 
    this.transform.matrix3D.prependRotation(_rotationY, Vector3D.Y_AXIS); 
    this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0); 

} 

override public function set rotationZ (_rotationZ:Number) : void { 

    this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0); 
    this.transform.matrix3D.prependRotation(-this.rotationZ, Vector3D.Z_AXIS); 
    this.transform.matrix3D.prependRotation(_rotationZ, Vector3D.Z_AXIS); 
    this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0); 

} 
bir dönme merkez noktasını düzeltmek için prependTranslation kullanıyorum

ve birinci prependRotation herhangi Daha önce tarif iptal etmek için aşağıdaki gibidir:

Ive Perisinin grubu rotationX, rotationY ve rotationZ yöntemleri geçersiz uygulanan rotasyon.

Bunu sınamak, rotationX tam olarak beklendiği gibi çalışır ve Sprite yatay ekseninin etrafında döner.

rotationY ve rotationZ ayrıca iyi görünüyor. Ancak, bir sorun var: rotasyon veya rotasyon her ayarlandığında, diğer tüm rotasyon değerleri de değişir. Bu, rotationX ile ilgili bir sorun değildir - eğer rotationX ayarlarsam, başka hiçbir şey değişmez. Ama eğer rotasyonum veya rotasyon ayarlıysam, tüm rotasyon değerleri değişiyor ki bu benim app için bir sorun (değerleri kaydetmeye ve geri yüklemeye çalışıyor).

Sadece matrix3D ile neler olup bittiği hakkında biraz bilgim yok. Bunu nasıl uygulayabilirim ki değerler arasında karşılıklı bağımlılık yok mu?

+0

en iyi şey [UIComponent # transformAround] 'a göz atmaktır (http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/frameworks/projects/framework/src/mx/core/UIComponent.as) ve ilgili AdvancedLayout.as uygulaması. Tam olarak bunu yapıyorlar, Matrix3D'yi sarar. –

+0

Kodunuza bakmıyorsunuz, ancak Gimbal Lock'u yaşıyor musunuz? http://en.wikipedia.org/wiki/Gimbal_lock –

cevap

3

Başka bir kolay çözüm, nesneyi eklemek ve bir kapsayıcı grafiğe yerleştirmek ve 3 boyutlu dönüşümleri içeren hareketli grafiğe dönüştürmektir.

+0

yeh bu çok daha kolay. Bir tutucu oluşturun, ardından Sprite'ı x: -mysprite.width * 0.5 ve y: -mysprite.height * 0.5 ile ekleyin ve sonra tutucuyu döndürün – daidai

1

AS3 vb. Hakkında hiçbir şey bilmiyorum. Fakat sadece kodunuza baktığımda, x ve y değerleri (genişlik ve yükseklik) olarak anladığım şeyi kullanarak z ekseni üzerinde neden çeviri yaptığınızı merak ediyorum. Z ekseni "derinlik" gibi bir şey kullanılarak çevrilmemeli mi?

0

Bu çok basit, aşağıdaki kodu kullanabilirsiniz deneyebilirsiniz:

var matrix3d:Matrix3D = s.transform.matrix3D; 
matrix3d.appendRotation(-1, Vector3D.Z_AXIS , new Vector3D(390, 360, 0)); 

ederken ler hareketli grafik, üçüncü parametre olan, Vector3D senin birleşik resmin merkez konumunu göstermektedir.

Yukarıdaki kod, grafiğin daha fazla derece döndürülmesini sağlayacaktır.

İlgili konular