Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 通过轮子放大和缩小的超负荷_Opengl_Glut_Zooming - Fatal编程技术网

Opengl 通过轮子放大和缩小的超负荷

Opengl 通过轮子放大和缩小的超负荷,opengl,glut,zooming,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 zoomFac

我浏览了很多资源,尝试了很多种类,但缩放仍然不起作用。我不能将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);
}
#包括
#包括
#包括
#包括
#包括“glut.h”
#定义WindowsSize 900.0
双变焦因子=1;
空洞重塑(整数w,整数h)
{
glViewport(0.0,0.0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(-(GLdouble)w*缩放因子,(GLdouble)w*缩放因子,-(GLdouble)h*缩放因子,(GLdouble)h*缩放因子);
}
无效鼠标(int按钮、int状态、int x、int y)
{
如果(按钮==3 | |按钮==4)
{ 
如果(state==GLUT_UP)zoomFactor+=0.05;
else zoomFactor-=0.05;
}
否则返回;
GLUTREFORUNC(重塑);
}
无效显示(){
glClear(GLU颜色缓冲位);
glBegin(GL_行);
glVertex2f((0),(0));
glVertex2f((100),(0));
格伦德();
glBegin(GL_行);
glVertex2f((100),(0));
glVertex2f((100),(100));
格伦德();
glBegin(GL_行);
glVertex2f((0),(0));
glVertex2f((100),(1000));
格伦德();
glFlush();
}
int main(int argc,字符**argv)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
GLUTINITWindowsSize(WindowsSize,WindowsSize);
位置(500,0);
测试窗口(“测试”);
glClearColor(0,0.1,0.8,0.90);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0,200200,0);
glutDisplayFunc(显示器);
glutMouseFunc(小鼠);
glutMainLoop(;
返回(0);
}

GLUTREFORMATEFUNC
仅在窗口大小更改时告诉GLUT要调用哪个函数。响应输入事件调用它没有什么意义,因为它不会调用REFORMATE函数

不管怎么说,你的问题是,你把设置视口和投影放在了重塑功能中。对所有的教程作者来说:停止这样做,这只会让新手养成坏习惯

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


将重塑函数中的全部内容移动到
display
(设置全局变量,或使用
glutGet(GLUT\u WINDOW{WIDTH,HEIGHT})
获取display函数中的窗口尺寸)并在鼠标滚轮函数中调用
glutPostRedisplay
,以触发重画。

glutrestrapefunc
仅在窗口大小更改时告知GLUT要调用哪个函数。在响应输入事件时调用它是毫无意义的,因为它不会调用重塑函数

不管怎么说,你的问题是,你把设置视口和投影放在了重塑功能中。对所有的教程作者来说:停止这样做,这只会让新手养成坏习惯

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


将重塑函数中的全部内容移动到
display
(设置全局变量,或使用
glutGet(GLUT\u WINDOW{WIDTH,HEIGHT})
获取display函数中的窗口尺寸)然后在鼠标滚轮功能中调用
glutPostRedisplay
,以触发重画。

我的邻居被我的誓言演讲吓了一跳。缩放可以工作,但对按钮3和4的事件没有响应。可能是鼠标驱动程序出了问题吗?@SergeS:如果你使用Linux/X11,你可以使用
xev
工具来检查哪个鼠标不可用ton有哪个索引。通常按钮4和5是鼠标滚轮。在添加全局int mouseX、mouseY和void motion(int x、int y){mouseX=x;mouseY=y;}和主GLUTPassiveMootionFunc(motion);以及在display glViewport(mouseX、mouseY、glutGet(GLUT_INIT_WINDOW_WIDTH)、GLUT(GLUT_INIT_WINDOW_WIDTH))之后;要缩放到光标,当我打开/关闭全屏模式时,图像移动到右角时,我出现了可笑的缩放和糟糕的整形行为。如果不在视口中,我应该在哪里使用新的鼠标坐标,以及如何修复整形?我的邻居被我的誓言演讲吓了一跳。缩放可以工作,但对按钮3和4的事件没有响应。我可以吗这可能是一些鼠标驱动程序问题?@SergeS:如果你使用Linux/X11,你可以使用
xev
工具来检查哪个鼠标按钮有哪个索引。通常按钮4和5是鼠标滚轮。另外,在添加全局int-mouseX、mouseY和void-motion(int-x,int-y){mouseX=x;mouseY=y;}和主glutemotionfunc(motion)之后;在显示窗口(mouseX、mouseY、glutGet(GLUT_INIT_WINDOW_WIDTH)、glutGet(GLUT_INIT_WINDOW_WIDTH));要缩放到光标,当我打开/关闭全屏模式时,图像移动到右角时,我会出现可笑的缩放行为和糟糕的重塑。如果不在视口中,我应该在哪里使用新的鼠标坐标,以及如何修复重塑?