Иногда, когда частота опроса мыши и частота обновления экрана не имеют хорошего отношения, обновление дисплея в зависимости от положения мыши может привести к отрывистому эффекту.
У вас есть вертикальная синхронизация, правильно? И если вы повернете его, движение мыши станет более плавным за счет разрыва?
Одним из вариантов является использование функции сглаживания, что «лаги» значения, которые вы используете для позиции мыши только чуть-чуть позади позиции реальной мыши
Суть его выглядит следующим образом:
float use_x,use_y; // position to use for displaying
float springiness = 50; // tweak to taste.
void smooth_mouse(float time_d,float realx,float realy) {
double d = 1-exp(log(0.5)*springiness*time_d);
use_x += (realx-use_x)*d;
use_y += (realy-use_y)*d;
}
Это функция exponential decay. Вы называете это каждый кадр, чтобы установить, что использовать для позиции мыши. Трюк получает правильное значение для springiness
. Чтобы быть педантичным, springiness
- это количество раз, когда расстояние между реальным положением мыши и используемым положением сокращается вдвое. Для сглаживания движения мыши хорошее значение для springiness
составляет, вероятно, 50-100.
time_d
- это промежуток времени с момента последнего опроса мыши. Передайте ему дельта реального времени (в дробных секундах), если сможете, но вы можете уйти, просто пройдя его 1.0/fps
.
Если у вас есть браузер с поддержкой WebGL, вы можете увидеть живую версию here - найдите класс под названием GLDraggable
в viewer.js
.
Что такое «негладкий» об этом? Можете ли вы объяснить проблему более подробно? –
Похоже, что FPS недостаточно, но на самом деле частота кадров равна 60. Аналогичный эффект вы можете получить без использования массива типа bool для ключей буфера при выполнении некоторых действий непосредственно в glutKeyboardFunc – user1052836