如何:反转范围(指数衰减)?

时间:2018-08-07 17:53:49

标签: c# math

我最近遇到一个场景,该场景需要根据两个对象(相机和目标)之间的距离将值缩放为大小。 original issue的原因是,相机在向x方向移动时会从位置y跳到位置target

  

我要放下那一部分,但是当我靠近正在查看的对象时,我的值太过跳动了。

最初的想法是根据相机与目标的接近程度来缩放变焦距离;这是为了防止摄影机穿过目标的网格(或DirectX 11中的顶点)。尽管更多的传统系统利用对撞机系统来防止这种情况,但这不是传统的系统,因此无法进行编码。原始的缩放代码非常简单:

float scale = 10000f;
if (delta < 0)
    while (target.Scale + (delta / scale) < 0)
        scale *= 10;
else
    while (target.Scale + (delta / scale) > 3)
        scale *= 10;

target.Scale += delta / scale;
target.World = Matrix.Scaling(target.Scale) * Matrix.Identity;

一些人对尝试的方法提出了一些好的观点,但是截至今天(2018年8月7日),该帖子仍没有有效的答案。因此,我放弃了所涉及的方法,而提出了一个可行的解决方案,但是方式却有所不同。

新问题 :堆栈溢出user的想法是,我应该尝试以下代码行:

Position += new Vector3(-1 * Math.Sign(e.Delta) * Math.Min(10000f, (Position.X - TargetPosition.X) / c, 0, 0));

c是一个大于或等于2的常数。这是一个绝妙的主意。这简化了原始代码并保持了缩放稳定(这不是降低数值的答案,而是一个开始)。

这以不同的方式介绍了相同的问题; 当摄像机接近目标时,我该如何降低摄像机速度。好吧,当我尝试使用c的值时,我注意到c越大,缩放速度就越慢。然后,我开始迷惑如何调整c的值。答案应主要涉及相机与目标之间的距离。但是这里的问题是,相机和目标之间的距离随着您的靠近而变小,而您与目标之间的距离越远。导致:

新问题 :如何采用3 - 1000之类的范围并将其以最简单的方式反转为{​​{1}}? / p>

1 个答案:

答案 0 :(得分:0)

在寻找答案时,我浏览了各个网络。最终,我准备放弃了,最终向我的一个朋友寻求帮助。一个小时后,他给我打回电话,谈论exponential decay。在他的解释中,他几乎引用了Wikipedia页面:

  

如果某个数量以其当前值proportional的速率减小,则该数量将经历指数衰减。

其背后的数学本质是:

c = m - ((m - 3) / 1 + Math.Exp(-10 * ((d - 100) / (r - 100))));

其中c是问题中所需的常数,m是范围的最大值,d是摄像机与目标之间的距离,而{{1} }是目标的半径。

在这一点上,实现非常简单;我删除了所有旧代码,并重新编写了这样的方法:

r

我要感谢所有其他Stack-Overflow用户的帮助,如果有人觉得他们可以解决原始问题,请随时尝试一下。另外,如果您觉得自己有更好的解决方案,请随时分享!