如何减慢正弦波的速度?

时间:2016-06-23 22:25:01

标签: unity3d sine

我想编制一个弹跳球。实际反弹不应遵循真实的物理定律,而应建立绝对的正弦波。就像在这张图片中一样

enter image description here

到目前为止,这很容易。请参阅附带的代码。

但是我想按一下按钮就会减慢球的移动速度。

我将降低移动速度,这将减慢x轴上的变换。但球仍然快速上下跳动,因为正弦波的频率和幅度都没有改变。但是当我改变其中一个或两个时,这将以一种奇怪的行为结束。

想象一下,球从下到上移动距离从上到下的20%。当我现在改变任何正弦参数时,球会立即在y轴上移动,看起来很奇怪而且不光滑。

所以我的实际问题是:如何在没有波动的情况下减慢绝对正弦波(x / y轴平移)?

float _movementSpeed = 10.0f;
float _sineFrequency = 5.0f;
float _sineMagnitude = 2.5f;

Vector3 _axis;
Vector3 _direction;
Vector3 _position;

void Awake()
{
    _position = transform.position;
    _axis = transform.up;
    _direction = transform.right;
}

void Update()
{
    _position += _direction * Time.deltaTime * _movementSpeed;
    // Time.time is the time since the start of the game
    transform.position = _position + _axis * Mathf.Abs(Mathf.Sin(Time.time * _sineFrequency)) * _sineMagnitude;
}

1 个答案:

答案 0 :(得分:0)

我想你想要这个(更红 - 更低的频率,更蓝 - 更高):

A graph of a sine wave in time with changing frequency 实现此目的的最简单方法是缩放deltatime,例如,这是通过以下方式生成的:

using UnityEngine;
using System.Collections;

public class Bounce : MonoBehaviour {

    // for visualisation of results
    public Graph graph;

    [Range(0, 10)]
    public float frequency = 1;

    float t;

    void Update()
    {
        t += Time.deltaTime * frequency;

        float y = Mathf.Abs(Mathf.Sin(t));
        float time = Time.realtimeSinceStartup;

        graph.AddPoint(time, y, Color.Lerp(Color.red, Color.blue, frequency/10));
    }

}

为了完整性,Graph类:

using UnityEngine;
using System.Collections.Generic;

public class Graph : MonoBehaviour {

    struct PosAndColor
    {
        public Vector3 pos;
        public Color color;
    }


    List<PosAndColor> values=new List<PosAndColor>();


    public void AddPoint(float x, float y, Color c)
    {
        values.Add(new PosAndColor() { pos = new Vector3(x, y, 0), color = c });
    }


    void OnDrawGizmos()
    {
        for (int i = 1; i < values.Count; i++)
        {
            Gizmos.color = values[i - 1].color;
            Gizmos.DrawLine(values[i - 1].pos, values[i].pos);
        }
    }

}

另一种方法是使用正弦偏移来改变频率以匹配当前幅度。我不认为你在这里需要这个,但如果你愿意我可以发表更多关于这个主题的内容。