计算机图形图像技术(OpenGL的基本图元)

2023-12-05

一、实验原理

1、OpenGL程序框架

#include <GL/freeglut.h>
void init(){ 
    /* 全局初始化。主要用于设置一些全局的状态,如颜色模式、
    窗口的初始位置和大小等。使用默认值时不需要定义该函数。*/
}
void init2(){
    /* 当前窗口初始化。主要用于设置一些与当前窗口关联的状态或开关,如光照处理、
    光源特性、深度检测和裁剪等。使用默认值时不需要定义该函数。*/
}
void Reshape(int w, int h){ 
    /* 设置投影方式和观察体。主要使用glViewport()、glOrtho()、glFrustum()、
    gluPerspective()和gluOrtho2D()等。使用默认值时不需要定义该函数。*/
}
void Paint(){ 
    /* 使用OpenGL库函数构造对象的数学描述,包括点线面的位置、
    几何变换和光照处理等,是OpenGL的主要部分。*/
}
int main(int argc, char *argv[]){ 
    glutInit(&argc, argv); // 初始化GLUT, 记录main()的参数
    init(); // 全局初始化, 使用默认值时不是必需的
    glutCreateWindow("窗口标题"); // 创建程序窗口,指定窗口标题
    init2(); // 当前窗口初始化, 使用默认值时不是必需的
    // 注册回调函数
    glutDisplayFunc(Paint); // 指定场景绘制函数,必需
    glutReshapeFunc(Reshape); // 指定窗口变化回调函数,缺省则使用默认值
    glutMainLoop(); // 开始循环执行OpenGL命令
}

2、OpenGL部分函数说明

(1)初始化GLUT库: void glutInit(int *argc, char **argv);

(2)设置窗口的初始大小: void glutInitWindowSize(int width, int height);

(3)进入GLUT事件处理循环: void glutMainLoop(void);

(4)注册窗口变化回调函数: void glutReshapeFunc(void (*func)(int width, int height));

(5)注册场景绘制函数: void glutDisplayFunc(void (*func)(void));

(6)清除颜色缓冲区: void glClear(GL_COLOR_BUFFER_BIT);

(7)指定背景颜色: void glClearColor(float red, float green, float blue, float alpha);

(8)结束绘图并返回: void glFlush(void);

(9)基本图元定义的开始: void glBegin(GLenum mode);

(10)基本图元定义的结束: void glEnd(void);

(11)消除其他视口中的物体变换对当前视口的影响: void glLoadIdentity();

(12)将物体绕旋转轴(0,0,0)~(x,y,z) 旋转th度以调整物体的方向: void glRotatef(GLfloat th, GLfloat x, GLfloat y, GLfloat z);

3、基本图元部分预定义几何形体

(1)矩形: void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);

(2)立方体:

① 实心立方体: void glutSolidCube(GLdouble size);

② 线框立方体: void glutWireCube(GLdouble size);

(3)球面:

① 实心球面: void glutSolidSphere(GLdouble radius, int slices, int stacks);

② 线框球面: void glutWireSphere(GLdouble radius, int slices, int stacks);

(4)犹他茶壶:

① 实心立方体: void glutSolidTeapot(GLdouble size);

② 线框立方体: void glutWireTeapot(GLdouble size);


二、算法程序

1、使用OpenGL和GLUT编写一个显示线框球体的简单图形程序。其中球体半径为0.8,经线数为24,纬线数为12,并绕x轴旋转30度,程序窗口的大小为(200,200),标题为“线框球”;

#include <GL/glut.h>
void Paint() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    glRotated(30, 1, 0, 0);
    glutWireSphere(0.8, 20, 20);
    glFlush();
}
int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitWindowSize(200, 200);
    glutCreateWindow("线框球");
    glutDisplayFunc(Paint);
    glutMainLoop();
    return 0;
}

2、使用OpenGL、GLU和GLUT编写一个显示线框立方体的程序。其中立方体的半径为1.5单位,并首先绕(0, 0, 0)~(1, 1, 0)旋转30度,然后远移6.5单位;观察体规定为:视场角=30度,宽高比=1,近=1,远=100;程序窗口的大小为(200, 200),标题为“线框立方体”。

