2016-06-23 12 views
0

У меня есть много источников и пробовал много разновидностей, но масштабирование по-прежнему не работает. Я не могу изменить glprojection gluPerspective, потому что в этом случае моя программа ничего не рисует. Вот приблизительный код.GLUT масштабирование и выключение колеса

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 
#include <math.h> 
#include "glut.h" 

#define windowSize 900.0 
double zoomFactor = 1; 
void reshape (int w, int h) 
{ 
glViewport (0.0, 0.0, (GLsizei) w, (GLsizei) h); 
glMatrixMode (GL_PROJECTION); 
glLoadIdentity(); 
gluOrtho2D (-(GLdouble) w * zoomFactor, (GLdouble) w* zoomFactor, -(GLdouble) h* zoomFactor, (GLdouble) h* zoomFactor); 
} 
void mouse(int button, int state, int x, int y) 
{ 
     if (button == 3 || button == 4) 
    { 
     if (state == GLUT_UP) zoomFactor += 0.05; 
else zoomFactor -= 0.05; 
    } 
    else return; 
    glutReshapeFunc(reshape); 
} 

Void display(){ 
glClear(GL_COLOR_BUFFER_BIT); 

glBegin(GL_LINES); 
glVertex2f ((0),(0)); 
glVertex2f ((100),(0)); 
glEnd(); 
glBegin(GL_LINES); 
glVertex2f ((100),(0)); 
glVertex2f ((100),(100)); 
glEnd(); 
glBegin(GL_LINES); 
glVertex2f ((0),(0)); 
glVertex2f ((100),(1000)); 
glEnd(); 
glFlush(); 

} 

int main(int argc,char** argv) 
{ 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
glutInitWindowSize(windowSize, windowSize); 
glutInitWindowPosition(500,0); 
glutCreateWindow("test"); 
glClearColor(0, 0.1,0.8,0.90);  
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluOrtho2D(0, 200, 200,0); 
glutDisplayFunc(display);  
glutMouseFunc(mouse); 
glutMainLoop(; 

return(0); 
} 

ответ

3

glutReshapeFunc только сообщает GLUT, какую функцию вызывать, когда изменяется размер окна. Слишком мало смысла называть его в ответ на входное событие, поскольку он не будет вызывать функцию изменения.

В любом случае, ваша проблема заключается в том, что вы установили настройку видового экрана и проекции в функцию изменения формы. Для всех авторов учебников: перестань делать это, он просто укореняет вредные привычки новичкам.

Теперь, пожалуйста, говорите со мной: «Всем рисованием родственными переходит в дисплее функции Окно просмотр представляет собой чертеж состояние и в каждой программе OpenGL только немного более сложным, чем„Hello Треугольник“окно просмотра будет. меняться несколько раз, рисуя один кадр - например, при использовании объектов framebuffer.Я тем самым даю обещание никогда не размещать вызовы на glViewport или настройку матрицы проецирования в обработчике перестройки окна. Я также обещаю ударить всех в лицо, которые пишут такой код в моем присутствии ».

Переместить весь материал в вашей функции перекроить в display (либо набор глобальных переменных, или использовать glutGet(GLUT_WINDOW_{WIDTH,HEIGHT}), чтобы получить размеры окна в функции дисплея) и вызвать glutPostRedisplay в вашей мыши функции колеса, чтобы вызвать перерисовку.

+0

Мой сосед был немного напуган моей обеткой речи. Масштабирование работает, но нет ответа на события кнопок 3 и 4. Может быть, некоторые проблемы с драйверами мыши? –

+0

@SergeS: Если вы используете Linux/X11, вы можете использовать инструмент 'xev', чтобы проверить, какой указатель мыши имеет индекс. Обычно кнопки 4 и 5 являются колесиком мыши. – datenwolf

+0

Также после добавления глобальных int mouseX, mouseY и void motion (int x, int y) {mouseX = x; mouseY = y;} и в основном glutPassiveMotionFunc (motion); и в отображении glViewport (mouseX, mouseY, glutGet (GLUT_INIT_WINDOW_WIDTH), glutGet (GLUT_INIT_WINDOW_WIDTH)); для увеличения до курсора. Я получил смехотворное поведение масштабирования и плохую перестройку, когда изображение перемещается в правый угол, если я включаю/выключаю режим полноэкранного режима. Где я должен использовать новые мышиные координаты, если не в окне просмотра, и как исправить переформатирование? –