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

使用した方程式に基づいて、サテライトを初期位置から楕円形の位置に移動する理由を理解しています。方程式や変数を編集して、楕円を「開始」(おそらく包含がより適切な単語)の初期位置にする方法がわかりません。

提供された助けをありがとう。

アップデート :

このコードは機能しますが、楕円軌道ではなく円軌道に似ています。
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;
}
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;

これは、移動角度に基づく標準の回転行列を使用しています。初期位置からタレットを中心に円を描くように回転します。

楕円軌道が必要な場合は、もう1つの参照点が必要です。軌道に沿った別の点、または初速度ベクトルです。

デモ: http: //jsfiddle.net/MizardX/dRFay/

于 2013-01-03T02:01:56.733 に答える
1

タレットを中心とし、衛星の初期位置が楕円曲線上にある楕円を計算し、各フレームで楕円のプロパティを変更して、目的の最終的な楕円に縮小します。このようにして、衛星はスムーズに軌道に入るでしょう。座標を加速して縮小/拡大して、遷移を高速化できます。したがって、基本的に行うことは、目的の寸法に到達して停止するまで、楕円にトランジションを適用することです。

于 2013-01-03T02:16:41.947 に答える