2012-03-04 2 views
0

Я настраивал камеру после 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; 
+0

Можете ли вы попытаться описать немного больше, что означает «лагги» в вашем случае? Я знаю, что трудно описать визуальный эффект иногда, но мне трудно представить, что именно вы могли видеть. Также когда вызов 'onIdle()' вызывается? Выполняется ли каждый кадр на регулярной основе? – Tim

+0

По laggy Я имею в виду, когда я перемещаю мышь, есть четкий «прыжок», поскольку ваша точка обзора меняется, а не плавный переход. И для 'onIdle' я устанавливал его как' glutIdleFunc (onIdle); ' –

ответ

0

Смотрите, если увеличение mousespeed делает разницу. После того, как вы найдете расстояние, которое перемещали мышь, хранящиеся в dx и dy, вы увеличиваете расстояние до mousespeed, прежде чем добавлять его к углам камеры. Чем ниже значение mousespeed, тем меньше ваше движение мыши повлияет на углы вашей камеры и наоборот.

Также код, о котором вы просили, ограничивает ваши углы камеры от 0 до PI * 2 или 0 и 360 градусов.

+0

Hm Я уменьшил его на десять, но он все еще« прыгает », он просто делает это под меньшими углами. –

+0

На основе вашего комментария, похоже, вам нужны угловые скорости, связанные с вашей камерой. Используйте расстояние, перемещенное мышью, чтобы установить угловую скорость камеры, чтобы камера вращалась в зависимости от времени, прошедшего между циклами обновления. – PeddleSpam

+0

Вот хороший учебник, который может быть вам полезен - [OpenGL Camera] (http://www.swiftless.com/tutorials/opengl/camera2.html). Функции 'mouseMovement' и' camera' - вот что вам нужно здесь. – PeddleSpam

Смежные вопросы