1

現在、ハエをある位置から別の位置に移動するために、私はこれを使用しています:

    DirectionNormalized = (positionTarget - position).Normalize;

    position += DirectionNormalized *
            vitesseP2P *
            (float)gameTime.ElapsedGameTime.TotalMilliseconds;

つまり、フライは A 点から B 点、C 点、D 点などのように一直線に飛んでいきます。

しかし、その軌道を曲げたいと思います。信じられない、簡単だと思ったのに何時間も立ち往生しています。

あなたが助けてくれることを願っています。

4

3 に答える 3

3

これを実現する最も一般的な方法は、ベジェ曲線を使用することです。Bezierアルゴリズムは、一連のポイント(2つのエンドポイントといくつかのコントロールポイント)を取得し、それらのポイントによって定義された曲線に沿ったさまざまな位置に一連のポイントを生成します。

ベジェアルゴリズムの一般化された形式は反復的な削減ですが、特定の4ポイントの場合に展開して、次のBezierInterpolateような関数を生成できます。

public static Vector2 BezierInterpolate(Vector2 p0, Vector2 p1, Vector2 c0, Vector2 c1, float fraction)
{
    // first stage, linear interpolate point pairs: [p0, c0], [c0, c1], [c1, p1]
    Vector2 p0c0 = Vector2.Lerp(p0, c0, fraction);
    Vector2 c0c1 = Vector2.Lerp(c0, c1, fraction);
    Vector2 c1p1 = Vector2.Lerp(c1, p1, fraction);

    // second stage, reduce to two points
    Vector2 l = Vector2.Lerp(p0c0, c0c1, fraction);
    Vector2 r = Vector2.Lerp(c0c1, c1p1, fraction);

    // final stage, reduce to result point and return
    return Vector2.Lerp(l, r, fraction);
}

これにより、曲線に沿った特定の割合のポイントの位置がわかります。たとえば、アニメーションの開始時刻と終了時刻がある場合は、上記を使用してフライの現在の位置を生成できます。

ただし、最初に、コントロールポイントを定義する必要があります。私はこのようなものを使用します:

static System.Random prng = new System.Random();

public static Vector2 genControlPoint(Vector2 l, Vector2 r)
{
    // get a random angle between +/-(15..90) degrees off line
    float angle = (float)((((prng.NextDouble() * 5) + 1) / 12) * Math.PI * (prng.Next(0, 2) * 2 - 1));

    // create rotation matrix
    Matrix rot = Matrix.CreateRotationZ(angle);

    // get point offset half-way between two points
    Vector2 ofs = Vector2.op_Multiply(Vector2.op_Subtract(l, r), 0.5);

    // apply rotation
    ofs = Vector2.Transform(ofs, rot);

    // return point as control
    return Vector2.op_Add(l, ofs);
}

....

Vector2 p0 = FlyStartPoint();
Vector2 p1 = FlyEndPoint();
// generate randomized control points for flight path
Vector2 c0 = genControlPoint(p0, p1);
Vector2 c1 = genControlPoint(p1, p0);

この時点で、最初の4つのパラメーターとしてBezierInterpolateメソッドに渡すのに適した4つのポイントのセットがあり、そこから特定の時間における「フライ」の位置を決定できます。

ベジェ曲線は最初は怖いものですが、一度理解すると便利なツールになります。ここで行うように手作業で行うと、Vector2.Hermiteまたはに電話したときにバックグラウンドで実際に何が起こっているのかをもう少し理解できますVector2.CatmullRom

于 2013-02-24T04:30:57.990 に答える
0

スプラインを計算し、そのスプラインに沿って (経時的に) 配置することができます。

http://www.c-sharpcorner.com/UploadFile/apundit/DrawingCurves11182005012515AM/DrawingCurves.aspxを参照してください。

別のアプローチは、物理エンジンを使用することです。ハエに質量と速度を与え、その速度を変更することで動きに変化を適用できます。

于 2013-02-24T00:10:13.087 に答える
0

Xna フレームワークには、これを行う組み込みの Curve クラスがあります。

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.curve.aspx

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.curve(v=XNAGameStudio.35).aspx

コード付きのサンプルは次の場所にあります。

http://msdn.microsoft.com/en-us/library/bb203908.aspx

曲線をコードに簡単に挿入するための特別な曲線エディターも作成しました: http://xbox.create.msdn.com/en-US/education/catalog/utility/curve_editor

于 2013-02-24T15:11:28.977 に答える