我想从上到下的角度非常粗略地模拟粒子上的摩擦力。当颗粒变慢并且经历的摩擦力较小(相对于它们的速度)时,颗粒应该趋于停止,它们的运行速度越快。应该看起来像这样......
此时摩擦(每帧施加到粒子上的力)= - (速度*常数1 - 速度^ 2 *常数2)* deltatime
有人可以建议更好的方法吗?
答案 0 :(得分:1)
通常摩擦是由速度引起的,并且通过简单的模型建模,例如, - c v ^ 2.
这意味着如果你的粒子有吸引它们的力(例如重力),那么在某些时候,摩擦会使它平均,你的粒子达到最大恒定速度。
根据你的例子中的摩擦公式,它最终会减小甚至达到足够大的速度的正值,从而将粒子推向它们的速度方向,这有点奇怪。在任何情况下,摩擦力都不会随着速度单调增加而受到怀疑。
你所描述的行为通过说“相对于它们的速度经历更少的摩擦,它们的速度越快”,可以用数学方式表达,即你想要一个比身份快得多的功能。在形式上,您正在寻找一个函数f(x)
,以便f(x)/x
在x
变为无穷大时向{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/a
或a * x
。例如,使用x^0.8
,您可以获得此功能:http://fooplot.com/plot/b7a0whkcdz
只有你知道什么样的力施加在粒子上(你应该比较函数的输出值,因此f(x)
),以及粒子的典型速度(因此x
你的函数应该具有可接受的值),所以我无法帮助你。
然后尝试使用您的游戏进行一些实验来调整您的参数,并且vo!你已经完成了。
答案 1 :(得分:0)
一些基本的物理方程式将对我们有所帮助。 假设我们只处理基本运动,没有外力,它应该是这样的(下面的计算是为了澄清最终的等式,你可以跳过这一部分):
Y轴力:正常(N)向上,重力(mg)向下 - > N = mg
X轴力:左侧(或右侧)的摩擦力,另一侧没有任何东西 - > -F(friction) = ma
,F(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