Floating point 阻尼的作用是什么?

Floating point 阻尼的作用是什么?,floating-point,game-engine,physics,game-development,Floating Point,Game Engine,Physics,Game Development,考虑以下语句,以更新游戏中集成过程中物理对象的速度: velocity = velocity * 0.999f + acceleration; 将速度乘以略小于1的值称为“阻尼”,而0.999f为“阻尼系数”。有人说,阻尼是必要的,以消除过剩的能量所造成的数值不稳定 我不明白。我还可以使用1.001f作为“阻尼系数”,并声称这是为了增加数值不稳定性导致的缺失能量(而不是超过能量): velocity = velocity * 1.001f + acceleration; 对吧??我错过了什么

考虑以下语句,以更新游戏中集成过程中物理对象的速度:

velocity = velocity * 0.999f + acceleration;
将速度乘以略小于1的值称为“阻尼”,而
0.999f
为“阻尼系数”。有人说,阻尼是必要的,以消除过剩的能量所造成的数值不稳定

我不明白。我还可以使用
1.001f
作为“阻尼系数”,并声称这是为了增加数值不稳定性导致的缺失能量(而不是超过能量):

velocity = velocity * 1.001f + acceleration;
对吧??我错过了什么


我不是在说阻力,是吗?好吧,毕竟,阻力系数
0.999f
是移除一个与速度成比例的部分。阻尼仅仅是一种阻力吗?

如果使用
*1.001f
方法,物体会倾向于人为加速。事实上,他们很快就会离开你的游戏世界,可能是因为他们以极快的速度移动


另一方面,
*0.999f
方法不会导致如此明显/怪异的行为,因为玩家的大脑可以很容易地将其解释为“阻力”(如果他们注意到的话)。

改变知识来源,因为作者显然对物理模拟领域的知识不多

看起来有些人使用了不节约系统总能量的方法。作者不理解这个问题,用“欺骗”作为邪恶的黑客手段

正确的解决方案是使用不同的算法。最简单的方法是(像欧拉法一样简单)。另一种替代方法也很容易理解

还有其他更复杂的算法来模拟物理

你怎么了?在这种近似情况下,每一步都会引入一个系统误差。在每个步骤中,系统都会获得一点能量。误差不是计算精度有限的结果,但问题是算法如何工作。更改时间步长可以减少此问题,但速度不够快。经典的例子是行星轨道的模拟,在这个算法中,行星轨道不是椭圆的(应该是椭圆的),而是螺旋形的,每个轨道都会使行星远离太阳

如果对补救措施进行了描述,据说阻尼对于消除数值不稳定性引起的多余能量是必要的。对我来说,这清楚地表明,作者不知道还有其他数值复杂度相同的算法,但没有这个弱点。在这里增加阻力是一种欺骗

现在,如果你正在实施一个物理游戏,这个“欺骗”是无害的。如果您正在模拟某个物理过程,那么这是最糟糕的方法,可能会产生错误的结果


在替代算法中,误差不是系统性的,系统保存总能量。

阻尼系数0.999f或
阻尼
是平滑计算速度的
α


OP有

考虑以下语句,以更新游戏中集成过程中物理对象的速度:

velocity = velocity * 0.999f + acceleration;

我错过了什么

缺少的是隐含的时间尺度下降了1/1000

//         old velocity         new velocity
//         v------v             v------------v 
velocity = velocity * 0.999f  + acceleration*t*0.001;
//                    factor1                  factor2, their sum is 1.0
t*0.001
1.0
,并且在更新期间以及用于表示
加速度
速度
的单位中肯定已经考虑在内


另一种方法是使用实单位,让编译器看到
*(mm\u到\um*更新\u周期*阻尼)
按1缩放,并将发出可信的高效代码

double acceleration; // mm/s/s
double velocity;     // m/s
#define UPDATE_PERIOD (1.0 /* seconds */)
#define DAMPING 0.001
#define mm_to_m 1000.0

velocity = velocity * (1.0 - DAMPING) + acceleration * (mm_to_m * UPDATE_PERIOD * DAMPING);

你说的“拉格朗日算法”是指前向欧拉法吗?@Sneftel你说得对,我这边的记忆很差。修正了。最好是对新能量进行下射,这样系统的总能量就会向零漂移,而不是无限大。