为了账号安全,请及时绑定邮箱和手机立即绑定

如何实时运行 60 秒信号?

如何实时运行 60 秒信号?

C#
宝慕林4294392 2023-07-09 17:59:23
我正在 Unity 上进行肺部模拟。我有一个控制肺部物体的音量信号,采样时间为 60 秒。当我运行它时,它会在几秒钟内完成整个信号。但是,我需要实时模拟并运行整个 60 秒。我不想以慢动作运行它,因为它看起来不现实。private int i = 0;                  // initialize  iteratorvoid 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; }}
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

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


查看完整回答
反对 回复 2023-07-09
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

您当前的实现取决于帧速率,获得的 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();

}

查看完整回答
反对 回复 2023-07-09
  • 2 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信