3

我目前正在尝试模拟一个物体的弹道学,否则它不受物理的影响。准确地说,我有一个类似火箭的弹丸,它沿着抛物线从起点到目标,带有 Lerp。为了让它更真实,我不希望它以恒定的速度移动,而是在达到高潮时减速并在返回的过程中加速。

我已经使用Mathf.Smoothstep函数来执行与我在其他对象上需要的完全相反的操作,即缓入和缓出运动。

所以我的问题是:如何获得倒置的 Smoothstep?

我发现我需要的实际上是平滑步长 [ x * x*(3 - 2*x) ] 的倒置公式,但不完全是数学天才,我不知道该怎么做。我从在线计算器中得到的只是一些相当庞大的新功能,恐怕不会很有效。

因此,也许有一个函数接近倒转平滑步,但计算起来并不复杂。

对此的任何帮助将不胜感激

提前致谢,

无尾礼服

4

4 回答 4

4

此处提供正确的公式: https ://www.shadertoy.com/view/MsSBRh

Inigo Quilez 和 TinyTexel 的解决方案

Flt SmoothCubeInv(Flt y)
{
   if(y<=0)return 0;
   if(y>=1)return 1;
   return 0.5f-Sin(asinf(1-2*y)/3);
}
于 2018-09-29T21:53:31.890 回答
3

我有一个类似的问题。对我来说,在 y = x 中镜像曲线是有效的:

在此处输入图像描述

所以一个实现示例是:

float Smooth(float x) {
    return x + (x - (x * x * (3.0f - 2.0f * x)));
}

此函数没有钳位,因此如果 x 可以超出 0 到 1 区间,则可能必须添加。

Wolfram Alpha 示例

于 2016-01-03T13:00:58.477 回答
1

如果您要移动变换,最好使用iTween或类似的动画库,而不是自己控制动画。他们有一个简单的 API,你也可以设置缓动模式

但是如果你需要它作为一个数学函数,你可以使用这样的东西:

y = 0.5 + (x > 0.5 ? 1 : -1) * Mathf.Pow(Mathf.Abs(2x - 1),p)/2

其中 p 是您想要的陡度度量。这是它的外观:

图形

于 2015-02-26T14:17:18.377 回答
0

你似乎想要一条规则的抛物线。看这个函数的图表:

http://www.wolframalpha.com/input/?i=-%28x%2A2-1%29%5E2%2B1

哪个图表似乎可以满足您的需求:-(x*2-1)^2+1

它从 y=0 到 y=1,然后又回到 x=0 和 x=1 之间,在 x=0.5 附近停留在顶部。如果我理解正确的话,这就是你想要的。

根据 wolfram alpha,编写此函数的其他方法是 -(4*(x-1)*x) 和 (4-4*x)*x

希望能帮助到你。

于 2015-02-26T13:32:14.157 回答