我正在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 的答案可能会帮助你。