Я настраивал камеру после this tutorial. Моя проблема в том, что, когда я двигаюсь, это не жидкость, она как бы прыгает. Я расчета MVP, когда курсор мыши, используя этот код:OpenGL камера laggy
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;
}
}
А потом я обновляя атрибут моей «) OnIdele (» функции:
void onIdle() {
glUseProgram(program);
glm::mat4 Projection = glm::perspective(45.0f, 4.0f/3.0f, 0.1f, 100.0f);
glm::mat4 Model = glm::mat4(1.0f);
glm::mat4 MVP = Projection * view * Model;
glUniformMatrix4fv(uniform_mvp, 1, GL_FALSE, glm::value_ptr(MVP));
glutPostRedisplay();
}
Мой вопрос, является это правильный способ реализовать это? Есть ли способ избежать отставания?
Также, если вы не возражаете, я спрашиваю, как именно работает этот код? Я знаю, что ограничивает, где вы можете смотреть, но я не могу показаться, чтобы понять его:
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;
Можете ли вы попытаться описать немного больше, что означает «лагги» в вашем случае? Я знаю, что трудно описать визуальный эффект иногда, но мне трудно представить, что именно вы могли видеть. Также когда вызов 'onIdle()' вызывается? Выполняется ли каждый кадр на регулярной основе? – Tim
По laggy Я имею в виду, когда я перемещаю мышь, есть четкий «прыжок», поскольку ваша точка обзора меняется, а не плавный переход. И для 'onIdle' я устанавливал его как' glutIdleFunc (onIdle); ' –