2011-06-16 3 views
0

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

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

OK здесь codesnippet ....

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(); 

} 
} 

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

+5

Я не понимаю –

+0

Может быть, вам следует опубликовать какой-то код, чтобы уточнить, что вы хотите сделать, поскольку ваши дескрипции не очень, но и описательны. –

+0

Наверху вы видите мои изменения в моем вопросе. – buddy

ответ

1

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

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

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

+0

Почему это проблема для рисования в motionfunc? Я не понимаю, что вы имеете в виду: «Обновите состояние приложения на вкладке» У вас есть пример. Разрешено ли рисовать в mousefunc? Когда я вызываю glutPostRedisplay в glutdisplayfunc, ничего не работает. Итак, где я могу рисовать вместо этого. – buddy

+0

@buddy: вы должны хранить/использовать ввод от mousefunc в какой-то другой переменной (например, обновлять, где загорается ваш корабль, если вы пишете игру) и вызвать glutPostRedisplay() из motionfunc. Аналогично для keyboardfunc, menufunc и т. Д. Вызов glutpostredisplay подскажет GLUT, чтобы вызвать glutdisplayfunc, как только все события будут обработаны. (Итак, все рисунки идут в displayfunc). Следуя этому шаблону, это де-факто способ сделать событие/перерисовку и позволяет избежать проблем, подобных тем, которые у вас есть, особенно если есть много событий мыши, и вы работаете с низкой частотой кадров. – Macke

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