获得模拟游戏摩擦的曲线的方程式

时间:2014-12-10 11:17:51

标签: math 2d-games

我想从上到下的角度非常粗略地模拟粒子上的摩擦力。当颗粒变慢并且经历的摩擦力较小(相对于它们的速度)时,颗粒应该趋于停止,它们的运行速度越快。应该看起来像这样...... enter image description here

此时摩擦(每帧施加到粒子上的力)= - (速度*常数1 - 速度^ 2 *常数2)* deltatime

有人可以建议更好的方法吗?

2 个答案:

答案 0 :(得分:1)

常见摩擦

通常摩擦是由速度引起的,并且通过简单的模型建模,例如, - c v ^ 2.

这意味着如果你的粒子有吸引它们的力(例如重力),那么在某些时候,摩擦会使它平均,你的粒子达到最大恒定速度。

根据你的例子中的摩擦公式,它最终会减小甚至达到足够大的速度的正值,从而将粒子推向它们的速度方向,这有点奇怪。在任何情况下,摩擦力都不会随着速度单调增加而受到怀疑。

你所描述的行为通过说“相对于它们的速度经历更少的摩擦,它们的速度越快”,可以用数学方式表达,即你想要一个比身份快得多的功能。在形式上,您正在寻找一个函数f(x),以便f(x)/xx变为无穷大时向{0}收敛。

让我们把收敛到有限值(可能是0)的函数放在一边,因为它们看起来并不直观:你走的越快,你应该有越多的摩擦。

您可以使用的功能

发散得比x慢但仍然发散的函数通常是x的幂,其中度为0,1 [(0和1除外)。一个很好的例子是0.5,a.k.a是x的平方根。

此外,另一个很好的拟合是对数函数,它发散得很慢。

然后你可以采用上述的任何线性组合,甚至是日志的权力。

小速度的行为

现在在你的图表上,红线总是低于灰色线,这不是如上所述的函数x ^ a的情况。你可能想要x = 0的0,因为即使你的模型看到粒子转向并且当它达到速度0时也没有多大意义。为了符合这两个要求,你又有几个选择

  • 分段函数。琐碎,可能很容易计算。假设您在区间[1,+ inf [和0 = x = 0和1 ^ 0.83 = 1,在x = 1中,在区间[0,1 [。]上)使用x^0.83。通常像x本身一样微不足道。

  • 将函数移位,通常为1(这对我们所看到的所有情况都足够了)。对于日志来说,这非常简单,因为它在-inf中偏离0,并且是0 in 1,你应该从不使用log(x)而是log(1+x)。对于权力,它们表现得像我们想要的那样(“在红线下面”)对于x> 1.为了在x = 0时保持零摩擦的属性,你需要改变:f(x)=(1+x)^a-1和in in 0,1 [

根据您的口味定制

既然你拥有了所有这些,我建议你尝试绘制一些这些功能。选择一个看起来最合适的一个,通常可以通过选择对数(最慢)或任何幂函数来选择增加的速度(知道功率越大,摩擦相对于速度的增加越快)。您还可以通过扩展曲线来拉伸曲线以增加更快或更慢,但保持相同的“曲率”,即将x替换为x/aa * x。例如,使用x^0.8,您可以获得此功能:http://fooplot.com/plot/b7a0whkcdz

只有你知道什么样的力施加在粒子上(你应该比较函数的输出值,因此f(x)),以及粒子的典型速度(因此x你的函数应该具有可接受的值),所以我无法帮助你。

然后尝试使用您的游戏进行一些实验来调整您的参数,并且vo!你已经完成了。

答案 1 :(得分:0)

一些基本的物理方程式将对我们有所帮助。 假设我们只处理基本运动,没有外力,它应该是这样的(下面的计算是为了澄清最终的等式,你可以跳过这一部分):

Y轴力:正常(N)向上,重力(mg)向下 - > N = mg

X轴力:左侧(或右侧)的摩擦力,另一侧没有任何东西 - > -F(friction) = maF(friction) = N * μ(COF) - > F(friction) = mg * μ - > - mg * μ = ma - > a = - μ * g; v = v0 + at - > v = v0 - t(μ * g)


V - 物体在时间t = v(t)的速度[以m / s为单位测量]。

V0 - 物体的起始速度[以m / s为单位测量]。

t - 自开始运动以来经过的时间[以s为单位测量]。

μ - 摩擦系数,一个表示表面粗糙度的常数(0 - 完全没有摩擦力)[以NaN测量 - 没有COF单位]。

g - 重力加速度(常数)[以m / s ^ 2为单位测量],地球上为9.81 m / s ^ 2,但可以使用10.

假设μ为0.25(木材的COF),则等式为:

V(t) = v0 - 2.5t