计算机图形学期末复习之第三章:OpenGL程序设计简介

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;
}

结果:

image-20201214153923076

3.3 OpenGL显示过程简介

image-20201214151915139

平行投影

  • 视景体是一个矩形的平行管道,也就是一个长方体。

  • 特点

    • 无论物体距离相机多远,投影后的物体大小尺寸不变。
  • 用途

    • 建筑蓝图绘制和计算机辅助设计等方面。

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;
}

结果:

image-20201214154447764

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;
}

结果:

image-20201214154658194

鼠标点哪,hello world打印在哪个位置

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值