В настоящее время я работаю над проектом, который включает в себя создание случайной дорожки (фиксированные приращения по оси Z и рандомизированные X и Y для создания неровной / наклонной дорожки). Я реализовал дорожку с использованием интерполяции Catmull Rom, которая работает, как и ожидалось. Это создает 9800 точек, которые в свою очередь сохраняются в 2d массиве.
Моя главная проблема заключается в том, что я сейчас пытаюсь навести объект вдоль дорожки (для использования камеры, а затем и для последующего аватара). В настоящее время я использую класс Curve3D в соответствии с MSDN справки
http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.curve.aspx У меня есть функция, которая назначает позицию «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 содержит исходные 100 точек, которые я использовал для интерполяции catmullRom, а drawLocValues - это результаты интерполяции (значения 100 и 10000 соответственно)
Любой совет относительно того, почему testCube не идет прямо по дорожке, в отличие от движения в правильном направлении, но отскок назад и вперед, будет принята с благодарностью.
Кроме того, значения для обоих векторных массивов верны, так как я проверил их (и сама дорожка рисуется правильно), я также использую CurveX.postloop.CurveLoopType.Linear внутри класса кривой для всех постов xyz и цикла pre.
Спасибо
EDIT:
Задайте код тангенса в соответствии с запросом:
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, распечатав его на экране, он начинает нормально, но с течением времени он начинает удваивать себя при постоянно растущих значениях, он, вообще говоря, поддерживает импульс движения вперед, но из-за отсутствия лучшего термин заикается вперед, потом назад и т. д.
Спасибо за ответы на данный момент