小弟初学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();后,和不加时的效果不一样啊,完全不一样了,谁能解释一下,到底咋回事
下面是源代码
// 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();后,和不加时的效果不一样啊,完全不一样了,谁能解释一下,到底咋回事
GL_MODELVIEW - 是模型矩阵
GL_PROJECTION - 是投影视图
GL_TEXTURE - 是纹理视图
这些好像是在OpenGL宝典里边有,每个都是什么意思,记得不是特别清楚了,LZ可以查查,已经好久不搞这个了。
再调用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); // 设置当前矩阵为模型视图矩阵