如何在flex 3中围绕质心旋转矩形

时间:2012-10-11 05:15:54

标签: actionscript-3 flex matrix actionscript flex3

我使用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作为质心值,它不会围绕质心旋转?

任何人都可以建议我在这里做错了吗?

由于 阿克沙伊

2 个答案:

答案 0 :(得分:0)

如果您确实想要或必须直接使用矩阵,可以使用内置闪存类更方便地完成此操作:fl.motion.MatrixTransformer

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

有关详细信息,请参阅MatrixTransformer上的Adobe docs

但是,如果你不需要来使用转换矩阵,那么更简单的解决方案是:

  • 让你的对象以(0,0)是它们的质心
  • 的方式绘制
  • 使用rotation中的简单DisplayObject属性,以更简单的方式实现相同的目标

答案 1 :(得分: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