2012-10-11 101 views
0

我正在使用matrix.rotate方法旋轉矩形(框中的情況)。 我的旋轉事件看起來像下面如何在flex中圍繞質心旋轉矩形3

公共職能transformObject(transformEvent:TransformEvent):無效{

 var numChildrn:int = _markedObjectLayer.numChildren; 
     var tempMatrix: Matrix = null; 
     var tempx:Number; 
     var tempy:Number; 
     var tempHeight:Number; 
     var tempWidth:Number; 
     for(var i:int = 0; i < numChildrn; i++){ 
      var chld:MarkedObject = ObjectLayer.getChildAt(i) 
      if (chld.selected){ 
       var height:int = (BoxObject) chld.height; 
       var width:int = (BoxObject) chld.width; 


       tempMatrix = chld.transform.matrix; 


       tempHeight=height; 
       tempWidth=width; 


       tempMatrix = MatrixTransformer.transform(tempMatrix,transformEvent.angle); 


       tempMatrix.tx=tempx; 
       tempMatrix.ty=tempy 

       chld.transform.matrix = tempMatrix; 
      } 
     } 

     invalidateDisplayList(); 
    } 
} 

的Matrix.transform方法調用matrix.rotate方法

公共靜態函數變換(sourceMatrix:矩陣, 旋轉:編號= 0):矩陣 {

 sourceMatrix = MatrixTransformer.rotate(sourceMatrix, rotation, "degrees"); 

     return sourceMatrix; 
    } 



    /** 
    * Rotates a matrix and returns the result. The unit parameter lets the user specify "degrees", 
    * "gradients", or "radians". 
    */ 
    public static function rotate(sourceMatrix:Matrix, angle:Number, unit:String = "radians"):Matrix { 
     if (unit == "degrees") 
     { 
      angle = Math.PI * 2 *(angle/360); 
     } 

     sourceMatrix. rotate(angle) 
     return sourceMatrix; 
    } 

問題在於x和y是盒子的核心,因此它圍繞左角旋轉。但是,如果我嘗試將temp.x和temp.y作爲質心值,它不會圍繞質心旋轉?

任何人都可以建議我在這裏做錯了什麼?

感謝 阿克沙伊

+0

這是問題的提升http://stackoverflow.com/questions/12814859/rotating-of-box-in-flex3-using-matrix-transformation-about-center ?rq = 1 – Akshay

回答

0

想通了。看來我並沒有將它們翻譯成旋轉前後的適當座標位置

//步驟1修正矩形的座標。我加入他們的活動,使它們保持靜止

if (TransformEvent.X == 0 && TransformEvent.Y == 0) 
     { 
     TransformEvent.X = chld.x; 
      TransformEvent.Y = chld.y; 
     } 

//下一得到矩形的重心

 tempx = TransformEvent.X + width/2; 
     tempy= TransformEvent.Y +height/2; 

//步驟3:旋轉前翻譯

 tempMatrix.translate(-1*tempx,-1*tempy); 

//旋轉矩形

 tempMatrix = MatrixTransformer.transform(tempMatrix,transformEvent.angle); 

//翻譯旋轉

後質心
  tempMatrix.translate(tempx,tempy); 

//矩陣分配回矩形

  chld.transform.matrix = tempMatrix; 

感謝您的幫助。此網站也幫助我翻譯位 http://www.foxarc.com/blog/article/66.htm

0

如果你真的想要或需要直接使用矩陣,你可以在此更方便地使用內置閃光燈類做:fl.motion.MatrixTransformer

MatrixTransformer.rotateAroundInternalPoint(matrix, centroidX, centroidY, angleInDegrees); 

請參閱Adobe docsMatrixTransformer瞭解更多信息。

但是,如果你不需要使用變換矩陣,更簡單的解決辦法是:

  • 有以這樣的方式得出你的對象(0,0)是他們的心
  • 使用來自DisplayObject簡單rotation財產達到相同的目標,在一個更簡單的方式
+0

感謝Jakub的回覆。但是fl.motion.MatrixTransformer在flex中可用於導入?我試圖看,但沒有這樣的圖書館可用。我應該下載一些圖書館嗎? – Akshay

+0

我還沒有導入fl庫,但是每次旋轉後對象都會以螺旋運動的形式移動..我將很快發佈代碼 – Akshay