C#/ Unity-如何仅获取不同的值(带有阈值)和特定的计数?

时间:2018-12-18 13:50:51

标签: c# list unity3d distinct-values

我遇到以下问题:

我有一个在Unity中跟踪的对象的Vector3位置列表(例如,动画球体飞行了一些轨迹)。我将每一帧的位置添加到列表中。这导致例如500个值。动画停止播放后,我想“清理”记录的音轨,只保留最不同的值(按正确的顺序)。但是List.Count必须精确地为100。因此,它必须检查带有阈值的“相等”值。

到目前为止,我所做的是:我在每帧中将“ trackableObject”的位置记录为Vector3并直接对其进行清洁(仅保持比“ cleaningDiffTolerance”更远的值和/或具有更大的角度差,然后'cleaningAngleMaxDiff')。这样,我仅获得方向/距离的显着变化的值,并获得曲线/角的更多点。

我想要的是:不清洁每一帧,但在停止录制后进行清洁。然后,我只想按正确的顺序保留最不同的值,恰好保留100个值。

1 个答案:

答案 0 :(得分:1)

这取决于结果的精确度(以及定义“精确度”的方式)。 第一个问题是:

这100个值必须是第一个列表中的精确位置值,或者如果它附近就可以。

位置值在每一帧都不会改变很多。解决问题的一种简单方法是平均每一步:

  1. 计算必须将多少个值分组在一起:n = totalValues/100
  2. 采用前n个值并将平均值存储在最终列表中
  3. 对下一个n值执行相同的操作,依此类推

或者,如果您需要精确的值,请用例如“取组的第一个值”代替步骤2。

如果移动顺利,此方法将足够精确。 这样做的问题是,如果您的位置突然改变(例如角度而不是平滑的转弯),则可能无法获得该角度发生的确切位置。识别这些问题的唯一解决方案是进行一些更高级的分析。例如,您可以在Google上搜索“高通滤波器”。

我建议先尝试使用简单的方法,看看是否适合您的需求