1、填空20+选择20+判断10+简答20+综合30
2、没有编程题
3、复习PPT上的基本概念和算法
计算机图形学期末复习之第三章:OpenGL程序设计简介
3.1 OpenGL简介
- OpenGL是目前用于开发可移植的、可交互的2D和3D图形应用程序的首选环境,也是目前应用最广泛的计算机图形标准。
- OpenGL不是一种编程语言,而是一种API(Application Programming Interface,应用程序编程接口)。
- OpenGL主要包括三个函数库
- 核心库:建立各种几何模型、坐标变换、光照等所有二维和三维图形操作,以“gl”为前缀
- 实用函数库:比核心库更高一层的函数库,以“glu”为前缀
- 编程辅助库:提供一些基本的窗口管理函数、事件处理函数和简单的事件函数,以“aux”为前缀
3.2 第一个GLUT程序
#include <GL/gl.h>
#include <GL/glut.h>
#include <windows.h>
void displayEvent()
{
// 设置清屏颜色
glClearColor(1, 1, 1, 0);
// 用指定颜色清除帧缓存
glClear(GL_COLOR_BUFFER_BIT);
// 交换双缓存
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
// 初始化glut
glutInit(&argc, argv);
// 设置OpenGL显示模式(双缓存, RGB颜色模式, 深度缓存)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
// 设置窗口初始尺寸
glutInitWindowSize(400, 300);
// 设置窗口初始位置
glutInitWindowPosition(100, 100);
// 设置窗口标题
glutCreateWindow("Hello");
// 设置显示回调函数
glutDisplayFunc(displayEvent);
// 进入glut事件循环
glutMainLoop();
return 0;
}
结果:
![]()
3.3 OpenGL显示过程简介
![image-20201214151915139](https://i-blog.csdnimg.cn/blog_migrate/d7088f88c94ff9039f1cf9fe0ffe470d.png)
平行投影
-
视景体是一个矩形的平行管道,也就是一个长方体。
-
特点
- 无论物体距离相机多远,投影后的物体大小尺寸不变。
-
用途
- 建筑蓝图绘制和计算机辅助设计等方面。
gluOrtho2D
-
void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)
-
是一个特殊的平行投影函数,用于二维图形到二维屏幕上的投影。
-
所有二维物体的Z坐标都为0.0。
-
它将形体投影到左下角点为(left,bottom)、右上角点为(right,top)的矩形中。
3.4 增加投影功能
//承接上面的main函数
//增加尺寸事件函数
void resizeEvent(int w, int h)
{
// 设置视口大小
glViewport(0, 0, w, h);
// 切换矩阵模式为投影矩阵
glMatrixMode(GL_PROJECTION);
// 载入单位矩阵
glLoadIdentity();
// 进行二维平行投影
gluOrtho2D(0, w, h, 0);
// 切换矩阵模式为模型矩阵
glMatrixMode(GL_MODELVIEW);
// 发送重绘
glutPostRedisplay();
}
//修改displayEvent函数,增加字符串显示功能
int i;
char text[] = "Hello World!";
// 定位输出位置
glRasterPos2d(50, 100);
// 设置字符串颜色
glColor3f(1, 0, 0);
for(i=0; text[i] != '\0'; i++)
{
// 输出字符
glutBitmapCharacter(GLUT_BITMAP_8_BY_13, text[i]);
}
//修改main函数,设置窗口尺寸变换回调函数
// 设置显示回调函数
glutDisplayFunc(displayEvent);
// 设置窗口尺寸变化回调函数
glutReshapeFunc(resizeEvent);
// 进入glut事件循环
glutMainLoop();
完整代码:
#include <GL/gl.h>
#include <GL/glut.h>
#include <windows.h>
void displayEvent()
{
// 设置清屏颜色
glClearColor(1, 1, 1, 0);
// 用指定颜色清除帧缓存
glClear(GL_COLOR_BUFFER_BIT);
//增加字符串显示功能
int i;
char text[] = "Hello World!";
// 定位输出位置
glRasterPos2d(50, 100);
// 设置字符串颜色
glColor3f(1, 0, 0);
for(i=0; text[i] != '\0'; i++)
{
// 输出字符
glutBitmapCharacter(GLUT_BITMAP_8_BY_13, text[i]);
}
// 交换双缓存
glutSwapBuffers();
}
//尺寸事件函数
void resizeEvent(int w, int h)
{
// 设置视口大小
glViewport(0, 0, w, h);
// 切换矩阵模式为投影矩阵
glMatrixMode(GL_PROJECTION);
// 载入单位矩阵
glLoadIdentity();
// 进行二维平行投影
gluOrtho2D(0, w, h, 0);
// 切换矩阵模式为模型矩阵
glMatrixMode(GL_MODELVIEW);
// 发送重绘
glutPostRedisplay();
}
int main(int argc, char *argv[])
{
// 初始化glut
glutInit(&argc, argv);
// 设置OpenGL显示模式(双缓存, RGB颜色模式, 深度缓存)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
// 设置窗口初始尺寸
glutInitWindowSize(400, 300);
// 设置窗口初始位置
glutInitWindowPosition(100, 100);
// 设置窗口标题
glutCreateWindow("Hello");
// 设置显示回调函数
glutDisplayFunc(displayEvent);
// 设置窗口尺寸变化回调函数
glutReshapeFunc(resizeEvent);
// 进入glut事件循环
glutMainLoop();
return 0;
}
结果:
![]()
3.5 增加鼠标事件
//修改displayEvent函数,使字符串在全局变量gx, gy处绘制”Hello World!”
int gx = 50;
int gy = 100;
void displayEvent()
{
……
int i;
char text[] = "Hello World!";
// 定位输出位置
glRasterPos2d(gx, gy);
……
}
//增加鼠标事件函数
void mouseEvent(int button, int state, int x, int y)
{
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
gx = x;
gy = y;
glutPostRedisplay();
}
}
//在main函数中设置鼠标回调函数
// 设置显示回调函数
glutDisplayFunc(displayEvent);
// 设置窗口尺寸变化回调函数
glutReshapeFunc(resizeEvent);
// 设置鼠标事件回调函数
glutMouseFunc(mouseEvent);
// 进入glut事件循环
glutMainLoop();
完整代码:
#include <GL/gl.h>
#include <GL/glut.h>
#include <windows.h>
int gx = 50;
int gy = 100;
void displayEvent()
{
// 设置清屏颜色
glClearColor(1, 1, 1, 0);
// 用指定颜色清除帧缓存
glClear(GL_COLOR_BUFFER_BIT);
//增加字符串显示功能
int i;
char text[] = "Hello World!";
// 定位输出位置
glRasterPos2d(gx, gy);
// 设置字符串颜色
glColor3f(1, 0, 0);
for(i=0; text[i] != '\0'; i++)
{
// 输出字符
glutBitmapCharacter(GLUT_BITMAP_8_BY_13, text[i]);
}
// 交换双缓存
glutSwapBuffers();
}
//尺寸事件函数
void resizeEvent(int w, int h)
{
// 设置视口大小
glViewport(0, 0, w, h);
// 切换矩阵模式为投影矩阵
glMatrixMode(GL_PROJECTION);
// 载入单位矩阵
glLoadIdentity();
// 进行二维平行投影
gluOrtho2D(0, w, h, 0);
// 切换矩阵模式为模型矩阵
glMatrixMode(GL_MODELVIEW);
// 发送重绘
glutPostRedisplay();
}
//鼠标事件函数
void mouseEvent(int button, int state, int x, int y)
{
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
gx = x;
gy = y;
glutPostRedisplay();
}
}
int main(int argc, char *argv[])
{
// 初始化glut
glutInit(&argc, argv);
// 设置OpenGL显示模式(双缓存, RGB颜色模式, 深度缓存)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
// 设置窗口初始尺寸
glutInitWindowSize(400, 300);
// 设置窗口初始位置
glutInitWindowPosition(100, 100);
// 设置窗口标题
glutCreateWindow("Hello");
// 设置显示回调函数
glutDisplayFunc(displayEvent);
// 设置窗口尺寸变化回调函数
glutReshapeFunc(resizeEvent);
// 设置鼠标事件回调函数
glutMouseFunc(mouseEvent);
// 进入glut事件循环
glutMainLoop();
return 0;
}
结果:
![]()
鼠标点哪,hello world打印在哪个位置