使用Matrix绝对旋转?

时间:2014-12-15 23:23:27

标签: actionscript-3

再次陷入困境......我正在尝试调整底部的rotate()代码,以便旋转是绝对的,即rotate(33)旋转到,而不是 那个度数。

我失败了。我的尝试如下。我想我可以在矩阵翻译后设置旋转,但什么都不做。试着阅读Matrices正在让我的头脑爆炸。我在这里缺少一件简单的事情吗?

        public function myRotate(angle:Number):void
        {
            trace("angle", angle);

            var m:Matrix = this.transform.matrix;
            var aroundPoint:Point = resetCenterPoint(this, this.width/2, this.height/2);
            var cm:Matrix = new Matrix(1, 0, 0, 1, -aroundPoint.x, -aroundPoint.y);
            m.concat(cm);

            // I thought I could apply the matrix to shift the reg point, 
            // set the absolute rotation
            // then use that matrix for when it gets shifted back
            // but it doesn't work.

            this.transform.matrix = m;
            this.rotation = angle;
            m = this.transform.matrix;

            //m.rotate(Math.PI * angle / 180);

            var rcm:Matrix = new Matrix(1, 0, 0, 1, aroundPoint.x, aroundPoint.y);
            m.concat(rcm);
            this.transform.matrix = m;
        }

此代码效果很好但旋转是相对的(即累积)。

        public function rotate(angle:Number):void
        {
            var m:Matrix = this.transform.matrix;
            var aroundPoint:Point = resetCenterPoint(this, this.width/2, this.height/2);
            var cm:Matrix = new Matrix(1, 0, 0, 1, -aroundPoint.x, -aroundPoint.y);
            m.concat(cm);

            m.rotate(Math.PI * angle / 180);

            var rcm:Matrix = new Matrix(1, 0, 0, 1, aroundPoint.x, aroundPoint.y);
            m.concat(rcm);
            this.transform.matrix = m;
        }

        private function resetCenterPoint(obj:DisplayObject, orgX:Number, orgY:Number):Point
        {
            var m:Matrix = obj.transform.matrix;
            var orgXY:Point = m.deltaTransformPoint(new Point(orgX, orgY));
            orgXY.x += m.tx;
            orgXY.y += m.ty;
            return orgXY;
        }

1 个答案:

答案 0 :(得分:0)

通过修改参数,可以将相对函数转换为绝对函数。

而不是rotate(relativeAngle),可以调用rotate(absoluteAngle - currentAngle)

但是,您的代码中存在问题。我尝试过它并不适合我。 我没有安装编译器,不得不使用wonderfl。 当我运行代码时,我可以看到形状“漂移”不合适。此外,它围绕某个点旋转,但不是形状的中间/注册点。

package {
    import flash.display.Sprite;
    import flash.events.Event;
    public class FlashTest extends Sprite {
        public function FlashTest() {
            // write as3 code here..

            var r:Rotator = new Rotator();
            addChild(r);

            r.x = r.y = 200;

            addEventListener(Event.ENTER_FRAME, function(e:Event):void{r.rotate(1)});
        }
    }
}
import flash.display.Shape;
import flash.display.DisplayObject;

import flash.geom.Matrix;
import flash.geom.Point;

internal class Rotator extends Shape
{
    public function Rotator()
    {
        graphics.beginFill(0xff00);
        graphics.drawRect(-50, -100, 100, 200);
        graphics.endFill();
    }

    public function rotate(angle:Number):void
        {
            var m:Matrix = this.transform.matrix;
            var aroundPoint:Point = resetCenterPoint(this, this.width/2, this.height/2);
            var cm:Matrix = new Matrix(1, 0, 0, 1, -aroundPoint.x, -aroundPoint.y);
            m.concat(cm);

            m.rotate(Math.PI * angle / 180);

            var rcm:Matrix = new Matrix(1, 0, 0, 1, aroundPoint.x, aroundPoint.y);
            m.concat(rcm);
            this.transform.matrix = m;
        }

        private function resetCenterPoint(obj:DisplayObject, orgX:Number, orgY:Number):Point
        {
            var m:Matrix = obj.transform.matrix;
            var orgXY:Point = m.deltaTransformPoint(new Point(orgX, orgY));
            orgXY.x += m.tx;
            orgXY.y += m.ty;
            return orgXY;
        }
}

因此整个代码重新定位部分出了问题。 由于旋转仍然是正确的,并且使用相对/绝对定位作为彼此替代的想法也应该成立,这对于手头的问题无关紧要。

但我会进一步调查代码,看看发生了什么。 在这里输入我的答案时,示例代码正在运行,现在形状几乎不在屏幕上。它漂移到0/0。

如果我不得不猜测,我会说这是一个舍入/精度问题。

对不断增加的问题表示抱歉。