具有初始位置的AS3对象进入椭圆轨道

时间:2013-01-03 01:11:22

标签: actionscript-3 flash math



到目前为止,我能够以椭圆形方式使一个名为卫星的对象围绕另一个称为炮塔的物体旋转。唯一的事情是,在卫星围绕炮塔开始旋转之前,它有一个初始位置(图1)。然而,在第一帧之后,卫星从其初始位置移动到其他地方(图2)。我试图让卫星从它的初始位置进入椭圆旋转,而不是将它移动到另一个位置,然后从该新位置开始椭圆旋转。

图1。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。图2

Initial position at first frame http://s2.postimage.org/micowwjix/Initial_Position.png After first frame resulting position http://s1.postimage.org/xscznk8bz/After_Initial_Position.png

代码:

private var fixedPoint1:int = 0;
private var fixedPoint2:int = 0;
private var currentDegrees:Number = 0;

private function onEnterFrame(event:Event):void
{   
    var dx:Number = turret.x - satelite.x; // This code deals with turret rotation
    var dy:Number = turret.y - satelite.y; // So does this code

    var angle:Number = Math.atan2(dy, dx); // As does this code

    turret.rotation = (angle * 180 / Math.PI); // Finally done with turret rotation code

    if (firstRun) {
        currentDegrees = angle * 180 / Math.PI;
        fixedPoint1 = satelite.x;
        fixedPoint2 = satelite.y;
        firstRun = false;
    }

    currentDegrees += 1;

    var radians:Number = currentDegrees * Math.PI / 180;
    var posX:Number = turret.x + Math.cos(radians) * (fixedPoint1);
    var posY:Number = turret.y + Math.sin(radians) * (fixedPoint2);

    satelite.x = posX;
    satelite.y = posY;      
}

我有点理解为什么它会根据所使用的方程式将卫星从它的初始位置移动到它的椭圆位置。我只是无法弄清楚如何编辑方程或变量以使椭圆“从”开始(可能包含更好的词)初始位置。

感谢您提供的任何帮助。

更新:

此代码有效,但它类似于圆形轨道而非椭圆轨道 谢谢Markus Jarderot!

private function onEnterFrame(event:Event):void
{   
        var dx:Number = turret.x - satellite.x;
        var dy:Number = turret.y - satellite.y;

        var angle:Number = Math.atan2(dy, dx);

        turret.rotation = (angle * 180 / Math.PI);

        if (firstRun) {
             currentAngle = (180 * Math.PI/180); // Start out at pi
                                                 // instead of 0 for some reason?

            fixedPointX = turret.x - satellite.x; // xRadius = distance between turret.x and satellite.x
            fixedPointY = turret.y - satellite.y; // yRadius = distance between turret.y and satellite.y

            firstRun = false;
        }

        currentAngle += Math.PI / 180.0; // one degree
        if (currentAngle > Math.PI) currentAngle -= 2.0 * Math.PI;

        var cosAngle : Number = Math.cos(currentAngle);
        var sinAngle : Number = Math.sin(currentAngle);

        satellite.x = turret.x + cosAngle * fixedPointX + sinAngle * fixedPointY;
        satellite.y = turret.y - sinAngle * fixedPointX + cosAngle * fixedPointY;
}

2 个答案:

答案 0 :(得分:1)

这看起来像是圆形路径的不完整版本。

var dx : Number = satellite.x - turret.x;
var dy : Number = satellite.y - turret.y;

var angle : Number = Math.atan2(dy, dx);

turrent.rotation = angle;

if (firstRun) {
    currentAngle = 0; // radians relative to fixed point

    fixedPointX = dx;
    fixedPointY = dy;

    firstRun = false;
}

currentAngle += Math.PI / 180.0; // one degree, or 1/360th cycle.
if (currentAngle > Math.PI) currentAngle -= 2.0 * Math.PI;

var cosAngle : Number = Math.cos(currentAngle);
var sinAngle : Number = Math.sin(currentAngle);

satellite.x = turret.x + cosAngle * fixedPointX + sinAngle * fixedPointY;
satellite.y = turret.y - sinAngle * fixedPointX + cosAngle * fixedPointY;

这是基于移动角度使用标准旋转矩阵。它将围绕炮塔旋转一圈,从初始位置开始。

如果你想要一个椭圆轨道,你需要再有一个参考点:沿轨道的另一个点,或者初始速度矢量。

演示: http://jsfiddle.net/MizardX/dRFay/

答案 1 :(得分:1)

计算一个以炮塔为中心的椭圆,卫星的初始位置在椭圆曲线上,然后在每个帧上修改椭圆的属性并将其缩小到所需的最终椭圆。这样卫星将顺利进入轨道。您可以使用加速度缩小/增大坐标,以实现更快的过渡。所以你基本上做的是在椭圆上应用一个过渡,直到达到你想要的尺寸然后停止。