OpenGL камера отстает - PullRequest
       8

OpenGL камера отстает

0 голосов
/ 04 марта 2012

Я настраивал камеру, следуя этому уроку . Моя проблема в том, что когда я двигаюсь, он не плавный, он как бы прыгает. Я вычисляю 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 / 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;

1 Ответ

0 голосов
/ 04 марта 2012

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

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

...