【发布时间】:2010-03-17 12:00:52
【问题描述】:
不幸的是,这是一个需要解释的相当复杂的问题,所以请不要因文字墙而气馁——它的存在是有原因的。 ;)
我正在开发一个用于 Flash 的转换管理器,使用 Actionscript 3 编写。用户可以在屏幕上放置对象,例如矩形。
然后可以选择并转换此矩形:移动、缩放或旋转。
因为默认情况下 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;
这在对象未旋转时有效。但是,当它是时,位置包装器将不会旋转,因为它是旋转包装器的父级。这将使位置包装器水平向左移动,同时对象的宽度沿对角线增加。
我希望这有任何意义,如果没有,请告诉我,我会尝试详细说明。
现在,问题是:我应该使用不同类型的设置、系统还是结构?我是否应该使用矩阵,如果是这样,旋转后如何保持静态宽度/高度?或者如何修复当前的包装系统以在旋转后进行缩放?任何帮助表示赞赏。
【问题讨论】:
-
您可能希望将值除以 2 得到的值四舍五入 - 如果它们的大小是奇数,那么您最终会得到半像素位置的对象(这可能会导致搞笑抗锯齿)。这可能是也可能不是您想要的。
-
通过缩放,您的意思是这里通常不均匀缩放?例如,方形凸轮变成任何矩形?
-
卡梅伦,谢谢。 AB,是的,没错。
标签: actionscript-3 algorithm rotation transform scaling