输入停止时重置模型旋转

本文关键字:模型 旋转 输入 | 更新日期: 2023-09-27 18:25:19

我有一个模型,表示当玩家扫射时,玩家的飞船逐渐倾斜。例如,以下是向右倾斜的代码:

在游戏类的Update()中:

if (ship.rightTurnProgress < 1 && (currentKeyState.IsKeyDown(Keys.D)))
{
    ship.rightTurnProgress += (float)gameTime.ElapsedGameTime.TotalSeconds * 30;
}

在船舶类别的Update()中:

if (currentKeyState.IsKeyDown(Keys.D))
{
   Velocity += Vector3.Right * VelocityScale * 10.0f;
   RotationMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) * 
     Matrix.CreateRotationY(0.4f * rightTurnProgress);
}

这就是我试图做的,当它停止扫射时,让它轻松地回到倾斜状态:

在游戏类的Update()中:

if (ship.rightTurnProgress > 0 && currentKeyState.IsKeyUp(Keys.D))
{
    ship.rightTurnProgress -= (float)gameTime.ElapsedGameTime.TotalSeconds * 30;
}

在船舶类别的Update()中:

if (currentKeyState.IsKeyUp(Keys.D) && rightTurnProgress > 0)
{
    RotationMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) *
      Matrix.CreateRotationY(-0.4f * rightTurnProgress);
}

由于缓和到精益是没有问题的,我认为缓和到精益只是一个简单的逆转过程。然而,在经历了长时间的扫射后,它往往不会一直回到默认位置。如果你敲击按键,它会一直弹回到相反方向的完全倾斜。这根本不是我所期望的。我在这里错过了什么?

输入停止时重置模型旋转

我建议您将船的旋转表示为四元数。这样你就可以使用插值函数,比如slerp。只需有一个第二个四元数,表示你的目标倾斜角度,飞船将顺利旋转,直到达到目标角度。

这里有一个关于四元数的好教程。如果您想避免四元数,请使用MathHelper。Lerp以从当前值平稳过渡到目标值。

if (currentKeyState.IsKeyDown(Keys.D))
{
    ship.TurnProgress = MathHelper.Lerp(ship.TurnProgress, 1, somefloat * timeDelta);
}
else if (currentKeyState.IsKeyDown(Keys.a))
{
    ship.TurnProgress = MathHelper.Lerp(ship.TurnProgress, -1, somefloat * timeDelta);
}
else  (currentKeyState.IsKeyDown(Keys.D))
{
    ship.TurnProgress = MathHelper.Lerp(ship.TurnProgress, 0, somefloat * timeDelta);
}

编辑:还有一个GameDev堆栈溢出,所以如果你有更多问题,请查看它。

除非你知道转弯有多长,或者你有某种加速度向量,否则你必须等到转弯停止后才能将精灵角度恢复到中性,那么当玩家在精灵到达中性位置之前左转时会发生什么?我假设当你使用RightTurnProgress右转时,你也有一个LeftTurnProgress。我建议你把它们组合成一个变量,以保持它的平滑,避免你得到的捕捉效果。

您正在创建一个"绝对"旋转矩阵,因此不需要将符号翻转到-0.4f。为什么不使用一个名为ship.lean的变量,并在每次更新时计算旋转矩阵呢。然后,您只需要逻辑将ship.lean设置在-1(左倾)和1(右倾)之间,或者0表示无倾。