计算机图形图像技术(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# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • 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