2012-04-18 1 views
1

Когда я поворачиваю свою fps-камеру с помощью мыши, анимация негладкая. Когда я использую клавиатуру, все работает хорошо. Для клавиатуры я использую массив типа bool для ключей буфера. Что я могу сделать, чтобы сделать анимацию гладкой при использовании мыши?freeglut - плавное вращение камеры с помощью мыши

void MousePassiveMotion(int x, int y) 
{ 
    int centerX = glutGet(GLUT_WINDOW_WIDTH)/2; 
    int centerY = glutGet(GLUT_WINDOW_HEIGHT)/2; 

    int deltaX = x - centerX; 
    int deltaY = y - centerY; 

    if(deltaX != 0 || deltaY != 0) 
    { 
      heading = deltaX * 0.2f; 
      pitch = deltaY * 0.2f; 
      glutWarpPointer(centerX, centerY); 
    } 
} 
+0

Что такое «негладкий» об этом? Можете ли вы объяснить проблему более подробно? –

+0

Похоже, что FPS недостаточно, но на самом деле частота кадров равна 60. Аналогичный эффект вы можете получить без использования массива типа bool для ключей буфера при выполнении некоторых действий непосредственно в glutKeyboardFunc – user1052836

ответ

0

Вы должны использовать что-то вроде этого, а не где углы камеры рассчитываются с последней позиции мыши вместо центральной точки экрана.

void mouseMove(int x, int y) 
{ 
    theta += (lastx-x)/100.0; 
    phi += (lasty-y)/50.0; 
    lastx = x; 
    lasty = y; 

    if (phi >= M_PI) 
     phi = M_PI - 0.001; 
    else if (phi <= 0) 
     phi = 0.001; 
} 

Здесь 100,0 и 50,0 факторы, которые влияют на скорость движения (чувствительность) и если/другое заявление ограничивает движение определенного угла.

+0

Мне нужно сохранить курсор в середине экрана, потому что я реализовал fps-камеру. Более того, я не понимаю, каковы преимущества вашего решения. – user1052836

1

Иногда, когда частота опроса мыши и частота обновления экрана не имеют хорошего отношения, обновление дисплея в зависимости от положения мыши может привести к отрывистому эффекту.

У вас есть вертикальная синхронизация, правильно? И если вы повернете его, движение мыши станет более плавным за счет разрыва?

Одним из вариантов является использование функции сглаживания, что «лаги» значения, которые вы используете для позиции мыши только чуть-чуть позади позиции реальной мыши

Суть его выглядит следующим образом:

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.

+0

Да. Отключение vsync не влияет на гладкость. В моем коде добавление «lags» выглядит так: int deltaX = (x - centerX) * d, int deltaY = (y - centerY) * d, а затем движение немного более плавное – user1052836