OpenGL glViewport () (сброс координат) - PullRequest
0 голосов
/ 16 июня 2011

У меня проблема с glViewport.В моей программе liitle у меня есть два окна просмотра.Я могу нарисовать форму (с помощью motionfunc) в одном из этих видов, а в другом автоматически рисуется линия.Пока все хорошо .. Когда я пытаюсь что-то нарисовать с помощью mousefunc, окно просмотра находится в совершенно другом месте.И очень трудно найти новые правильные координаты для этого окна просмотра.Есть ли возможность сбросить координаты .. Я не могу использовать glLoadIdentity в мыши или движении, потому что тогда ничего не отображается.

Надеюсь, вы понимаете, о чем я.Это немного сложно объяснить.

ОК, здесь кодовый код ....

void mouse (int button, int state, int mx, int my)
{
if (modus == 0 && button==GLUT_LEFT_BUTTON && state != GLUT_DOWN) 
{
    ...
}

else if (modus == 1 && button==GLUT_LEFT_BUTTON && state == GLUT_DOWN) 
{


    **glViewport(10,10 , sw_w1, sw_h1);** 
//the drawing is much higher than in the first viewport in motion. 
//But it should be the same viewport like the first in motion.
    glBegin()...glEnd()
            glFlush();
}   
}   
void motion(int mousex,int mousey)
{
GLdouble h=12;
GLdouble winkel=360/h;
Line liste[num];

liste[++last].x =(mousex)-((sw_w1+2*GAP)/2);
liste[last].y   =(mousey)-((sw_h1+2*GAP)/2);

if (modus==0 && gruppe == 0) {
    if (last>=1)
    {
        glViewport(10, 10, sw_w1, sw_h1); //works fine
        glColor3d(R, G, B);
        for(h+1;h>0;h--){
            glRotated(winkel, 0, 0, 1);
            glBegin(GL_LINE_STRIP);
            for(int i=last-1;i<=last;i++){
                glVertex2i(liste[i].x,liste[i].y);
            }
            glEnd();
        }

        glLineWidth(linewidth+0.5);
        glColor3f(1, 0, 0);
        glBegin(GL_LINE_STRIP);
        for(int i=last-1;i<=last;i++){
            glVertex2i(liste[i].x,liste[i].y);
        }
        glEnd();
        glViewport(1020,10 , sw_w2, sw_h2); //works fine
        glColor3f(1, 0, 0);
        glBegin(GL_LINE_STRIP);
        for(int i=last-1;i<=last;i++){
            glVertex2i(liste[i].x,liste[i].y);
        }
        glEnd();
    }
    glFlush();

}
}

Второй и третий видовой экран работает нормально.Первый такой же, как второй, но картинка отображается гораздо выше. Почему так?И как я мог изменить это так, чтобы я получил тот же самый видовой экран как второй.Надеюсь, теперь вы понимаете, о чем я.

1 Ответ

1 голос
/ 16 июня 2011

Вам следует проверить матрицы моделей / проекций и посмотреть, соответствуют ли они тем, что вы ожидаете от них в каждой функции.

Кроме того, как прокомментировал Кристиан, нет необходимости и не рекомендуется рисовать вфункция движенияОбновите состояние приложения для каждого входа и вызовите glutPostRedisplay, чтобы указать, что вы хотите перерисовать окно.Таким образом, ваше приложение будет иметь более чистый дизайн, и будет проще заставить его работать согласованно.

(добавил мой комментарий в качестве ответа, так как это была проблема, и добавил комментарий Кристиана, поскольку этоправильное решение. Не рисовать в motionfunc! .)

...