遗憾的是,这是一个非常复杂的问题需要解释,所以请不要因为文本之墙而气馁 - 这是有原因的。 ;)
我正在使用ActionScript 3编写flash转换管理器。用户可以在屏幕上放置对象,例如矩形。
然后可以选择并转换此矩形:移动,缩放或旋转。
因为flash默认围绕对象的左上角旋转,我希望它围绕中心旋转,所以我为每个显示对象创建了一个包装器设置(例如,一个矩形)。
这是包装器的设置方式:
//the position wrapper makes sure that we do get the top left position when we access x and y
var positionWrapper:Sprite = new Sprite();
positionWrapper.x = renderObject.x;
positionWrapper.y = renderObject.y;
//set the render objects location to center at the rotation wrappers top left
renderObject.x = 0 - renderObject.width / 2;
renderObject.y = 0 - renderObject.height / 2;
//now create a rotation wrapper, at the center of the display object
var rotationWrapper:Sprite = new Sprite();
rotationWrapper.x = renderObject.width / 2;
rotationWrapper.y = renderObject.height / 2;
//put the rotation wrapper inside the position wrapper and the render object inside the rotation wrapper
positionWrapper.addChild(rotationWrapper);
rotationWrapper.addChild(renderObject);
现在,可以直接访问和设置对象的x和y:mainWrapper.x或mainWrapper.y。可以从此主包装器的子节点设置和访问旋转:mainWrapper.getChildAt(0).rotation。最后,可以通过获取旋转包装器的子项并直接访问显示对象来检索和设置显示对象的宽度和高度。
关于我如何访问它们的示例:
//get wrappers and render object
var positionWrapper:Sprite = currentSelection["render"];
var rotationWrapper:Sprite = positionWrapper.getChildAt(0) as Sprite;
var renderObject:DisplayObject = rotationWrapper.getChildAt(0);
这适用于所有初始变换:移动,缩放和旋转。
但是,首次旋转对象(例如45度)然后缩放它时会出现问题。缩放的对象变形,不会按原样缩放。
例如,当您向左缩放时会发生这种情况。向左缩放基本上是向对象添加n宽度,然后将位置包装器的x坐标减少n:
renderObject.width -= diffX;
positionWrapper.x += diffX;
当对象未旋转时,此方法有效。但是,如果是,则位置包装器不会旋转,因为它是旋转包装器的父级。这将使位置包装器水平向左移动,同时对角的宽度沿对角线增加。
我希望这有任何意义,如果没有,请告诉我,我会尝试详细说明。
现在,问题是:我应该使用不同类型的设置,系统或结构吗?我是否可以使用矩阵,如果是这样,旋转后如何保持静态宽度/高度?或者如何修复当前的包装系统以便在旋转后进行缩放?任何帮助表示赞赏。
答案 0 :(得分:1)
怎么样:
positionWrapper.width -= diffX;
positionWrapper.x += diffX;
另外,您可以直接rotationWrapper
开出positionWrapper
并执行轮换。
除此之外,我建议您查看senocular's tranformtool和sephiroth's modifications。
编辑你基本上要寻找的是具有任意中心的任意向量的比例变换。有了这个,其余的都是微不足道的。对于第一个问题:创建一个矩阵M,将中心移动到0.0并将矢量旋转到x轴上。 concat M的x尺度乘以矢量的长度和M的倒数,得到的矩阵应该做你需要的。当然你可以用笔和纸直接计算得到的矩阵,但这应该足够了
答案 1 :(得分:1)
这看起来应该使用变换矩阵
看看这个伟大的帖子
http://gasi.ch/blog/zooming-in-flash-flex/