2



到目前为止,我能够让一个叫做卫星的物体以椭圆的方式围绕另一个叫做炮塔的物体旋转。唯一的问题是,在卫星开始围绕炮塔旋转之前,它有一个初始位置(图 1)。然而,在第一帧之后,卫星从其初始位置移动到其他位置(图 2)。我试图让卫星从它的初始位置进入椭圆旋转,而不是让它移动到另一个位置,然后从那个新位置开始椭圆旋转。

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

第一帧的初始位置 在第一帧结果位置 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;      
}

我有点理解为什么它根据所使用的方程将卫星从初始位置移动到椭圆位置。我只是不知道如何编辑方程或变量以使椭圆“从”(也许包含更好的词)作为初始位置。

感谢您提供的任何帮助。

更新 :

此代码有效,但它类似于圆形轨道而不是椭圆轨道。
谢谢马库斯·贾德罗!

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;
}
4

2 回答 2

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/

于 2013-01-03T02:01:56.733 回答
1

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

于 2013-01-03T02:16:41.947 回答