GLUT通过滚轮放大和缩小

时间:2016-06-23 07:09:30

标签: opengl glut zooming

我已经浏览了很多来源并尝试了很多种类,但缩放仍然无效。我无法将glprojection更改为gluPerspective,因为在这种情况下,我的编程不会绘制任何内容。这是近似代码。

#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);
}

1 个答案:

答案 0 :(得分:3)

当窗口大小改变时,

glutReshapeFunc仅告诉GLUT要调用哪个函数。调用它来响应输入事件是没有意义的,因为它不会调用重塑函数。

无论如何,您的问题是,您将视口和投影设置在重塑功能中。对于那里的所有教程编写者:停止这样做,它只是把坏习惯带入了新手。

现在请与我联系:&#34;所有与绘图相关的内容都会进入显示功能。视口是一种绘图状态,在每个OpenGL程序中都比“Hello Triangle”更复杂一点。视口将多次更改为绘制单个帧 - 例如使用帧缓冲对象时。因此,我将发誓永远不要在窗口重塑处理程序中调用glViewport或投影矩阵设置。我还发誓要打击那些在我面前写这样代码的人。&#34;

将重塑函数中的所有内容移动到display(设置全局变量,或使用glutGet(GLUT_WINDOW_{WIDTH,HEIGHT})获取显示功能中的窗口尺寸)并在鼠标中调用glutPostRedisplay滚轮功能触发重绘。