倒立平滑步?

时间:2015-02-26 10:55:54

标签: function unity3d

我目前正在尝试模拟物体上的弹道学,否则不受物理影响。确切地说,我有一个类似火箭的抛射物,它是一个抛物线弧,从原点到目标有一个Lerp。为了使它更加逼真,我希望它不要以恒定的速度移动,而是要放慢速度,然后加速回升。

我已经使用Mathf.Smoothstep函数与我在其他对象上所需的完全相反,即放松和移出运动。

所以我的问题是:如何获得反转的Smoothstep?

我发现我所需要的实际上是平滑步骤的反转公式[x * x *(3 - 2 * x)],但不完全是数学天才,我不知道该怎么做。我从在线计算器得到的只是一些非常庞大的新功能,我担心它不会很有效。

所以也许有一个函数接近于反转的平滑步,但是计算起来并不复杂。

对此的任何帮助都将非常感激

提前致谢,

的Tux

4 个答案:

答案 0 :(得分:2)

我有类似的问题。对我来说,镜像y = x的曲线工作:

enter image description here

所以一个实现示例是:

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

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

Wolfram Alpha example

答案 1 :(得分:1)

如果您正在移动变换,通常最好使用iTween或类似的动画库,而不是自己控制动画。他们有一个简单的API,您也可以设置easing mode

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

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

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

graph

答案 2 :(得分: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

希望它有所帮助。

答案 3 :(得分:0)

此处提供正确的公式: 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);
}