0

長方形 (私の場合はボックス) を回転させるために、matrix.rotate メソッドを使用しています。私の回転イベントは以下のようになります

public function transformObject(transformEvent:TransformEvent):void{

        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 メソッドを呼び出します

public static function transform(sourceMatrix:Matrix, rotation:Number=0 ):Matrix {

        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 をセントロイド値として指定しようとすると、セントロイドを中心に回転しませんか?

ここで私が間違っていることを誰かが提案できますか?

ありがとうございます

4

2 に答える 2

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で私を助けてくれました

于 2012-10-16T18:41:09.853 に答える
0

マトリックスを直接使用したい、または使用しなければならない場合は、組み込みのフラッシュ クラスを使用すると、より便利に行うことができますfl.motion.MatrixTransformer

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

詳細については、Adobeドキュメントを参照しMatrixTransformerてください。

ただし、変換行列を使用する必要がない場合、より簡単な解決策は次のとおりです。

  • (0, 0) が重心になるようにオブジェクトを描画します
  • はるかに簡単な方法で同じ目標を達成する単純なrotationプロパティを使用するDisplayObject
于 2012-10-11T09:49:26.607 に答える