freeglut - 使用鼠标平滑的相机旋转

时间:2012-04-18 15:21:30

标签: math opengl 3d freeglut

当我使用鼠标旋转fps相机时,动画不流畅。当我使用键盘时,一切都很好。对于键盘我使用bool类型的数组来缓冲键。使用鼠标时,如何使动画流畅?

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);
     }
}

2 个答案:

答案 0 :(得分: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的课程。

答案 1 :(得分: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是影响运动速度(灵敏度)的因素,if / else语句将运动限制在某些角度。