Рассматривайте ваши входные значения (эти положения прыжка) как сигнал с низкими и высокочастотными частями.Низкие частоты представляют грубое положение / движение, в то время как высокочастотные части содержат быстрый прыжок на меньшие расстояния.
Так что вам нужно или искать, это фильтр низких частот.Это отфильтровывает высокочастотные части и оставляет грубое (но настолько точное, насколько Kinect может получить) положение, если вам удастся установить его с правильным параметром.Этот параметр является частотой кроссовера для фильтра.Вам нужно немного поиграться, и вы увидите.
Пример реализации для дискретных по времени значений будет от здесь (первоначально wikipedia ):
static final float ALPHA = 0.15f;
protected float[] lowPass( float[] input, float[] output ) {
if ( output == null ) return input;
for ( int i=0; i<input.length; i++ ) {
output[i] = output[i] + ALPHA * (input[i] - output[i]);
}
return output;
}
Вы можете поместить в эту функцию последние значения обоих компонентов X и Y ваших векторов положения, чтобы сгладить их (input[0]
для X и input[1]
для Y, output[0]
и output[1]
являются результатами предыдущего вызова функции).
Как я уже сказал, вы должны найти хороший баланс для коэффициента сглаживания ALPHA
(0 ≤ ALPHA ≤ 1) :
- Слишком большой, и сигнал не будет достаточно сглаженным, эффект будет недостаточным
- Слишком маленький и сигнал будет сглажен «слишком сильно», курсор будет отставать от пользователейдвижение, слишком большая инерция
(Если вы посмотрите на формулу newout = out + alpha * (in - out)
, вы увидите, что при альфа-значении 0 вы просто снова берете старое значение out
, поэтому значение будетникогда не меняются, хотя со значением 1 у вас есть newout = out + in - out
, что месли вы ничего не сглаживаете, но всегда принимаете самое новое значение)