C++ OpenGL的相机是滞后的
我在后面安装了一个摄像头。我的问题是,当我移动时,它不是流体,它有点跳跃。我正在使用以下代码计算鼠标移动时的MVP:C++ OpenGL的相机是滞后的,c++,opengl,glut,C++,Opengl,Glut,我在后面安装了一个摄像头。我的问题是,当我移动时,它不是流体,它有点跳跃。我正在使用以下代码计算鼠标移动时的MVP: void motion(int x, int y) { static bool wrap = false; if(!wrap) { int ww = glutGet(GLUT_WINDOW_WIDTH); int wh = glutGet(GLUT_WINDOW_HEIGHT); int dx = x - ww
void motion(int x, int y) {
static bool wrap = false;
if(!wrap) {
int ww = glutGet(GLUT_WINDOW_WIDTH);
int wh = glutGet(GLUT_WINDOW_HEIGHT);
int dx = x - ww / 2;
int dy = y - wh / 2;
const float mousespeed = 0.001;
angles.x += dx * mousespeed;
angles.y += dy * mousespeed;
if(angles.x < -M_PI)
angles.x += M_PI * 2;
else if(angles.x > M_PI)
angles.x -= M_PI * 2;
if(angles.y < -M_PI / 2)
angles.y = -M_PI / 2;
if(angles.y > M_PI / 2)
angles.y = M_PI / 2;
lookat.x = sinf(angles.x) * cosf(angles.y);
lookat.y = sinf(angles.y);
lookat.z = cosf(angles.x) * cosf(angles.y);
view = glm::lookAt(position, position + lookat, glm::vec3(0, 1, 0));
// move mouse pointer back to the center of the window
wrap = true;
glutWarpPointer(ww / 2, wh / 2);
} else {
wrap = false;
}
}
我的问题是,这是正确的实施方式吗?有没有办法避免这种落后
如果你不介意我问的话,这个代码到底是如何工作的?我知道它限制了你的视线,但我似乎无法理解:
if(angles.x < -M_PI)
angles.x += M_PI * 2;
else if(angles.x > M_PI)
angles.x -= M_PI * 2;
if(angles.y < -M_PI / 2)
angles.y = -M_PI / 2;
if(angles.y > M_PI / 2)
angles.y = M_PI / 2;
if(角度x<-M_-PI)
角度x+=M_PI*2;
否则如果(角度x>M_PI)
角度x-=M_PI*2;
如果(角度y<-M_PI/2)
角度y=-M_PI/2;
如果(角度y>M_PI/2)
角度y=M_PI/2;
查看增加鼠标速度是否会有所不同。找到存储在dx
和dy
中的鼠标移动距离后,在将其添加到相机角度之前,可以通过mousespeed
缩放距离。mousespeed
的值越低,鼠标移动对相机角度的影响就越小,反之亦然
另外,您所问的代码是将您的相机角度限制在0和PI*2之间,或0和360度之间。您能试着描述一下“laggy”在您的案例中的含义吗?我知道有时很难描述视觉效果,但我很难想象你能看到什么。什么时候调用onIdle()
?它是不是每一帧都有规律地执行?我的意思是当我移动鼠标时,当你的视点改变时,会有一个清晰的“跳跃”,而不是平滑的过渡。对于onIdle
我将其设置为glutIdleFunc(onIdle)代码>嗯,我把它减少了十次方,但它仍然在“跳跃”,只是以较小的角度进行。根据你的评论,看起来你需要与相机相关的角速度。使用鼠标移动的距离设置相机的角速度,以便相机根据更新周期之间经过的时间进行旋转。这里需要的是鼠标移动
和摄像头
功能。
if(angles.x < -M_PI)
angles.x += M_PI * 2;
else if(angles.x > M_PI)
angles.x -= M_PI * 2;
if(angles.y < -M_PI / 2)
angles.y = -M_PI / 2;
if(angles.y > M_PI / 2)
angles.y = M_PI / 2;