glMatrixMode(GL_PROJECTION)和glOrtho(0,with,height,0,-100,100)

在OpenGL中,如果想对模型进行操作,就要对这个模型的状态(当前的矩阵)乘上这个操作对应的一个矩阵.
如果当前矩阵乘以变换矩阵(平移, 缩放, 旋转), 那相乘之后, 模型的位置被变换;
如果当前矩阵乘以投影矩阵(将3D物体投影到2D平面), 相乘后, 模型的投影方式被设置;
如果当前矩阵乘以纹理矩阵(), 模型的纹理方式被设置.

而用来指定当前矩阵, 就是glMatriMode(GLenum mode);
glMatrixMode有3种模式: GL_PROJECTION 投影, GL_MODELVIEW 模型视图, GL_TEXTURE 纹理.

所以,在操作投影矩阵以前,需要调用函数:
glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影矩阵
然后把矩阵设为单位矩阵:
glLoadIdentity();

然后调用glFrustum()或gluPerspective(),它们生成的矩阵会与当前的矩阵相乘,生成透视的效果;

 glOrtho(left, right, bottom, top, near, far)

 glOrtho(投影变换函数)创建一个正交平行的视景体,一般用于"物体不会因为离屏幕的远近而产生大小的变换"的情况。

//glOrtho将产生一个矩阵,这个矩阵将填到投影矩阵上

glOrtho(0,with,height,0,-100,100)

OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho。

.任务描述 1.本关任务 2.预期输出 3.具体要求 二.相关知识 一.任务描述 根据提示,在右侧修改代码,并自己绘制出图形。平台会对你编写的代码进行测试。 1.本关任务 了解简单实体构建的过程; 熟悉视点观察函数的设置使用; 熟悉3D图形变换的设置使用; 进一步熟悉基本3D图元的绘制。 2.预期输出 3.具体要求 (1).背景色为黑色,用 glclearcolor 来完成; (2).以中心为绘制原点,构建一个三棱锥; (3).创建二维数组用来存取三棱锥顶点坐标,顶点坐标分别为{-1,0,1},{1,0,1},{0,0,-0.7},{0,1.7,0}; (4).创建二维数组用来存取三棱锥面的颜色,分别为{0,1,0},{1,0,0},{1,1,0},{0,0,1} ; (5).创建二维数组用来存取三棱锥顶点的序号; (6).运用glPushMatrix()函数glPopMatrix()函数进行矩阵操作,沿Z轴负方向平移-3.0f,沿Y轴方向平移0.2f,然后将三棱锥绕X轴方向选择95度 二.相关知识 为了完成本关任务,你需要掌握:二维数组的运用、实体平移旋转、简单实体构建的操作。 // 提示:在合适的地方修改或添加代码 #include <GL/freeglut.h> #include<stdio.h> #include<iostream> // 评测代码所用头文件-开始 #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace std; // 评测代码所用头文件-结束 // 请在此添加你的代码 /********** Begin ********/ GLfloat points1[4][3] = { }; GLfloat Colors1[4][3] = { }; int vertice1[4][3] = { }; /********** End **********/ void InitGL(GLvoid) { glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_COLOR_MATERIAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); } void Create() //创建三棱锥 { glBegin(GL_TRIANGLES); for (int i = 0; i < 4; i++) { glColor3fv(Colors1[i]); for (int j = 0; j < 3; j++) { int VtxId = vertice1[i][j]; glVertex3fv(points1[VtxId]); } } glEnd(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); // 请在此添加你的代码 /********** Begin ********/ /********** End **********/ Create(); //三棱锥 glPopMatrix(); glutSwapBuffers(); } void reshape(int width, int height) { if (height == 0) height = 1; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f); glMatrixMod
最新发布
03-28
具体要求 (1) 直线颜色为绿色(0.0f,1.0f,0.0f), 线粗为1; (2) 实现一般直线(所有斜率情况)的绘制算法,并将代码填写在函数void Line(int x0, int y0, int x1, int y1)中; (3) 绘制一个五角星来测试上述直线绘制算法,并将代码填写在函数void myDisplay(void)中指定位置。五角星的顶点坐标分别为:(261, 215), (344, 275),(429, 213), (398, 319), (477, 384), (378, 384), (344, 491), (310, 384), (209, 384), (292, 319). 利用OpenGL画点函数来实现一般直线(所有斜率情况)的绘制算法。// 提示:写完代码请保存之后再进行评测 #include <GL/freeglut.h> //#include <algorithm> #include <stdio.h> using namespace std; // 评测代码所用头文件-开始 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> // 评测代码所用头文件-结束 void Line(int x0, int y0, int x1, int y1) { // 请在此添加你的代码 /********** Begin ********/ /********** End **********/ } void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); // 请在此添加你的代码用来测试直线绘制代码 /********** Begin ********/ /********** End **********/ glFlush(); } void Init() { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); } void myReshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h); } int main(int argc, char *argv[]) { int width = 800; int height = 600; glutInit(&argc, argv); glutInitWindowPosition(100, 100); glutInitWindowSize(width, height); glutCreateWindow("Hello Line!"); Init(); glutDisplayFunc(myDisplay); glutReshapeFunc(myReshape); glutMainLoopEvent(); /*************以下为评测代码,与本次实验内容无关,请勿修改**************/ GLubyte* pPixelData = (GLubyte*)malloc(width * height * 3);//分配内存 GLint viewport[4] = {0}; glReadBuffer(GL_FRONT); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glGetIntegerv(GL_VIEWPORT, viewport); glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3], GL_RGB, GL_UNSIGNED_BYTE, pPixelData); using namespace cv; Mat img; vector<cv::Mat> imgPlanes; img.create(height, width, CV_8UC3); split(img, imgPlanes); for(int i = 0; i < heig
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值