#include <GL/glut.h>
void Paint() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    gluPerspective(30, 1, 1, 100);
    glTranslatef(0, 0, -6.5);
    glRotated(30, 1, 1, 0);
    glutWireCube(1.5);
    glFlush();
}
int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitWindowSize(200, 200);
    glutCreateWindow("线框立方体");
    glutDisplayFunc(Paint);
    glutMainLoop();
    return 0;
}

3、使用OpenGL、GLU和GLUT编写一个三维犹他茶壶程序。其中茶壶的半径为1单位,并远移6.5单位;观察体规定为:视场角=30度,宽高比=1,近=1,远=100;程序窗口的大小为(200, 200),标题为“旋转的犹他茶壶”。茶壶绕z方向中轴不断旋转,旋转的时间间隔为25毫秒,角度间隔为2度。注意旋转角度必须限定在0~360度以内。

#include <GL/glut.h>
int angle = 0;
void Paint() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    gluPerspective(30, 1, 1, 100);
    glTranslatef(0, 0, -6.5);
    glRotated(angle, 0, 0, 1);
 	glutSolidTeapot(1);
 	glFlush();
}
void timer(int millis){
 	angle = (angle + 2) % 360;
    glutPostRedisplay();
    glutTimerFunc(millis, timer, millis);
}
int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitWindowSize(200, 200);
    glutCreateWindow("旋转的犹他茶壶");
    glutTimerFunc(25, timer, 25);
    glutDisplayFunc(Paint);
    glutMainLoop();
    return 0;
}

三、结果演示

1、线框球

2、线框立方体

