当我使用鼠标旋转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);
}
}
答案 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语句将运动限制在某些角度。