物体绕点连续旋转
Continuous object rotation around point
我想做一个类似于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
}
请注意,此代码是在框架中编写的,并未针对实际使用进行优化,而是说明了算法。
我想做一个类似于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
}
请注意,此代码是在框架中编写的,并未针对实际使用进行优化,而是说明了算法。