我目前正在尝试模拟物体上的弹道学,否则不受物理影响。确切地说,我有一个类似火箭的抛射物,它是一个抛物线弧,从原点到目标有一个Lerp。为了使它更加逼真,我希望它不要以恒定的速度移动,而是要放慢速度,然后加速回升。
我已经使用Mathf.Smoothstep函数与我在其他对象上所需的完全相反,即放松和移出运动。
所以我的问题是:如何获得反转的Smoothstep?
我发现我所需要的实际上是平滑步骤的反转公式[x * x *(3 - 2 * x)],但不完全是数学天才,我不知道该怎么做。我从在线计算器得到的只是一些非常庞大的新功能,我担心它不会很有效。
所以也许有一个函数接近于反转的平滑步,但是计算起来并不复杂。
对此的任何帮助都将非常感激
提前致谢,
的Tux
答案 0 :(得分:2)
我有类似的问题。对我来说,镜像y = x的曲线工作:
所以一个实现示例是:
float Smooth(float x) {
return x + (x - (x * x * (3.0f - 2.0f * x)));
}
此函数没有钳位,因此如果x可以超出0到1的间隔,则可能必须添加。
答案 1 :(得分:1)
如果您正在移动变换,通常最好使用iTween或类似的动画库,而不是自己控制动画。他们有一个简单的API,您也可以设置easing mode。
但是如果你需要这个作为数学函数,你可以使用这样的东西:
y = 0.5 + (x > 0.5 ? 1 : -1) * Mathf.Pow(Mathf.Abs(2x - 1),p)/2
其中p是您想要的陡度的度量。这是它的外观:
答案 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);
}