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

C#/Unity - How to get only Distinct values (with threshold) and a specific count?

我有以下问题:

我有一个我在 Unity 中跟踪的对象的 Vector3 位置列表(例如,一个动画球体在某些轨道上飞行)。我将每一帧的位置添加到列表中。这导致总和例如500 个值。当它的动画停止时,我想 "clean" 记录的轨道并且只保留最不同的值(以正确的顺序)。但是 List.Count 必须正好是 100。因此它必须使用阈值检查 "equal" 值。

到目前为止我做了什么:我在每一帧中将 "trackableObject" 的位置记录为 Vector3 并直接清理它(只保留比 'cleaningDiffTolerance' [=23 更远的值=] 的角度差比 'cleaningAngleMaxDiff') 大。通过这种方式,我只获得 direction/distance 中显着变化的值,并在 curves/corners.

中获得更多分数

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

这取决于您的结果需要多精确(以及您如何定义 'precise')。 第一个问题是:

这 100 个值必须是第一个列表中的准确位置值,或者接近就可以了。

位置值不会在每一帧发生太大变化。解决问题的一个简单方法是对每一步求平均:

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

或者,如果您需要精确值,请将第 2 步替换为 "take first value of the groupe"。

如果移动顺畅,这种方法就足够精确了。 这样做的问题是,如果你有一个突然的位置变化(比如一个角度而不是一个平滑的转弯),你可能无法获得角度发生的确切位置。识别这些的唯一解决方案是进行一些更高级的分析。例如,您可以在 google 上搜索 "High Pass Filter"。

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