1

当我使用鼠标旋转我的 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);
     }
}
4

2 回答 2

2

有时当鼠标轮询率和屏幕刷新率不是很好的比例时,根据鼠标位置更新显示会导致抖动效果。

你有垂直同步,对吗?而如果你转动它的鼠标移动是不是以撕裂为代价更流畅?

一种选择是使用平滑函数,它“滞后”您用于鼠标位置的值,仅比实际鼠标位置稍晚一点

它的要点是这样的:

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

这是一个指数衰减函数。您在每一帧都调用它来确定鼠标位置的用途。诀窍是为springiness. 迂腐的springiness是,实际鼠标位置和使用位置之间的距离减半的次数。对于平滑鼠标移动,一个好的值springiness可能是 50-100。

time_d是自上次鼠标轮询以来的间隔。如果可以的话,将实时增量(以小数秒为单位)传递给它,但你只需传递它就可以逃脱1.0/fps

如果你有一个支持 WebGL 的浏览器,你可以在这里看到一个实时版本- 寻找一个名为GLDraggablein的类viewer.js

于 2012-04-19T13:12:47.013 回答
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 语句将运动限制在某些角度。

于 2012-04-18T22:43:35.553 回答