Guy*_*ito 14 math trigonometry
我写了一个小函数,当我放入一个介于0和1之间的浮点数时,它给出了一个基于正弦波的值.我正在使用它来渲染游戏中的东西.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好..但我想知道是否有一种改变正弦波的数学方法,所以我可以让它在中间"更陡"或"更浅"?在下图中,蓝色曲线是正弦波,我想知道我是否可以使它更像绿线.

您所展示的内容并非真正正弦 - 正弦范围介于-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)
Run Code Online (Sandbox Code Playgroud)
参数p应该被赋予介于0.0和9.0之间的值.如果它是1.0,则g(x)是标识函数(输出是未修改的输入).如果值介于0.0和1.0之间,则会使您的正弦波"变胖"(将其从0.0推向1.0或-1.0),这正是您所需要的.
我曾经"设计"了这个函数,作为获得"分形波形"的一种方法.使用p介于1.0和9.0之间(特别是介于3.0和6.0之间)的值,该公式的迭代应用是混乱的.我从RM May的人口波动建模混沌函数中偷走了这个想法,但这是一个二次方 - 我想要一些对称的东西,所以我需要一个三次函数.这里并不是真正相关,而是一个非常令人敬畏的想法.虽然你肯定会得到混乱的波形,但这实际上意味着存在巨大的问题 - 改变采样率并且你得到一个非常不同的声音.尽管如此,如果没有迭代,也许这会给你所需要的东西.
如果迭代次数足够多,p在0.0和1.0之间,则最终得到一个带有略圆角的方波.
很可能你只需选择0.0到1.0之间的p值,应用该函数一次,然后应用你的函数来改变范围,你就会得到你想要的.
顺便说一句,已经有一条评论暗示了"缓和功能"的备忘单."Easing"是来自动画的术语,计算机动画软件通常使用Bezier曲线来实现此目的 - 矢量图形软件经常使用的Bezier曲线.贝塞尔曲线有二次和三次变量,立方体更常见.所以这样做可能并没有那么不同.然而,立方贝塞尔缓动为您提供了更多控制 - 您可以独立于"缓出"控制"缓入",其中我的函数仅提供一个参数.
您可以将y(x) = 1-(1-x)^n函数 whenx = [0..1]用作变换函数。
您只需用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) );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4066 次 |
| 最近记录: |