2014-02-27 146 views
12

我写了一个小函数,当我在0和1之间放置一个浮点数时,它给了我一个基于正弦波的值。我在游戏中将它用于lerp使正弦波更陡峭?

public static class Utilities 
{ 
    public static float SineMe(float prop) 
    { 
     float output = (prop*180f)-90f; 

     output = Mathf.Sin(output*Mathf.Deg2Rad); 

     output = (output+1f)/2f; 

     return output; 
    } 
} 

它工作得很好。但我不知道是否有改变正弦波的数学方法,所以我可以在中间,使其“更陡”或“浅”? 在下图中,蓝色曲线是正弦波,我想知道是否可以使它更像绿线。

enter image description here

+1

你说你想要的东西更像是'Y =((2 *的sin(x))^ 2)/ 4'不同于'Y = SIN(X)'? –

+4

您可能对[缓动函数备忘单](http://easings.net/)感兴趣,它可以帮助您找到令人满意的陡峭曲线。然后,您可以查找该曲线的来源[here](http://www.robertpenner.com/easing/)。 – Kevin

+0

任何切线/切线都可以。 – moonwave99

回答

6

什么你已经显示是不是真的正弦 - 正弦波的范围是-1和+1之间。您正在应用线性函数f(x) = (x+1)/2来更改该范围。所以在另一个功能之间正弦和那个变换。

要更改形状,您需要一个非线性函数。所以,这里的三次方程,你可以尝试...

g(x) = Ax^3 + Bx^2 + Cx + D 

D = 0 
C = p 
B = 3 - 3C 
A = 1 - (B + C) 

参数p应给予0.0和9.0之间的值。如果它是1.0,g(x)是标识函数(输出是未修改的输入)。值在0.0到1.0之间时,它会倾向于“增加”正弦波(将其从0.0推到1.0或-1.0),这正是您所需要的。

我曾经“设计”这个函数来获得“分形波形”。在1.0和9.0之间(特别是在3.0和6.0之间)使用p的值,这个公式的迭代应用是混乱的。我从R.M.Mai的人口变动建模混沌函数中偷了这个想法,但这是一个二次方 - 我想要对称的东西,所以我需要一个三次函数。这里并没有真正的相关性,并且在发生时有一个相当可笑的想法。虽然你当然会得到混沌波形,但是真正意义上的混淆是很大的问题 - 改变采样率并获得非常不同的声音。不过,没有迭代,也许这会给你你所需要的。

如果迭代次数足够多,p值介于0.0和1.0之间,则最终会产生一个方角波,并带有稍微圆角。

最有可能你只能选择一个介于0.0和1.0之间的p值,应用该函数一次,然后然后应用你的函数来改变范围,你会得到你想要的。

顺便说一句,已经有一条评论提示“缓动功能”的备忘单。 “缓动”是动画术语,计算机动画软件通常使用贝塞尔曲线来实现这一目的 - 即矢量图形软件经常使用的相同贝塞尔曲线。贝塞尔曲线具有二次和立方变体,立方体更常见。所以这样做可能没有那么不同。然而,立方贝塞尔宽松给你更多的控制 - 你可以独立于“缓出”来控制“缓入”,而我的功能只提供一个参数。

4

x = [0..1]作为变换函数时,可以使用y(x) = 1-(1-x)^n函数。

您只需将x替换为您的sinus的绝对值,并将sinus的符号报告给结果。通过这种方式,您可以通过增加n来调整窦道斜率。所以,你要的是这样的:

float sinus = Mathf.Sin(output*Mathf.Deg2Rad); 
int sign = (sinus >= 0 ? 1 : -1); 

int n = 4; // slope parameter 

float waveform = sign * (1-Mathf.Pow(1-Mathf.Abs(sinus), n));