基于时间的旋转毛刺运动

时间:2013-11-17 20:16:24

标签: c# xna camera rotation

我对XNA有点新鲜但知道足以开始制作3D游戏。我做得很好但是当我尝试添加播放器旋转时,出现了问题。由于旋转基于计时器构建到游戏中(gameTime.ElapsedGameTime.TotalSeconds),因此它总是在进行。如果我停下来,那么再次开始跳转到新点。我想要做的是让旋转从它停止的地方开始。任何解决方案都很受欢旋转代码如下。可根据要求提供其他代码。

    //Update view matrix
    view = Matrix.CreateLookAt(new Vector3(X - 10, Y - 10, Z - 10), new Vector3(lookAt.X, lookAt.Y, lookAt.Z), Vector3.UnitZ);
    //Update rotation variable
    rotation += (float)(gameTime.ElapsedGameTime.TotalSeconds);
    //Get input to determine whether or not to rotate
    if (key.IsKeyDown(Keys.Left)) lookAt.X = (float)(Math.Cos(rotation));
    if (key.IsKeyDown(Keys.Right)) lookAt.X = (float)(Math.Cos(-rotation));
    if (key.IsKeyDown(Keys.Left)) lookAt.Y = (float)(Math.Sin(rotation));
    if (key.IsKeyDown(Keys.Right)) lookAt.Y = (float)(Math.Sin(-rotation));

1 个答案:

答案 0 :(得分:2)

您的代码有效地创建了一个持续旋转的对象,需要6.28秒才能执行完整的旋转,然后设置相机的旋转以在按下左键时与其匹配,或者如果按下右键则设置相反的旋转。当两个键都没有按下时,玩家的角度不会改变,但无论如何都要更新旋转。

显然,您需要的是仅在按下其中一个键时更新旋转,并且旋转的变化应基于按下键。

// Update rotation
if (key.IsKeyDown(Keys.Left))
    rotation += (float)gameTime.ElapsedGameTime.TotalSeconds;
if (key.IsKeyDown(Keys.Right))
    rotation -= (float)gameTime.ElapsedGameTime.TotalSeconds;

// Calculate lookAt from rotation
lookAt.X = (float)Math.Cos(rotation);
lookAt.Y = (float)Math.Sin(rotation);

// Update view matrix
view = Matrix.CreateLookAt(new Vector3(X - 10, Y - 10, Z - 10), new Vector3(lookAt.X, lookAt.Y, lookAt.Z), Vector3.UnitZ);

ElapsedGameTime仍然很重要,因为它会根据自上次更新后的时间长短来确定您应该旋转多远。

此外,您在此处执行操作的顺序非常重要。如果您在计算新的viewrotation值之前更新lookAt矩阵,则您的视图将在一次更新后落后于游戏状态。在执行移动处理代码后更新view矩阵。