2009-03-09 21 views
2

Bir kapsayıcıyı (veya bu konuyla ilgili herhangi bir şeyi), esneklik için flash 10'daki matrix3D özelliklerini kullanarak döndürmenin en iyi yolunu bulmaya çalışıyorum.3B flex, bir kap için rastgele bir nokta etrafında döndürün (kısmi çözüm ile!)

Kayıt noktası olmayan bir nokta etrafında döndürmek için bir kapsayıcı almayı başardım ancak bunu yalnızca bir kapsayıcıdaki kırpma kapatarak ve ardından içeriği başka bir yere yerleştirerek (0,0,0) yönetdim). Bu işe yarıyor, ancak birkaç öğe yerleştirmeye çalışırken veya döndürme noktasını hareket ettirmeniz gerektiğinde çok sezgisel ve berbat değil.

Matrix3D sınıfını kullanmak yol gibi görünüyor, ancak tam olarak nasıl emin değilim.

Alkış

Ek bilgi - benim konteyner sahnede (0,0,0) olan ve o zaman ben container.width/'2 tarafından tercüme kabın orta X Koord etrafında döndürmek isterseniz X daha sonra tekrar çevirir ve tekrar çevirir. Bu iyi çalışıyor. AMA kapsayıcı (10, 0, 0) de söylerse, ben aynı yukarıdaki gibi çevirirseniz ve fazladan 10 eklerseniz, o zaman işe yaramıyor. (Komple çöp - eğer mümkünse açıklayınız)

soloution sonra, döndürme, çevirmek -traslate gerek ileri sürüldüğü gibi . Bunu biliyordum ama hiç işe yaramadı.
AMA, aşağıdaki sololaşmayı görüyorum, anlayamıyorum.

private function rotateOnly() : void { 
     panel.transform.matrix3D.appendRotation(36, Vector3D.Y_AXIS); 
} 

private var valueToMove : Number = 300; 
private var translateUpOrDown : Boolean = false; 
private function translateOnly() : void { 
    if(translateUpOrDown){ 
      panel.transform.matrix3D.appendTranslation(valueToMove, 0, 0); 
    translateUpOrDown = false; 
} else { 
    panel.transform.matrix3D.appendTranslation(-valueToMove, -0,0); 
    translateUpOrDown = true; 
} 
} 

//I do not run both chunks of code here at once, this is only to show what I've tried 
private function both() : void { 
    //IF I call this function and call this chunk then the rotation works 
     translateOnly(); 
     rotateOnly(); 
     translateOnly(); 


    //If I call this chunk which does the exact same as the above it does NOT work!! 
     panel.transform.matrix3D.appendTranslation(valueToMove, 0,0); 
panel.transform.matrix3D.appendRotation(36, Vector3D.Y_AXIS); 
panel.transform.matrix3D.appendTranslation(-valueToMove, 0,0); 
} 
+0

ikinci kod parçanızda çeviriler yanlış yoldan çevrilmiştir - ilk çeviri negatif olmalı, sonra döndürünüz, sonra pozitif çeviri (cevabımın başına olarak) – Alnitak

+0

Baktığınız zaman ne olur uzun bir konuda Başlangıçta, değiştirmeyi beklemediğim için kafa karıştırıcı olan, genişlik, yükseklik, x & y çevirisini kullanıyordum. Bunu yapmak genel görünümü berbat etti. Şerefe. – kenneth

cevap

1

Tamam, çözüm olacaktır. Bunlar, ekstra matris işlemlerini kaydetmek için bir araya gelmek için kullanılacaktır. E.G, Box sınıfını genişletir ve sadece bu var olanı yeni sınıfa ekler.

2 - bileşeni, aşağıdakine benzer bir şekilde uygulamaya ekleyin. (Orig değerleri böylece gerçek x, y, z dönmesi sırasında değişir, çünkü ancak doğru dönüş hesaplamak için değerleri orig gerekir

<local:RotationContainer 
     id="movingBox" 
     width="50" 
     origWidth="50" 
     height="60" 
     origHeight="60" 
     x="80" 
     origX="80" 
     y="70" 
     origY="70" 
     z="0" 
     origZ="0" 
     enterFrame="rotateObject(event)" 
     /> 

3 -. Aramak için, döner aşağıdaki kodu kullanmak exiting olay

private var translateUpOrDown : Boolean = false; 
     private function translateOnly(obj : Object, valueToMoveX : Number, valueToMoveY : Number) : void { 

      if(translateUpOrDown){ 
       obj.transform.matrix3D.appendTranslation(valueToMoveX, valueToMoveY, 0); 
       translateUpOrDown = false; 
      } else { 
       obj.transform.matrix3D.appendTranslation(-valueToMoveX, -valueToMoveY, 0); 
       translateUpOrDown = true; 
      } 
     } 

     private function rotateOnly(obj : Object) : void { 
      obj.transform.matrix3D.appendRotation(rotationAmount, Vector3D.Y_AXIS); 
     } 

     private function rotateObject(event : Event) : void { 

      var offsetX : Number = (event.currentTarget.origWidth/2) + event.currentTarget.origX; 
      var offsetY : Number = (event.currentTarget.origHeight/2) + event.currentTarget.origY; 

      translateOnly(event.currentTarget, offsetX, offsetY); 
      rotateOnly(event.currentTarget); 
      translateOnly(event.currentTarget, offsetX, offsetY); 
     } 

4 üzerinde -.. o şu Bu Y ekseni üzerinde, orta nokta etrafında döner farklı dönme noktaları için ofset değerleri değiştirin.

GÜNCELLEME olarak ayrı fonksiyonu içine aramaları taşımak gerekmez, ancak orijinal genişlikte alabilmeleri için yukarıdaki kullanmanız gerekecektir işaret, boy, senin sert kodlama değil sağlayan (& y x tüm değerler)

2

Rotasyon matrisleri her kökenli etrafında döndürmek (panel I döner ediyorum amacı, bir çağrı iki() işlev). gelişigüzel bir noktası P çevresinde bir nesnenin

Dönme genellikle gereken: P ile nesnenin gerekli

  • tercüme olarak nesnenin -P
  • dönüşü ile nesnenin

    1. çeviri
  • +1

    Bunu denedim. Ben kabın matrix3D aldım, bir appendTranslation (-x, -y, -z) yapıldı, sonra bir appendRotation, sonra başka bir appendTranslation (x, y, z) yaptı. matrix3D sınıfını kullanarak başka varyasyonları denedim, ancak bunu doğru anlayamıyorum. – kenneth

    +0

    Alnitak'ın çözümü, nesnenin başlangıçta olduğunu varsayar. –

    0

    Sadece pivot vektörünü hareket ettirmeyi düşündünüz mü?

    1 - - Orijinal X, Y, Z ve genişlik ve yükseklik için değişkenler ile kendi bileşeni oluşturun

    var matrix:Matrix3d = new Matrix3d(); 
    matrix.appendRotation(degrees, axis, new Vector3d(container.width/2,container.height/2,0)); 
    
    +0

    Bunu gerçekten denedim ve bazı beklenmedik sonuçlara sahip oldum (sonuçta zaten devam ettiğim sonuçlar değil). Yaşayan dokümanlar, matrix3D sınıfının kaynak koduna ulaşamadığınız için 3D çalışmasını göstermek için daha fazla bilgiye veya örneğe gereksinim duyarlar (orada yanılmadığım sürece, ama yapamadım). – kenneth