freeglut - 使用鼠标平滑照相机旋转(freeglut - a smooth camera

2019-09-16 14:32发布

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

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

这是一个指数衰减函数。 你把它的每一帧确定使用什么的鼠标位置。 窍门就是在正确的价值springiness 。 要学究, springiness是时代的真实鼠标位置和所述使用位置将减半之间的距离的数量。 对于平滑鼠标移动,有一个良好的价值springiness可能是50-100。

time_d是自上次鼠标轮询间隔。 它传递的实时增量(以分数秒),如果你可以,但你可以只是路过逃脱它1.0/fps

如果你有一个能支持WebGL的浏览器,你可以看到一个真人版在这里 -寻找一个叫做类GLDraggableviewer.js



Answer 2:

你应该使用这样的事情,而不是在摄像机的角度与鼠标的最后位置,而不是屏幕的中心点计算。

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语句限制运动成一定的角度。



文章来源: freeglut - a smooth camera rotation using mouse