当我用鼠标旋转,我的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);
}
}
有时当鼠标轮询速率和屏幕刷新率是一个很好的比率的不,更新基于鼠标位置的显示可导致不平稳的效果。
您对垂直同步,是否正确? 如果你把它的鼠标移动是在撕裂的代价更顺畅?
一种选择是使用平滑函数,即“滞后”您使用鼠标的位置背后真正的鼠标位置只是一点点的值
它的主要内容是这样的:
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的浏览器,你可以看到一个真人版在这里 -寻找一个叫做类GLDraggable
在viewer.js
。
你应该使用这样的事情,而不是在摄像机的角度与鼠标的最后位置,而不是屏幕的中心点计算。
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语句限制运动成一定的角度。