AS3: Rotate a DisplayObject with the Mouse
我基本上是在尝试创建一个显示对象转换管理器,该管理器将使我能够缩放/旋转对象。我目前正在尝试弄清楚如何旋转对象,以便其角跟随鼠标的当前x和y。
我总是对这样的事情感到困惑。我知道如何监听事件和所有事件,只是不确定如何计算要应用的轮换数量。我可能会通过矩阵旋转,以便围绕对象的中心而不是其左上角旋转对象。谁会更精通此数学运算的人可以帮助我吗?
对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(); |
接下来,保存
1 | var distance:Number = calculateDistance(registrationPoint, mouseDownPoint); |
我知道我要靠近了!接下来,要确定约束比例,我们获取鼠标的当前位置,确定其与
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的叉积的符号并相应地进行调整。