我已经浏览了很多来源并尝试了很多种类,但缩放仍然无效。我无法将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);
}
答案 0 :(得分:3)
glutReshapeFunc
仅告诉GLUT要调用哪个函数。调用它来响应输入事件是没有意义的,因为它不会调用重塑函数。
无论如何,您的问题是,您将视口和投影设置在重塑功能中。对于那里的所有教程编写者:停止这样做,它只是把坏习惯带入了新手。
现在请与我联系:&#34;所有与绘图相关的内容都会进入显示功能。视口是一种绘图状态,在每个OpenGL程序中都比“Hello Triangle”更复杂一点。视口将多次更改为绘制单个帧 - 例如使用帧缓冲对象时。因此,我将发誓永远不要在窗口重塑处理程序中调用glViewport
或投影矩阵设置。我还发誓要打击那些在我面前写这样代码的人。&#34;
将重塑函数中的所有内容移动到display
(设置全局变量,或使用glutGet(GLUT_WINDOW_{WIDTH,HEIGHT})
获取显示功能中的窗口尺寸)并在鼠标中调用glutPostRedisplay
滚轮功能触发重绘。