源引擎-加速公式

Source engine - Acceleration formula

当我偶然发现以下函数时,我正在浏览 player movement code for the source engine

void CGameMovement::Accelerate( Vector& wishdir, float wishspeed, float accel )
    {
        int i;
        float addspeed, accelspeed, currentspeed;

        // This gets overridden because some games (CSPort) want to allow dead (observer) players
        // to be able to move around.
        if ( !CanAccelerate() )
            return;

        // See if we are changing direction a bit
        currentspeed = mv->m_vecVelocity.Dot(wishdir);

        // Reduce wishspeed by the amount of veer.
        addspeed = wishspeed - currentspeed;

        // If not going to add any speed, done.
        if (addspeed <= 0)
            return;

        // Determine amount of accleration.
        accelspeed = accel * gpGlobals->frametime * wishspeed * player->m_surfaceFriction;

        // Cap at addspeed
        if (accelspeed > addspeed)
            accelspeed = addspeed;
        
        // Adjust velocity.
        for (i=0 ; i<3 ; i++)
        {
            mv->m_vecVelocity[i] += accelspeed * wishdir[i];    
        }
    }

虽然我明白利用wishdir和wishspeed来计算速度增量的概念,但我不明白为什么他们在计算[=14=时使用wishspeedm_surfaceFriction ]:

accelspeed = accel * gpGlobals->frametime * wishspeed * player->m_surfaceFriction;

我认为它以某种方式补偿了由于摩擦引起的速度降低 that was calculated earlier,但是将这两个变量与 accel * gpGlobals->frametime 相乘似乎没有物理意义。

有人能解释一下这个计算背后的想法以及为什么这个额外的 wishspeed * player->m_surfaceFriction 因素应用于 accelspeed 吗?

我的解读

我认为作者让 wishspeed 只是作为 accel 的缩放器,所以 currentspeed 的速度达到 wishspeed 与 [=10] 的大小线性相关=],因此确保 currentspeed 达到 wishspeed 所需的时间对于不同的 wishspeed 大致相同,如果其他参数保持不变。

上面的原因是因为这可能会产生作者想要的角色运动的某种紧迫和放松的效果,即当我们希望角色的速度大(小)时,角色的加速度也大(小),无论是短跑还是慢跑,变速都可以在大致相同的时间内完成。

player->m_surfaceFriction更明显,作者只是想要一种简单的(线性)方式让表面摩擦值影响玩家的加速度。

一些建议

根据我自己的经验,在尝试理解游戏开发领域内与数学相关的机制时,尤其是物理或着色器,我们应该更多地关注最终效果或作者尝试的用户体验创建而不是公式的数学严谨性。

我们不应该让自己陷入这样的问题:这个公式是真的吗?或者这个公式有任何物理意义?

好吧,如果你看一下物理模拟引擎的任何源代码,你会发现大部分(如果不是全部)不使用现实生活中的公式,而是依靠一堆数学技巧来创建模仿我们对现实生活物理学的期望的最终效果。

例如,PBD 或 XPBD 是最广泛使用的布料或软体模拟算法之一,顾名思义,它是基于位置的动态算法,这意味着它们明确地修改粒子的位置,而不是像人们预期的那样以隐式方式修改粒子的位置在现实生活中(力影响速度然后影响位置),为什么我们使用这样的算法?因为它创造的视觉效果更符合我们的预期。