关于apache flex:AS3:使用鼠标旋转DisplayObject

AS3: Rotate a DisplayObject with the Mouse

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

Example 1

Example 2

Example 3

我总是对这样的事情感到困惑。我知道如何监听事件和所有事件,只是不确定如何计算要应用的轮换数量。我可能会通过矩阵旋转,以便围绕对象的中心而不是其左上角旋转对象。谁会更精通此数学运算的人可以帮助我吗?

对TRABADOUR的回应

您的答案是如此出色,以至于我根本听不懂。让我解释一下我能掌握和不能理解的。以下是我的了解/不了解的演练:

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

1
2
3
4
5
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);

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

第二,表示原始鼠标向下的位置:

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

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

1
var vector:* = WTF.forReals();

接下来,保存registrationPointmouseDownPoint之间的距离。我记得在高中时曾学习过计算两个点之间的距离的知识,因此,我确定我可以挖掘出两个2d点之间的距离的公式。

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

我知道我要靠近了!接下来,要确定约束比例,我们获取鼠标的当前位置,确定其与registrationPoint的距离,然后将其除以distance

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

我的问题是:当我不希望它们受到约束时如何获得值,例如scaleX和scaleY?

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


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

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

要获取旋转angular,请首先计算(x0,y0)与当前鼠标坐标之间的向量。用v表示。然后使用点积公式

计算angular

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

这将为您提供介于0和pi之间的值。要进入正确的象限,只需检查v和v0的叉积的符号并相应地进行调整。