【问题标题】:Reset model rotation when input stops输入停止时重置模型旋转
【发布时间】:2012-02-22 07:44:29
【问题描述】:

当玩家扫射时,我有代表玩家船逐渐倾斜的模型。例如,这是使船向右倾斜的代码:

在 Game 类的 Update() 中:

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

在 Ship 类的 Update() 中:

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

这就是我正在尝试做的事情,以使它在停止扫射时轻松摆脱精益:

在 Game 类的 Update() 中:

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

在 Ship 类的 Update() 中:

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

既然放宽到精益工作没有问题,我认为放宽精益将是一个简单的逆转过程的问题。但是,经过长时间的扫射后,它往往不会一直回到默认位置。如果您点击该键,它会一直弹回到-相反方向的完全倾斜状态。这根本不是我所期望的。我在这里错过了什么?

【问题讨论】:

    标签: c# 3d matrix xna


    【解决方案1】:

    我建议您将船舶的旋转表示为四元数。这样您就可以使用诸如slerp 之类的插值函数。只需使用第二个四元数来代表您的目标倾斜角度,船就会平稳旋转,直到达到目标角度。

    这是关于quaternions 的一个很好的教程。如果您想避免四元数,请使用 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 堆栈溢出,如果您有更多问题,请查看。

    【讨论】:

    • 为此,我最终稍微更改了 Ship 类中的 Update()(使用一圈进度变量而不是两个,并从 if 语句中取出轮换),但这效果更好比我原来的计划。谢谢!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多