作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
比如我有一个水平跟随鼠标的对象,它的最小位置是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/
如何在 Phaser.P2.body 中应用摩擦力?在基于 Air-Hockey 移相器的游戏中。如何从曲棍球 table 上“关闭气流”?, 在这个例子中:http://jsfiddle.net/y
我是一名优秀的程序员,十分优秀!