使用FreeGLUT创建交互式OpenGL窗口
使用FreeGLUT创建交互式OpenGL窗口
这篇文章介绍如何使用FreeGLUT库创建一个简单的交互式OpenGL窗口, 并提供一个C++代码示例来解释基本概念。
代码示例
// File ID: Lab04-1.cpp
// Title: 使用FreeGLUT创建交互式窗口
// Author: Bard
#define FREEGLUT_STATIC
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <GL/freeglut.h>
typedef struct { GLfloat x, y; } point; // 定义一个二维点结构体
point p0 = { 0,50 }; // 设置初始点的坐标
GLfloat finishx = 300; // 声明竖直轴的位置
// 显示函数
void display(void)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, 600, 0, 400); // 设置二维正交投影
glClearColor(0, 0, 1, 1); // 设置清除颜色为蓝色
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区
// 绘制白色竖直线
glColor3f(1, 1, 1);
glBegin(GL_LINES);
glVertex2f(finishx, 50);
glVertex2f(finishx, 350);
glEnd();
// 绘制绿色矩形
glColor3f(0, 1, 0);
glBegin(GL_POLYGON);
glVertex2f(0, 0);
glVertex2f(0, 50);
glVertex2f(600, 50);
glVertex2f(600, 0);
glEnd();
// 绘制红色多边形
glColor3f(1, 0, 0);
glBegin(GL_POLYGON);
glVertex2f(p0.x, p0.y);
glVertex2f(p0.x, p0.y + 20);
glVertex2f(p0.x + 30, p0.y + 20);
glVertex2f(p0.x + 30, p0.y);
glEnd();
glutSwapBuffers(); // 交换前后缓冲区
}
int main(int argc, char** argv)
{
glutInit(&argc, argv); // 初始化GLUT库
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 设置显示模式
glutInitWindowPosition(100, 100); // 设置窗口位置
glutInitWindowSize(600, 400); // 设置窗口大小
glutCreateWindow('My Interactive Window'); // 创建窗口并设置标题
glutDisplayFunc(display); // 设置显示回调函数
glutMainLoop(); // 进入主循环
}
代码解释
头文件和宏定义
#define FREEGLUT_STATIC: 定义FreeGLUT库为静态链接。#include <...>: 包含必要的头文件, 包括用于标准输入输出、数学函数和FreeGLUT库的头文件。
数据结构和变量
typedef struct { GLfloat x, y; } point;: 定义一个名为'point'的结构体, 用于表示二维点, 包含x和y坐标。point p0 = { 0,50 };: 定义一个名为'p0'的point类型的变量, 并初始化其坐标为(0, 50)。GLfloat finishx = 300;: 定义一个名为'finishx'的GLfloat类型的变量, 用于存储竖直轴的x坐标, 并初始化为300。
display函数
void display(void): 定义显示函数, 该函数在窗口需要重绘时被调用。glMatrixMode(GL_PROJECTION);: 设置当前矩阵模式为投影矩阵。glLoadIdentity();: 重置当前矩阵为单位矩阵。gluOrtho2D(0, 600, 0, 400);: 设置二维正交投影, 视口范围为(0, 0)到(600, 400)。glClearColor(0, 0, 1, 1);: 设置清除颜色为蓝色。glClear(GL_COLOR_BUFFER_BIT);: 清除颜色缓冲区, 使用之前设置的清除颜色填充窗口。glColor3f(...): 设置绘制颜色。glBegin(GL_LINES); ... glEnd();: 绘制线段。glBegin(GL_POLYGON); ... glEnd();: 绘制多边形。glVertex2f(...): 设置顶点坐标。glutSwapBuffers();: 交换前后缓冲区, 将绘制内容显示到屏幕上。
main函数
int main(int argc, char** argv): 程序的主函数入口。glutInit(&argc, argv);: 初始化GLUT库。glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);: 设置显示模式, 使用双缓冲和RGB颜色模式。glutInitWindowPosition(100, 100);: 设置窗口在屏幕上的位置。glutInitWindowSize(600, 400);: 设置窗口的大小。glutCreateWindow('My Interactive Window');: 创建窗口并设置标题。glutDisplayFunc(display);: 设置显示回调函数, 当窗口需要重绘时调用'display'函数。glutMainLoop();: 进入GLUT主循环, 处理窗口事件和回调函数。
总结
该代码示例演示了如何使用FreeGLUT库创建一个简单的交互式OpenGL窗口。它涵盖了基本概念, 如设置投影、清除颜色缓冲区、绘制基本图形和进入主循环处理事件。您可以根据此示例代码进行扩展, 添加更多功能和交互性, 创建更复杂的OpenGL应用程序。
原文地址: https://www.cveoy.top/t/topic/CwY 著作权归作者所有。请勿转载和采集!