如何实时运行 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;

 }

}


宝慕林4294392
浏览 128回答 2
2回答

吃鸡游戏

您将需要知道模拟的帧速率。如果 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);

慕码人8056858

您当前的实现取决于帧速率,获得的 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();}
打开App,查看更多内容
随时随地看视频慕课网APP