Трассировка в 3D с использованием класса Curve3D - Проблемы - PullRequest
1 голос
/ 24 марта 2011

В настоящее время я работаю над проектом, который включает в себя создание случайной дорожки (фиксированные приращения по оси 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, распечатав его на экране, он начинает нормально, но с течением времени он начинает удваивать себя при постоянно растущих значениях, он, вообще говоря, поддерживает импульс движения вперед, но из-за отсутствия лучшего термин заикается вперед, потом назад и т. д.

Спасибо за ответы на данный момент

1 Ответ

0 голосов
/ 24 марта 2011

Я предполагаю, что gameTime1.ElapsedGameTime.TotalMilliseconds - это истекшее время с момента последнего вызова UpdateMotionCube?

  1. Конечно, testCube.position = должно произойти после того, как вы обновили время движения?
  2. Проверьте ваши входные данные: распечатайте список точек и убедитесь, что они действительно прогрессируют.
  3. Проверьте свои входные данные: увеличивается ли игровое время в разумной степени?
  4. Распечатывается игровое время, время движения и полученные в результате точки, которые вы получаете, чтобы убедиться, что все происходит правильно вместе.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...