Я думаю, что здесь есть две возможные проблемы.
первый - накопление ошибок. Это происходит, когда на каждом кадре вы получаете с SD позицию для рук + небольшая ошибка (или шум). Мое решение для этого будет:
Когда вы обнаружите, что пользователь поднял руки, и вы готовы начать масштабирование, сохраните расстояние между стрелками и уровень масштабирования в этот момент (назовем их startDistance and startZoom
)
В каждом кадре рассчитывается новый уровень масштабирования на основе исходного значения, исходного расстояния руки и нового расстояния.
Вы могли бы сделать что-то вроде этого:
float newWidth = startWidth * currentDistance / startDistance;
float newHeight = startHeight * currentDistance / startDistance;
Это должно минимизировать накопление ошибок.
Вторая проблема заключается в улучшении плавности вашего зума и удалении любых шумов, которые вы можете получить из SDK. Это довольно просто. Вы можете попробовать интерполировать значения расстояния между текущим и предыдущим кадром. При необходимости вы можете попробовать интерполировать несколько кадров, если вы действительно получаете шумные значения.
Вы можете сделать что-то вроде этого:
float interpolatedDistance = (currentDistance + prevDistance) / 2;
float newWidth = startWidth * interpolatedDistance / startDistance;
float newHeight = startHeight * InterpolatedDistance / startDistance;
prevDistance = currentDistance;
Где currentDistance
- расстояние между руками в этом кадре, а prevDistance
- расстояние между руками в предыдущем кадре.
Скажите нам, если это помогло