Actionscript中Matrix缩放/旋转的奇怪稳定性问题

时间:2013-03-28 17:17:33

标签: actionscript-3 animation matrix image-rotation image-scaling

我有一个Flash应用程序,我正在执行关于_background中心的缩放和旋转操作:MovieClip(表示书籍的页面)。我在这个MC的GESTURE_ROTATE和GESTURE_SCALE事件上有简单的事件监听器,它更新了一些变量currentRotation和currentScaleX,currentScaleY。然后,我在应用程序的ENTER_FRAME事件上有以下代码触发器。

我遇到的问题是当MC旋转超过大约60或-60度的极限,或者稍微缩放并旋转时,MC开始振荡并最终旋转失控并离开屏幕。我已经尝试了几个东西来调试它,甚至尝试了Math.flooring currentRotationValue并将currentScaleX / Y的值四舍五入到十分位置(Math.floor(currentScale * 10)/ 10),但这些似乎都无法解决它。我现在有点陷入困境,并尽可能多地尝试研究,但找不到任何东西。有什么建议?是否存在在每个帧上执行此操作的问题?

private function renderPage(e:Event) {
    var matrix:Matrix = new Matrix();

    // Get dimension of current rectangle.
    var rect:Rectangle = _background.getBounds(_background.parent); 

    // Calculate the center.
    var centerX = rect.left + (rect.width/2);
    var centerY = rect.top + (rect.height/2);

    // Translating to the desired reference point.
    matrix.translate(-centerX, -centerY); 

    matrix.rotate(currentRotation / 180) * Math.PI);
    matrix.scale(currentScaleX, currentScaleY);
    matrix.translate(centerX, centerY); 

    _background.transform.matrix = matrix;
}

1 个答案:

答案 0 :(得分:0)

我不确定您尝试制作的行为,但我认为问题是centerXcenterY定义了 {{_background的中间位置1}}的坐标空间。然后,您正在翻译_background.parent,以便matrix围绕值_background旋转,但在 centerX, centerY 的坐标空间中。

假设您希望_background围绕屏幕上保持静态的点旋转,您实际需要做的是使用两个不同的_background

Points

其中matrix.translate(-_rotateAroundPoint.x, -_rotateAroundPoint.y); matrix.rotate(currentRotation / 180) * Math.PI); matrix.scale(currentScaleX, currentScaleY); matrix.translate(_centerOnPoint.x, _centerOnPoint.y); _rotateAroundPoint应该转入其中自己的坐标空间的点,而_background是它应该转入其中的点父级的坐标空间。

当您想要平移_centerOnPoint而不是每一帧时,只需要重新计算这两个值。例如:

_background