3、旋转的犹他茶壶

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机图形图像技术(OpenGL的基本图元) 的相关文章

  • 将 C++ 代码(本机客户端)移植到浏览器(Web 应用程序)

    我有一个使用 Qt creator SDK 编写的 C 模块 我想将此代码移植到任何网页上运行 而不会对最终用户损害源代码 用户应该能够在任何浏览器 Chrome Firefox Safari Explorer 上看到此模块的输出 而无需安
  • 为什么在从同一解决方案引用另一个项目时会出现 FileNotFound 异常?

    我正在学习如何使用 NUnit 我的解决方案中有我的主项目 并在同一解决方案中创建了一个单独的项目 该项目将保存我的单元测试 并具有自己的命名空间 从该项目中 我添加对主项目的引用并添加 using MainProjectNamespace
  • strtok() 和空字段

    我正在将一些 C 结构序列化为字符串 然后将其反序列化strtok 但不幸的是 strtok 不检测空字段 例如 1 2 4 有没有替代功能 在linux上有strsep http www mkssoftware com docs man3
  • 从数组中输入多个数字,每个数字检查是否为整数

    每个人 我希望有人能帮我弄清楚C语言的一些东西 这是我第一次认真地做IT方面的作业 我没有经验 而且我正在电子学习中学习 所以老师的帮助不是很好 我需要用C语言开发控制台应用程序 用户需要输入10个整数 如果插入的数字不是整数 需要输出错误
  • Web 应用程序框架:C++ 与 Python

    作为一名程序员 我熟悉 Python 和 C 我正在考虑编写自己的简单 Web 应用程序 并且想知道哪种语言更适合服务器端 Web 开发 我正在寻找一些东西 它必须是直观的 我认识到 Wt 存在并且它遵循 Qt 的模型 我讨厌 Qt 的一件
  • 以概率从列表中选择随机元素

    我有一个包含四个项目 A B C D 的列表 每个项目都有被选择的概率 例如 A 有 74 的机会被选中 B 15 C 7 D 4 我想创建一个函数 根据其概率随机选择一个项目 有什么帮助吗 为您的项目定义一个类 如下所示 class It
  • 找不到 HttpContextBase 命名空间

    public string GetCartId HttpContextBase context if context Session CartSessionKey null if string IsNullOrWhiteSpace cont
  • .NET Core 2 - 从启动中调用存储库方法[重复]

    这个问题在这里已经有答案了 我有以下存储库和类 public interface IValueService GetAll public class ValueService IValueService private DataContex
  • 如何获取 C# PriorityQueue 元素的优先级

    我正在初始化一个存储 XY 坐标的优先级队列 根据距原点的欧几里得距离确定优先级 我创建了一个自定义Comparer这使得它作为最大堆运行 PriorityQueue
  • 析构函数、dispose 和 Finalize 方法之间的区别

    我正在研究垃圾收集器在 C 中的工作原理 我对使用感到困惑Destructor Dispose and Finalize方法 根据我的研究和理解 在我的类中拥有析构函数方法将告诉垃圾收集器以析构函数方法中提到的方式执行垃圾收集 该方法不能在
  • C++ 为非虚方法指定初始化

    我有 a h 如下所示 class A public void doSomething 0 然后我有 b h 如下所示 include a h class b public A public void doSomething 我只是想通过尝
  • 使用 INF 文件 C++ 以编程方式安装驱动程序

    这里有人可以告诉我如何安装第 3 方设备驱动程序吗 如果提供了所有必需的文件 即 inf 文件 sys 等 则以编程方式进行 这 该解决方案应运行的最低操作系统是Windows2000 我尝试复制 inf文件放入Win文件夹 INF文件夹和
  • 尝试缓冲区溢出

    我正在尝试使用缓冲区溢出来更改函数的结果 以使用以下代码更改堆栈上的结果 include
  • 具有多重继承的不明确基数

    我正在尝试在一个大库中编写一些类的子类 我收到 基础不明确 错误 这是该问题的一个可编译示例 include
  • 使用 unrar 库 - 将文件提取到文件流缓冲区中

    我需要的是能够将 rar 文件中的文件提取到流中 我正在创建一个测试用例来了解如何使用解压源文件 http www rarlab com rar unrarsrc 3 9 9 tar gz 我已经搜索和修补了一段时间 但我不知道如何使用该库
  • C++头文件问题

    我在处理类时尝试了一些 C 代码 这个问题出现在我身上 并且让我有点烦恼 我创建了一个包含类定义的头文件和一个包含实现的 cpp 文件 如果我在不同的 cpp 文件中使用此类 为什么要包含头文件而不是包含类实现的 cpp 文件 如果我包含类
  • 向窗口句柄发送消息

    我尝试使用 sendmessage 将消息从我的 C 应用程序传递到 C 我的c 代码是这样的 int tmain int argc TCHAR argv COPYDATASTRUCT cpd cpd dwData 0 LPCWSTR st
  • 如何在 C# 中停止程序进一步执行

    string FirstName Console ReadLine if FirstName Length gt 12 Console WriteLine if FirstName Length lt 3 Console WriteLine
  • 使用 Powershell 或 C# 获取 Azure“文件和文件夹”作业状态

    我一直在尝试找到一种方法来获取在 AzureRM 中运行的几个客户上运行的 文件和文件夹 备份作业的状态 可以在 AzureRm 门户中手动找到状态 恢复服务保管库 gt 作业 gt 备份作业 使用powershell不显示任何作业信息 G
  • InvalidOperationException:没有为方案“CookieSettings”注册身份验证处理程序

    我正在使用 ASP Net MVC core 2 1 开发一个应用程序 其中不断出现以下异常 InvalidOperationException 没有为方案 CookieSettings 注册身份验证处理程序 注册的方案有 Identity

