1

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

我的主要问题是我现在正试图沿着轨道移动一个对象(用于相机使用,然后是一个化身跟随)。我目前正在使用根据 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 没有沿着轨道直线前进而不是朝着正确的方向前进而是前后弹跳的任何建议将不胜感激。顺便说一句,两个向量数组的值都是正确的,因为我已经检查过它们(并且轨道本身绘制正确),我还在曲线类中使用 CurveX.postloop.CurveLoopType.Linear 用于所有 xyz 后循环和前循环。

谢谢

编辑:根据要求设置切线代码:

 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 已将其打印在屏幕上,它开始正常,但随着时间的推移,它开始以不断增加的值加倍自身,一般来说,它保持前进的势头,但需要更好的术语它向前口吃然后向后等。

感谢您迄今为止的回复

4

1 回答 1

0

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

  1. 当然testCube.position =应该在您更新运动时间之后发生?
  2. 检查您的输入:打印您的积分列表并确保它们确实取得了进展。
  3. 检查您的输入:游戏时间是否以合理的方式增加?
  4. 打印出您检索到的游戏时间、运动时间和结果点,以确保所有事情一起正确发生。
于 2011-03-24T13:06:30.847 回答