围绕点的连续物体旋转
问题描述:
我想制作一个类似于rotateAroundInternalPoint()
的功能。到目前为止,我的解决办法是这样的:围绕点的连续物体旋转
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Point;
addEventListener(Event.ENTER_FRAME, onFrame);
function onFrame(e:Event):void
{
var m:Matrix = item.transform.matrix.clone();
var point:Point = new Point(50, 50); // The object's width and height are 100px, so 50 is the center
point = m.transformPoint(point);
m.translate(-point.x, -point.y);
m.rotate(5 * (Math.PI/180));
m.translate(point.x, point.y);
item.transform.matrix = m;
}
但是有这个代码的根本缺陷 - 它变得越来越少精确,每次迭代。
有人可以指出是什么原因造成的,以及解决方案是什么?
答
我已经解决了引入不会改变的参考矩阵的问题,所以最初的迭代中的错误是不存在的。
这里的实现:
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Point;
var referenceMatrix:Matrix = item.transform.matrix.clone();
addEventListener(Event.ENTER_FRAME, onFrame);
var i:Number = 0; // you'll need this because the referenceMatrix rotation will only go one step, so instead you need to increase the rotation
function onFrame(e:Event):void
{
var m:Matrix = referenceMatrix.clone();
var point:Point = new Point(100, 100); // pivot point local to the object's coordinates
point = m.transformPoint(point);
m.translate(-point.x, -point.y);
m.rotate(i * (Math.PI/180));
m.translate(point.x, point.y);
item.transform.matrix = m;
i += 1.2; // rotation step
}
请注意,这段代码是写在一个框架和实际使用没有得到很好的优化,而是说明了算法。
我仍然接受一个更好的答案,不依赖于参考矩阵,而是依赖于更好的数学。 –