C OpenGL:按下显示窗口时形状会改变位置

C OpenGL:按下显示窗口时形状会改变位置,c,opengl,glut,C,Opengl,Glut,我在运行程序时遇到了问题,当我按下3D形状所在的窗口时,它会改变位置。当我第二次按下它时,形状就会消失 下面是我的程序的样子: GLsizei winWidth = 500, winHeight = 500; int userLongitude, userLatitude; GLenum drawStyle; bool isSolid = false; void keyboardFunc(unsigned char, int, int); void init(void) { glClearC

我在运行程序时遇到了问题,当我按下3D形状所在的窗口时,它会改变位置。当我第二次按下它时,形状就会消失

下面是我的程序的样子:

GLsizei winWidth = 500, winHeight = 500;
int userLongitude, userLatitude;
GLenum drawStyle;
bool isSolid = false;

void keyboardFunc(unsigned char, int, int);

void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
}

void keyboardFunc(unsigned char Key, int x, int y) {
switch (Key) {
case 's':
    //drawStyle = GLU_FILL;
    isSolid = true;

    break;
case 'w':
    //drawStyle = GLU_LINE;
    isSolid = false;
    break;
}
//cout << Key << endl;
//glutPostRedisplay();
}
void wireQuadSurfs(void)
{
glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0.0, 0.0, 1.0);

gluLookAt(1.0, 1.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);


GLUquadricObj *cylinder;
glPushMatrix();
glTranslatef(0.0, 1.2, 0.8);
glRotatef(45, 1, 0, 0);
cylinder = gluNewQuadric();


//cylinder, baseRad, topRad, height, slices, stacks
//gluCylinder(cylinder, 0.6, 0.6, 1.5, userLongitude, userLatitude);
//gluQuadricDrawStyle(cylinder, GLU_LINE);
//gluQuadricDrawStyle(cylinder, drawStyle);

if (isSolid) {
    gluQuadricDrawStyle(cylinder, GLU_FILL);
}
else {
    gluQuadricDrawStyle(cylinder, GLU_LINE);
}
gluCylinder(cylinder, 0.6, 0.6, 1.5, userLongitude, userLatitude);
glPopMatrix();
glFlush();
}

void winReshapeFcn(GLint newWidth, GLint newHeight)
{
glViewport(0, 0, newWidth, newHeight);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0, 2.0, -2.0, 2.0, 0.0, 5.0);

glMatrixMode(GL_MODELVIEW);

glClear(GL_COLOR_BUFFER_BIT);
}

void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(100, 100);
glutInitWindowSize(winWidth, winHeight);
glutCreateWindow("CSC 313 HW 8 Part 2");

cout << "Enter number of longitude: ";
cin >> userLongitude;
cout << "Enter number of latitude: ";
cin >> userLatitude;
cout << "Switch between solid and wireframe views with 's' and 'w' keys" << endl;

glutKeyboardFunc(keyboardFunc);
init();
glutDisplayFunc(wireQuadSurfs);
glutReshapeFunc(winReshapeFcn);
glutMainLoop();
}
GLsizei winWidth=500,winHeight=500;
int用户经度,用户纬度;
盂牵引式;
bool-isSolid=false;
void keyboardFunc(无符号字符,int,int);
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
}
void keyboardFunc(无符号字符键,整数x,整数y){
开关(钥匙){
案例s:
//drawStyle=胶水填充;
isSolid=真;
打破
案例“w”:
//drawStyle=GLU_线;
isSolid=假;
打破
}
//cout用户纬度;

cout在设置正交投影之前,必须使用单位矩阵初始化投影矩阵堆栈(请参见):

注意,将当前矩阵乘以正交投影矩阵。
这意味着它不分配新的4*4矩阵,而是将当前矩阵乘以新矩阵,并将结果分配给矩阵堆栈。每次调用
WinReformaEFCN
时,投影矩阵堆栈上的矩阵都会以问题代码的形式逐渐改变


如果调用
glLoadIdentity
,那么矩阵堆栈将由标识矩阵初始化。调用
glOrtho
将标识矩阵乘以新的正交投影。结果就是正交投影本身。

感谢您的响应!我添加了
glLoadIdentity()
in,但它仍然会导致相同的问题。因此,每次程序刷新时,
glLoadIdentity
都会重置投影坐标?如果在“WinReformaEFCN”之前调用,
gluPostRedisplay
函数是否会对其产生影响?@chiyopet
gluPostRedisplay
只根据需要标记当前窗口正在重新显示。它不会对任何OpenGL状态进行任何更改。
glLoadIdentity
不会设置任何坐标,但它会初始化矩阵堆栈上的矩阵。@chiyopet如果您仍然有相同的问题,那么您的问题不包含a。您可以再描述一下环境吗?可能是所有内容的版本吗?a屏幕截图?
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0, 2.0, -2.0, 2.0, 0.0, 5.0);