使用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应用程序。

使用FreeGLUT创建交互式OpenGL窗口

原文地址: https://www.cveoy.top/t/topic/CwY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录