使用Curve3D类在3D中进行路径 - 问题

时间:2011-03-24 12:57:59

标签: c# xna-4.0 pathing

我目前正在开发一个涉及生成随机轨道的项目(Z轴上的固定增量和随机化的X和Y以创建颠簸/弯曲的轨道)我使用Catmull Rom插值实现了轨道,该插值按预期工作。这会生成9800个点,然后存储在2d数组中。

我的主要问题是我现在正试图沿着轨道路径一个物体(用于相机使用以及后来的化身)。我目前正按照msdn帮助使用Curve3D类 http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.curve.aspx我有一个函数,它根据值时间和带有catmull结果的数组来分配“testCube”的位置。

现在问题;我的立方体路径在广义上沿着轨道向下,然而随着轨道的进展,它似乎以越来越频率向后和向前跳跃。我已经删除了任何其他代码作为干扰它的可能性。

我目前正在使用:

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 post和pre循环的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已经在屏幕上打印出来它开始没问题,但随着时间的推移,它开始以不断增加的价值重新回到自身,它保持前进动力一般来说但是为了更好这个术语是前锋然后倒退等等。

感谢您迄今为止的回复

1 个答案:

答案 0 :(得分:0)

我猜gameTime1.ElapsedGameTime.TotalMilliseconds是自上次调用UpdateMotionCube以来经过的时间?

  1. 当您更新动作时间后,肯定会发生testCube.position =吗?
  2. 检查您的输入:打印出您的积分列表,并确保它们确实取得了进展。
  3. 检查你的输入:游戏时间是否合理增加?
  4. 打印出您检索的游戏时间,动作时间和结果点,以确保一起发生的事情。