随机推荐

  • Google Guava 字符串工具使用详解

    文章目录 字符串工具 Strings Joiner Splitter CharMatcher CaseFormat 字符串工具 工具类 描述
  • Oracle的数据一致性机制原理

    一 前言 在单用户环境下 在操作数据库是不需要考虑其他用户会修改同一个数据 但是在多用户的情况下 多个事务可能会修改同一个数据 最终会得到错误的数据结果 Oracle数据库是通过 multiversion consistency model
  • Linux性能优化知识点总结大全 · 实践+收藏版

    原文 https www ctq6 cn 作者 mikelLam Part1Linux性能优化 1性能优化 性能指标 高并发和响应快对应着性能优化的两个核心指标 吞吐 和 延时 图片来自 www ctq6 cn 应用负载 角度 直接影响了产
  • Google Guava 事件总线工具使用详解

    文章目录 事件总线 特点 使用 事件总线 Guava 事件总线 EventBus 是 Google Guava 库中的一个组件 用于实现发布 订阅模式的事件通信 它提供了一种简单而强大的方式 让不同的组件之间能够解耦 相互通信 完成事件处理
  • 11种流行的渗透测试工具

    11种流行的渗透测试工具 11种渗透测试工具 非常适合检测漏洞并准确模拟网络攻击 让我们看一下它们的功能和兼容的平台 您是否一直在寻找最能满足您的Web应用程序和网络安全测试要求的渗透测试工具 您是否要比较和分析不同的渗透测试工具 并确定最
  • “IT小百科”之“Windows自带的服务和系统进程详解”

    IT小百科 之 Windows自带的服务和系统进程详解 大家平时打开任务管理器的时候 就能看到 系统进程和系统服务 有好多是新安装的应用程序进程和服务 但是还有很多系统进程和服务 这些进程和服务有哪些 分别起什么作用 能不能关闭和删除 今天
  • Power shell如何加载个人配置

    Power shell如何加载个人配置 在这里 为什么我的Powershell无法记录History 安装 Get InstalledModule Install Module Name PowerShellGet Force Instal
  • Redis数据类型

    文章目录 Redis介绍 RedisObject的结构 1 type 2 enconding 3 lru 4 refcount 5 prt Redis源码结构
  • 基于一致性理论的孤岛微电网分布式控制策略研究(Simulink仿真实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 仿真搭建 2 2 优化控制
  • pdf转word大文件要怎么弄?教你几招

    好消息 今年没有期末考试 坏消息 今年的期末考核是写一篇小论文 看到老师发在群里的消息 一瞬间我竟不知道是该开心还是该难过 不过既来之则安之 这该写的论文咱还是得写 为了能更好地完成这个期末考核 我开始疯狂看文献 试图通过几天时间 恶补 把
  • 如何选择适合自己的量化器?

    随着量化投资的兴起 越来越多的投资者开始关注和使用量化器来辅助投资决策 然而 在众多的量化器中选择适合自己的一款并不容易 本文将从几个关键因素出发 为投资者提供一些建议 帮助他们选择适合自己的量化器 量化器作为一种利用算法和数学模型进行投资
  • 基于GWO-BP灰狼算法优化BP神经网络多维分类预测研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 讲解文档
  • 43 个 Bash 编程最容易犯的错误大全

    Bash Pitfalls 1 文章介绍了 40 多条日常 Bash 编程中 老手和新手都容易忽略的错误编程习惯 每条作者在给出错误的范例上 详细分析与解释错误的原因 同时给出正确的改写建议 文中有不少引用的文章 也值得大家仔细阅读 仔细阅
  • NewportBlakeCTF 2023(NBCTF 2023) Web方向 wp 全

    一共四个web 非常简单的一场国际赛 Inspector Gadget 题目描述 While snooping around this website inspector gadet lost parts of his flag Can y
  • antdPro中EditableProTable可编辑表单编辑行配置可变下拉框选项和赋值其他字段

    避坑 在一个需求中 需要根据上一个下拉框选择的人物来进行对后一个下拉框选项进行变更 并在选中某个人后通过接口对后面的两个字段进行赋值 一开始是准备在onChange中改变下拉框中的options配置 但是发现走不通 需要通过 renderF
  • Redis命令详解

    文章目录 Key 键 DEL EXISTS EXPIRE EXPIREAT PEXPIRE PEXPIREAT PERSIST
  • Google Guava 集合工具使用详解

    文章目录 集合 集合分类 Multiset HashMultiset TreeMultiset LinkedHashMultiset Concur
  • ai抠图在线免费怎么操作?这个教程赶紧码住

    服啦家人们 老板不知道从哪里听说我会一点图片编辑的技术 愣是交给我一个任务 让我把新产品的海报制作出来 还说一周内就要把海报交给他 没办法的我只好硬着头皮上手制作 一开始还蛮简单的 我这三脚猫的图片编辑技术也能稍微派上用场 但是等到要给新产
  • Find My扩展坞|苹果Find My技术与扩展坞结合,智能防丢,全球定位

    扩展坞又称端口复制器 是专为笔记本电脑设计的一种外置设备 通过复制甚至扩展笔记型计算机的端口 可使笔记本电脑与多个配件或外置设备 如电源适配器 网线 鼠标 外置键盘 打印机及外置显示器 方便的一站式连接 随着全球经济复苏 扩展坞市场仍将保持
  • 计算机图形图像技术(OpenGL的基本图元)

    一 实验原理 1 OpenGL程序框架 include