私は現在、ランダム トラックの生成を含むプロジェクトに取り組んでいます (Z 軸の固定インクリメントとランダム化された X と Y ででこぼこのトラックを作成します)。期待どおりに機能する Catmull Rom 補間を使用してトラックを実装しています。これにより、9800 個のポイントが生成され、2 次元配列に格納されます。
私の主な問題は、トラックに沿ってオブジェクトをパスしようとしているということです(カメラの使用と、後でアバターが従うため)。現在、msdn ヘルプhttp://msdn.microsoft.com/en-us/library/microsoft.xna.framework.curve.aspxに従って Curve3D クラスを使用しています 。 「testCube」ベースの位置を割り当てる関数があります。値の時間と、catmull を含む配列の結果がオフになります。
今問題に; 私の立方体は広い意味でトラックを下りますが、トラックが進行するにつれて、頻度が増加して前後にジャンプするように見えます。干渉する可能性がある他のコードを排除しました。
私は現在使用しています:
public void UpdateMotionCube(GameTime gameTime1)
{
testCube.position = motionCubePosition.GetPointOnCurve((float)motionTime);
motionTime += gameTime1.ElapsedGameTime.TotalMilliseconds;
}
public void InitiateCurve()
{
float time = 0;
//for (int row = 0; row < 99; row++)
for (int col= 0; col < 99; col++)
{
//assigns positions to the new curve from drawLocValues
motionCubePosition.AddPoint(newTrack.basicPoints/*.drawlocValues*/[/*row,*/ col], time);
time += timeConst;
}
motionCubePosition.setTangents();
}
basicPoints 配列は、catmullRom 補間に使用した元の 100 ポイントを保持し、drawLocValues は補間の結果です (それぞれ 100 と 10000 の値)
testCube が正しい方向に向かっているのではなく、トラックをまっすぐ進んでいない理由についてのアドバイスをいただければ幸いです。余談ですが、両方のベクトル配列の値は、チェックしたとおり正しいです (そして、トラック自体が正しく描画されます)。また、すべての xyz ポストおよびプレループのカーブ クラス内で CurveX.postloop.CurveLoopType.Linear を使用しています。
ありがとう
編集: 要求に応じて接線コードを設定:
public void setTangents()
{
CurveKey prev;
CurveKey current;
CurveKey next;
int prevIndex = 0;
int nextIndex = 0;
for (int i = 0; i < curveX.Keys.Count; i++)
{
prevIndex = i - 1;
if (prevIndex < 0)
{
prevIndex = i;
nextIndex = i + 1;
}
if (nextIndex == curveX.Keys.Count) nextIndex = i;
prev = curveX.Keys[prevIndex];
next = curveX.Keys[nextIndex];
current = curveX.Keys[i];
SetCurveKeyTangent(ref prev, ref current, ref next);
curveX.Keys[i] = current;
prev = curveY.Keys[prevIndex];
next = curveY.Keys[nextIndex];
current = curveY.Keys[i];
SetCurveKeyTangent(ref prev, ref current, ref next);
curveY.Keys[i] = current;
prev = curveZ.Keys[prevIndex];
next = curveZ.Keys[nextIndex];
current = curveZ.Keys[i];
SetCurveKeyTangent(ref prev, ref current, ref next);
curveZ.Keys[i] = current;
}
}
あなたの質問に答えるには、はい、それは本質的にラッパーです。問題は、画面に出力された testCube.position.Z にあるようです。問題なく開始されますが、時間の経過とともに、値が増加し続けて倍増し始めます。一般的に言えば、前進の勢いを維持しますが、より良いものを求めています。それが前方に吃音し、その後後方に吃音するなど。
これまでの返信ありがとうございます