4

こんにちは、

8 つの制約付きランダム値を指定して、Cubic CatMull-Rom スプラインに沿って移動するゲーム オブジェクトを Unity に実装しようとしています。3 次 Catmull-Rom 曲線上のポイントを返す関数ComputePointOnCatmullRomCurveを実装しました (0 から 1 までのスカラー 'u' と、補間に使用する 4 ポイントを示す segment_number が与えられた場合)。

GameObject をスムーズに動かすための更新機能の実装に問題があります。私は現在、更新ごとにComputePointOnCatmullRomCurveを呼び出しており、そのたびに segment_number をインクリメントしています。次に、ゲームオブジェクトの位置が関数の結果に設定されます。

ただし、これは非常に速く動くゲームオブジェクトにつながります。Update 関数が間違っていると思いますが、補間関数によって出力されているポイントに関してゲームオブジェクトを移動する方法がわかりません。

誰かが私が間違っていることを説明したり、例を提供したり、例へのリンクを提供したりできる場合は、非常に役立ちます!

曲線上の点を計算する関数:

Vector3 ComputePointOnCatmullRomCurve(float u, int segmentNumber)
{
    // TODO - compute and return a point as a Vector3       
    // Points on segment number 0 start at controlPoints[0] and end at controlPoints[1]
    // Points on segment number 1 start at controlPoints[1] and end at controlPoints[2]
    //       etc...

    Vector3 point = new Vector3();

    float c0 = ((-u + 2f) * u - 1f) * u * 0.5f;
    float c1 = (((3f * u - 5f) * u) * u + 2f) * 0.5f;
    float c2 = ((-3f * u + 4f) * u + 1f) * u * 0.5f;
    float c3 = ((u - 1f) * u * u) * 0.5f;

    Vector3 p0 = controlPoints[(segmentNumber - 1) % NumberOfPoints];
    Vector3 p1 = controlPoints[segmentNumber % NumberOfPoints];
    Vector3 p2 = controlPoints[(segmentNumber + 1) % NumberOfPoints];
    Vector3 p3 = controlPoints[(segmentNumber + 2) % NumberOfPoints];

    point.x = (p0.x * c0) + (p1.x * c1) + (p2.x * c2) + (p3.x * c3);
    point.y = (p0.y * c0) + (p1.y * c1) + (p2.y * c2) + (p3.y * c3);
    point.x = (p0.z * c0) + (p1.z * c1) + (p2.z * c2) + (p3.z * c3);

    return point;
}

更新機能:

void Update () {
    // TODO - use time to determine values for u and segment_number in this function call
    // 0.5 Can be used as u
    time += DT;

    segCounter++;

    Vector3 temp = ComputePointOnCatmullRomCurve(time, segCounter);
    transform.position = temp;
}

変数:

const int NumberOfPoints = 8;
Vector3[] controlPoints;

const int MinX = -5;
const int MinY = -5;
const int MinZ = 0;

const int MaxX = 5;
const int MaxY = 5;
const int MaxZ = 5;

float time = 0;
const float DT = 0.01f;
public static int segCounter = 0;

ありがとう!

マット

4

1 に答える 1