小弟初学opengl,遇到一个问题,亟待解决,望各位高手指点迷津 :)
下面是源代码
// dd.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <math.h>
#include <gl/glut.h>  //引用相关包
GLdouble myEquation[4][4]={{1,-2,0,30},{-1,-2,0,30},{1,2,0,50},{-1,2,0,50}};
float test_y=0;
void display(void)
{
GLdouble eqn[4]={0,1,0,0};
GLdouble eqn2[4]={1,0,0,0};
  glClear(GL_COLOR_BUFFER_BIT);  //清空颜色缓冲区//   glMatrixMode(GL_MODELVIEW);
//   glLoadIdentity();
//     glMatrixMode(GL_PROJECTION); //去掉这几句会出现意想不到的结果???
  glLoadIdentity();
  glOrtho(-100.0, 100.0, -100.0, 100.0, 1.0, -1.0);//设置视景体 /*gluPerspective(60,1,1.0,20);*/
//glTranslatef(0,0,-10);
glColor3f(0,1,1);   //重置颜色
glPushMatrix();
glClipPlane(GL_CLIP_PLANE0,myEquation[0]);   //裁掉上半部分
glEnable(GL_CLIP_PLANE0);
glClipPlane(GL_CLIP_PLANE1,myEquation[1]);   //裁掉上半部分
glEnable(GL_CLIP_PLANE1);
glClipPlane(GL_CLIP_PLANE2,myEquation[2]);   //裁掉下半部分
glEnable(GL_CLIP_PLANE2);
glClipPlane(GL_CLIP_PLANE3,myEquation[3]);   //裁掉下半部分
glEnable(GL_CLIP_PLANE3);
glTranslatef(0,25*cos(test_y),0.0);

glBegin(GL_QUADS);
glVertex3d(-20, 10,0);
glVertex3d(-20,-25,0);
glVertex3d( 20,-25,0);
glVertex3d( 20, 10,0);
    glEnd();
glDisable(GL_CLIP_PLANE0);
glDisable(GL_CLIP_PLANE1);
glDisable(GL_CLIP_PLANE2);
glDisable(GL_CLIP_PLANE3);


glPopMatrix(); //出栈 glFlush();   //刷新窗口以显示当前绘制图形
test_y+=0.002;
glutSwapBuffers();

void init(void)
{
glClearColor(0,0,0,0);
glShadeModel(GL_FLAT); //选择平面明暗模式或光滑明暗模式
glOrtho(-100.0, 100.0, -100.0, 100.0, 1.0, -1.0);//设置视景体
}void reshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);   //设置机口
glMatrixMode(GL_PROJECTION);  //指定哪一个矩阵是当前矩阵
glLoadIdentity();
    gluPerspective(60,(GLfloat)w/(GLfloat)h,1.0,20);   //创建透视投影矩阵(fovy,aspect,zNear,zFar);
//glFrustum(-1,1,-1,1,1.5,20.0);  //用透视矩阵乘以当前矩阵(left,Right,bottom,top,near,far);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv); //固定格式
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);   //缓存模式
glutInitWindowSize(400, 400);    //显示框的大小
    glutInitWindowPosition(400,400); //确定显示框左上角的位置
    glutCreateWindow("第6个OpenGL程序(四个附加剪切面裁剪长方形)");
init();
    glutDisplayFunc(display);
glutIdleFunc(display);
//glutReshapeFunc(reshape);
    glutMainLoop(); //进人GLUT事件处理循环
    return 0;
}
谁能帮我把这个程序运行一下啊,为什么display里加上glMatrixMode(GL_PROJECTION); glLoadIdentity();后,和不加时的效果不一样啊,完全不一样了,谁能解释一下,到底咋回事

解决方案 »

  1.   

    OpenGL如果不搞透了,经常会出现一些怪异的现象。
    GL_MODELVIEW - 是模型矩阵
    GL_PROJECTION - 是投影视图
    GL_TEXTURE - 是纹理视图
    这些好像是在OpenGL宝典里边有,每个都是什么意思,记得不是特别清楚了,LZ可以查查,已经好久不搞这个了。
      

  2.   

    顺序不对,应该先调用glMatrixMode(GL_PROJECTION);设置好了视景体
    再调用glMatrixMode(GL_MODELVIEW);来显示3D模型之类的东西,
    而且一般在reshape()里面调用这些,最后来一句glMatrixMode(GL_MODELVIEW);
    这些都是表示下面的操作是在什么模式下的,你的代码太混乱了,本来是在reshape()里面的处理跳到DISPLAY里面了。而且init()里面没有调用glMatrixMode(GL_PROJECTION);就直接来个glOrtho(-100.0, 100.0, -100.0, 100.0, 1.0, -1.0);//设置视景体
    这个其实应该这样用的://添加窗口缩放时的图形变换函数
    glViewport(0,0,cx,cy);
    width=cx;
    height=cy;
    double nRange=100.0;
    glMatrixMode(GL_PROJECTION); // 设置当前矩阵为投影矩阵。
    glLoadIdentity(); // 重置当前指定的矩阵为单位矩阵
    if (cx<=cy)
    {
    glOrtho(-nRange,nRange,-nRange*height/width,nRange*height/width,-nRange,nRange);
    }
    else
    {
    glOrtho(-nRange*width/height,nRange*width/height,-nRange,nRange,-nRange,nRange);
    }
    // 这和照象机很类似,第一个参数设置镜头广角度,第二个参数是长宽比,后面是远近剪切。
    glMatrixMode(GL_MODELVIEW); // 设置当前矩阵为模型视图矩阵