gpt4 book ai didi

algorithm - 带摩擦力的运动算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:37:24 24 4
gpt4 key购买 nike

比如我有一个水平跟随鼠标的对象,它的最小位置是100,最大是200。

在此范围内,它线性跟随鼠标,即1个鼠标位置等于1个对象位置。

现在,如果鼠标超出范围(低于 100 或高于 200),我希望它开始施加摩擦力,以便对象在距离范围越远时优雅地停止,例如:

Mouse position  | Object position
200 200
220 205
240 209
260 212
280 215
300 217
320 218
340 219
360 220
380 220
400 220
...

我设法在鼠标移动处理程序中像这样实现它:

if (mousePosition > 200 || mousePosition < 100) {
delta = mousePosition - objectPosition;
objectPosition += delta * 0.25; // 0.25 if friction factor
}

但是有没有更好的办法呢?如何在鼠标移动处理程序之外实现功能:

getObjectPosition(mousePosition) {
return // ???
}

问题与语言无关。

最佳答案

您可以将对象位置计算为鼠标位置的分段函数:

getObjectPosition(mousePosition) {
if(mousePosition < 100)
return 100 - friction(100 - mousePosition);
if(mousePosition > 200)
return 200 + friction(mousePosition - 200);
return mousePosition;
}

其中 friction 是计算您想要的“软”功能的函数。一个简单的方法是:

friction(x) {
return 0.25*x;
}

当物体超出 [100, 200] 范围时,它会将物体速度降低 0.25。不过,您的功能似乎接近某种渐近线。例如,您可以使用二次函数来实现它:

friction(x) {
M = 160;
x = min(x, M);
return x*(1 - x/(2*M));
}

此处物体会逐渐减速,当鼠标在[-60, 360]区间外时完全停止。

关于algorithm - 带摩擦力的运动算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55683604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com