我对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));
答案 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
仍然很重要,因为它会根据自上次更新后的时间长短来确定您应该旋转多远。
此外,您在此处执行操作的顺序非常重要。如果您在计算新的view
和rotation
值之前更新lookAt
矩阵,则您的视图将在一次更新后落后于游戏状态。在执行移动处理代码后更新view
矩阵。