Actionscript 3 重新绘制显示对象时的变换矩阵操作

Actionscript 3 重新绘制显示对象时的变换矩阵操作,actionscript-3,flash,matrix,Actionscript 3,Flash,Matrix,我在从一个层次到另一个层次重新建立父子关系时,无法保持显示对象的相同变换。在下图中,您可以看到电影剪辑“mc1”,其中嵌套了子级“mc2”。“mc2”有自己的子“mc3”等等。每个子体都以某种方式进行了变换(旋转、缩放等)。我想从层次结构“mc1”中获取“mc4”,并将其放在层次结构“do1”的“do3”中(每个级别中也有不同的转换) 那么,如何在不改变正方形“mc4”的外观(位置除外)的情况下将其放入其他层次结构中呢? (想象一下拖放) 我试着用Transform.concatenedMatr

我在从一个层次到另一个层次重新建立父子关系时,无法保持显示对象的相同变换。在下图中,您可以看到电影剪辑“mc1”,其中嵌套了子级“mc2”。“mc2”有自己的子“mc3”等等。每个子体都以某种方式进行了变换(旋转、缩放等)。我想从层次结构“mc1”中获取“mc4”,并将其放在层次结构“do1”的“do3”中(每个级别中也有不同的转换)

那么,如何在不改变正方形“mc4”的外观(位置除外)的情况下将其放入其他层次结构中呢? (想象一下拖放)

我试着用Transform.concatenedMatrix属性来做,但我迷路了

谢谢


您可以尝试一下,它适用于我的情况(当您所做的只是修改缩放/x/y/旋转属性时),但在使用变换矩阵时可能无法正常工作

function changeParent(displayObj:DisplayObject, newParent:DisplayObjectContainer, depth:Number = -1, retainRelativeSize:Boolean = false):void {
var tmpParent:DisplayObjectContainer = displayObj.parent;

    while (tmpParent) {
        displayObj.scaleX *= tmpParent.scaleX;
        displayObj.scaleY *= tmpParent.scaleY;
        displayObj.rotation += tmpParent.rotation;
        tmpParent = tmpParent.parent;
    }

    tmpParent = newParent;
    while(tmpParent){
        displayObj.scaleX = displayObj.scaleX / tmpParent.scaleX;
        displayObj.scaleY = displayObj.scaleX / tmpParent.scaleY;
        displayObj.rotation -= tmpParent.rotation;
        tmpParent = tmpParent.parent;
    }

    var point1:Point= displayObj.localToGlobal(new Point());
    var point2:Point = newParent.globalToLocal(point1);

    if (depth >= 0) {
        newParent.addChildAt(displayObj, depth);
    }else {
        newParent.addChild(displayObj);
    }

    displayObj.x = point2.x;
    displayObj.y = point2.y;

}

您可以尝试这种方法,它适用于我的情况(当您所做的只是修改缩放/x/y/旋转属性时),但在使用变换矩阵时可能无法正常工作

function changeParent(displayObj:DisplayObject, newParent:DisplayObjectContainer, depth:Number = -1, retainRelativeSize:Boolean = false):void {
var tmpParent:DisplayObjectContainer = displayObj.parent;

    while (tmpParent) {
        displayObj.scaleX *= tmpParent.scaleX;
        displayObj.scaleY *= tmpParent.scaleY;
        displayObj.rotation += tmpParent.rotation;
        tmpParent = tmpParent.parent;
    }

    tmpParent = newParent;
    while(tmpParent){
        displayObj.scaleX = displayObj.scaleX / tmpParent.scaleX;
        displayObj.scaleY = displayObj.scaleX / tmpParent.scaleY;
        displayObj.rotation -= tmpParent.rotation;
        tmpParent = tmpParent.parent;
    }

    var point1:Point= displayObj.localToGlobal(new Point());
    var point2:Point = newParent.globalToLocal(point1);

    if (depth >= 0) {
        newParent.addChildAt(displayObj, depth);
    }else {
        newParent.addChild(displayObj);
    }

    displayObj.x = point2.x;
    displayObj.y = point2.y;

}

经过几次实验,我自己找到了正确的答案:

    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.geom.Matrix; 


function changeParent ( displayObject : DisplayObject, newParent : DisplayObjectContainer, depth : int = -1 ) : void {

    var concatenedChildMatrix       : Matrix = displayObject.transform.concatenatedMatrix;

    var concatenedNewParentMatrix   : Matrix = newParent.transform.concatenatedMatrix;

    // invert matrix. It couses visual removal of transformations (movie clip looks like it wasn't transformed )
    concatenedNewParentMatrix.invert();

    concatenedChildMatrix.concat( concatenedNewParentMatrix );

    // if you want to add clip not on top level
    if ( depth >= 0 ) {
        newParent.addChildAt( displayObject, depth );
    } else {
        newParent.addChild( displayObject );
    }

    // assign matrix back
    displayObject.transform.matrix = concatenedChildMatrix;

}       

经过几次实验,我自己找到了正确的答案:

    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.geom.Matrix; 


function changeParent ( displayObject : DisplayObject, newParent : DisplayObjectContainer, depth : int = -1 ) : void {

    var concatenedChildMatrix       : Matrix = displayObject.transform.concatenatedMatrix;

    var concatenedNewParentMatrix   : Matrix = newParent.transform.concatenatedMatrix;

    // invert matrix. It couses visual removal of transformations (movie clip looks like it wasn't transformed )
    concatenedNewParentMatrix.invert();

    concatenedChildMatrix.concat( concatenedNewParentMatrix );

    // if you want to add clip not on top level
    if ( depth >= 0 ) {
        newParent.addChildAt( displayObject, depth );
    } else {
        newParent.addChild( displayObject );
    }

    // assign matrix back
    displayObject.transform.matrix = concatenedChildMatrix;

}       

谢谢这对我很有用,但这不是我想要的答案。再次感谢你的回答。我贴出了自己的答案。也许它会对你有用。谢谢!这对我很有用,但这不是我想要的答案。再次感谢你的回答。我贴出了自己的答案。也许它会对你有用。