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你说得对,我这边的记忆很差。修正了。最好是对新能量进行下射,这样系统的总能量就会向零漂移,而不是无限大。