AS3:使用鼠标旋转DisplayObject

时间:2010-08-05 22:42:46

标签: flex flash actionscript-3 math rotation

我基本上是在尝试创建一个显示对象转换管理器,它允许我缩放/旋转对象。我目前正试图弄清楚如何旋转对象,使其角落跟随鼠标的当前x和y。

Example 1 http://www.freeimagehosting.net/uploads/ae697efb80.jpg Example 2 http://www.freeimagehosting.net/uploads/1a968e5e2b.jpg Example 3 http://www.freeimagehosting.net/uploads/1270816f01.jpg

我总是对这类事情的数学感到困惑。我知道如何倾听事件和所有事情,我只是不确定如何计算要应用的旋转量。我可能会通过矩阵旋转,所以我可以围绕它的中心旋转对象,而不是它的左上角。任何更熟练掌握数学知识的人都可以帮助我吗?

响应TROBADOUR

你的答案太棒了,根本无法理解。让我解释一下我能掌握什么,不能解释什么。这是我做/不理解的演练:

首先,保存图像的中间部分,即所谓的注册点,我们将围绕它旋转所有内容:

var box:Sprite = new BeautifulSprite();
box.width = box.height = 100;
/* ... */
var registrationPoint:Point = new Point(box.x + box.width / 2, 
        box.y + box.height / 2);

到目前为止我是否正确?如果是这样,我会继续。

其次,表示原始鼠标按下位置:

var mouseDownPoint:Point = new Point(box.mouseX, box.mouseY);

第三,存储“矢量”。问题是,我不确定你的意思是什么。我熟悉Java和AS3中的Vector类型,因为它们存储了某种类型的值列表。除此之外,我迷路了。

var vector:* = WTF.forReals();

接下来,保存registrationPointmouseDownPoint之间的距离。我记得在高中时学习计算两点之间的距离,所以我相信我可以挖出两个2d点之间距离的公式。

var distance:Number = calculateDistance(registrationPoint, mouseDownPoint);

我知道我越来越近了!接下来,为了确定约束比例,我们获取当前鼠标位置,确定其到registrationPoint的距离,并将其除以distance

var constrainedScale:Number = calculateDistance(registrationPoint, new Point(mouseX, mouseY)) / distance;

我的问题是:如果我不希望它们受限制,如何获得值,比如scaleX和scaleY?

现在,为了获得注册点周围的实际旋转,我完全迷失了。你能用我上面定义的变量帮助我吗?

1 个答案:

答案 0 :(得分:3)

当处于未缩放的未旋转状态(x1,y1)时,将刻度/旋转中心的鼠标坐标表示为(x0,y0)和角落的鼠标坐标。存储点(x0,y0)并缓存向量和(x0,y0)和(x1,y1)之间的距离。用v0表示缓存的向量,用d0表示距离。

要获得比例因子,只需计算当前鼠标的距离(x0,y0)并将其除以d0。

要获得旋转角度,首先计算(x0,y0)和当前鼠标之间的向量。用v表示。然后使用点积公式计算角度

v.v0 = | v | d0 cos(theta)

会给你0到pi之间的东西。要进入正确的象限,只需检查v和v0的叉积的符号并进行相应的调整。