如何实时运行 60 秒信号



我正在Unity上模拟肺部。我有一个控制我的肺物体的音量信号,采样时间为 60 秒。当我运行它时,它会在几秒钟内完成整个信号。但是,我需要实时模拟并运行整整 60 秒。我不想以慢动作运行它,因为它看起来不真实。

private int i = 0;                  // initialize  iterator
void Update()
{
 if (i < MainFlow.Length)
 {
  float f = (float)MainFlow[i];    // value of current volume
  float k = f + 2.5f;              // adding initial volume
  transform.localScale = new Vector3(k, k, k);
  i++;          
 }
 else
 {  
  i = 1;
 }
}

您需要知道模拟的帧速率。如果是 60 秒内 1500 个样本,那大概是 25Hz。然后,您可以对每帧的两个 MainFlow 值进行采样,并在它们之间进行插值以生成平滑输出。

像这样:

float frequency = 25.0f;
float simulationTime = Time.time * frequency;
int firstFrameIndex = Mathf.Clamp(Mathf.FloorToInt(simulationTime), 0, MainFlow.length);
int secondFrameIndex = Mathf.Clamp(firstFrameIndex + 1, 0, MainFlow.length);
float fraction = simulationTime - firstFrameIndex;
float sample1 = (float)MainFlow[firstFrameIndex];
float sample2 = (float)MainFlow[secondFrameIndex];
float k = Mathf.Lerp(sample1, sample2, fraction) + 2.5f;
transform.localScale = new Vector3(k, k, k);

您当前的实现取决于帧速率,获得的 fps 越多,模拟速度就越快。

相反,我会启动一个协程以获得更多控制。假设 MainFlow 包含 1200 个样本,总共 60 秒,这意味着采样率为 20 Hz(样本/秒(。因此,您应该每秒处理 20 个样本,换句话说,每 1/20 秒处理 1 个样本。

所以:

private float secondsPerSample;
private void Start()
{
    float sampleRate = MainFlow.Length / 60f;
    secondsPerSample = 1 / sampleRate;
    StartCoroutine(Process());
}
private IEnumerator Process()
{
    for (int i = 0; i < MainFlow.Length; i++)
    {
        float f = (float) MainFlow[i]; // value of current volume
        float k = f + 2.5f; // adding initial volume
        transform.localScale = new Vector3(k, k, k); i++;
        yield return new WaitForSeconds(secondsPerSample);
    }
    yield return Process();
}

编辑:我的答案将像采样一样运行模拟。如果你想插值它,eAi 的答案可能会帮助你。

最新更新