实验5 OpenGL二维几何变换
1实验目的理解并掌握OpenGL二维平移、旋转、缩放变换的方法。2实验内容(1)阅读实验原理掌握OpenGL程序平移、旋转、缩放变换的方法。(2)根据示范代码完成实验作业。3实验原理(1) OpenGL下的几何变换在OpenGL的核心库中每一种几何变换都有一个独立的函数所有变换都在三维空间中定义。平移矩阵构造函数为glTranslatef,d(tx, ty, tz)作用是把当前矩阵和一个表示移动物体的矩阵相乘。tx、ty、tz指定这个移动物体的矩阵它们可以是任意的实数值后缀为f单精度浮点float或d双精度浮点double对于二维应用来说tz0.0。旋转矩阵构造函数为glRotatef,d(theta, vx, vy, vz)作用是把当前矩阵和一个表示旋转物体的矩阵相乘。thetavxvyvz指定这个旋转物体的矩阵物体将围绕(0,0,0)到(x,y,z)的直线以逆时针旋转参数theta表示旋转的角度。向量v(vx,vy,vz)的分量可以是任意的实数值该向量用于定义通过坐标原点的旋转轴的方向后缀为f单精度浮点float或d双精度浮点double对于二维旋转来说vx0.0vy0.0vz1.0。缩放矩阵构造函数为glScalef,d(sx, sy, sz)作用是把当前矩阵和一个表示缩放物体的矩阵相乘。sxsysz指定这个缩放物体的矩阵分别表示在xyz方向上的缩放比例它们可以是任意的实数值当缩放参数为负值时该函数为反射矩阵缩放相对于原点进行后缀为f单精度浮点float或d双精度浮点double。注意这里都是说“把当前矩阵和一个表示移动旋转, 缩放物体的矩阵相乘”而不是直接说“这个函数就是旋转”或者“这个函数就是移动”这是有原因的马上就会讲到。假设当前矩阵为单位矩阵然后先乘以一个表示旋转的矩阵R再乘以一个表示移动的矩阵T最后得到的矩阵再乘上每一个顶点的坐标矩阵v。那么经过变换得到的顶点坐标就是((RT)v)。由于矩阵乘法满足结合率((RT)v) R(Tv))换句话说实际上是先进行移动然后进行旋转。即实际变换的顺序与代码中写的顺序是相反的。由于“先移动后旋转”和“先旋转后移动”得到的结果很可能不同初学的时候需要特别注意这一点。(2) OpenGL下的各种变换简介我们生活在一个三维的世界如果要观察一个物体我们可以① 从不同的位置去观察它人运动选定某个位置去看。视图变换② 移动或者旋转它当然了如果它只是计算机里面的物体我们还可以放大或缩小它物体运动让人看它的不同部分。模型变换③ 如果把物体画下来我们可以选择是否需要一种“近大远小”的透视效果。另外我们可能只希望看到物体的一部分而不是全部指定看的范围。投影变换④ 我们可能希望把整个看到的图形画下来但它只占据纸张的一部分而不是全部指定在显示器窗口的那个位置显示。视口变换这些都可以在OpenGL中实现。从“相对移动”的观点来看改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。在OpenGL中实现这两种功能甚至使用的是同样的函数。由于模型和视图的变换都通过矩阵运算来实现在进行变换前应先设置当前操作的矩阵为“模型视图矩阵”。设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数例如glMatrixMode(GL_MODELVIEW);该语句指定一个4×4的建模矩阵作为当前矩阵。通常我们需要在进行变换前把当前矩阵设置为单位矩阵。把当前矩阵设置为单位矩阵的函数为glLoadIdentity();我们在进行矩阵操作时有可能需要先保存某个矩阵过一段时间再恢复它。当我们需要保存时调用glPushMatrix()函数它相当于把当前矩阵压入堆栈。当需要恢复最近一次的保存时调用glPopMatrix()函数它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。OpenGL规定堆栈至少可以容纳32个矩阵某些OpenGL实现中堆栈的容量实际上超过了32个。因此不必过于担心矩阵的容量问题。通常用这种先保存后恢复的措施比先变换再逆变换要更方便、更快速。注意模型视图矩阵和投影矩阵都有相应的堆栈。使用glMatrixMode来指定当前操作的究竟是模型视图矩阵还是投影矩阵。4实验代码#include GL/glut.h void init (void) { glClearColor (1.0, 1.0, 1.0, 0.0); glMatrixMode (GL_PROJECTION); gluOrtho2D (-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0 glMatrixMode (GL_MODELVIEW); } void drawSquare(void) //绘制中心在原点边长为2的正方形 { glBegin (GL_POLYGON); //顶点指定需要按逆时针方向 glVertex2f (-1.0f,-1.0f); //左下点 glVertex2f (1.0f,-1.0f); //右下点 glVertex2f (1.0f, 1.0f); //右上点 glVertex2f (-1.0f,1.0f); //左上点 glEnd ( ); } void myDraw (void) { glClear (GL_COLOR_BUFFER_BIT); //清空 glLoadIdentity(); //将当前矩阵设为单位矩阵 glPushMatrix(); glTranslatef(0.0f,2.0f,0.0f); glScalef(3.0,0.5,1.0); glColor3f (1.0, 0.0, 0.0); drawSquare(); //上面红色矩形 glPopMatrix(); glPushMatrix(); glTranslatef(-3.0,0.0,0.0); glPushMatrix(); glRotatef(45.0,0.0,0.0,1.0); glColor3f (0.0, 1.0, 0.0); drawSquare(); //中间左菱形 glPopMatrix(); glTranslatef(3.0,0.0,0.0); glPushMatrix(); glRotatef(45.0,0.0,0.0,1.0); glColor3f (0.0, 0.7, 0.0); drawSquare(); //中间中菱形 glPopMatrix(); glTranslatef(3.0,0.0,0.0); glPushMatrix(); glRotatef(45.0,0.0,0.0,1.0); glColor3f (0.0, 0.4, 0.0); drawSquare(); //中间右菱形 glPopMatrix(); glPopMatrix(); glTranslatef(0.0,-3.0,0.0); glScalef(4.0,1.5,1.0); glColor3f (0.0, 0.0, 1.0); drawSquare(); //下面蓝色矩形 glFlush ( ); } void main (int argc, char** argv) { glutInit (argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition (0, 0); glutInitWindowSize (600, 600); glutCreateWindow (几何变换示例); init(); glutDisplayFunc (myDraw); glutMainLoop(); }运行结果如图A.5a所示。图A.5a5实验提高绘制如图A.5b所示图形。图A.5b

相关新闻

汽车密封件和磁材的AI视觉检测方案——缺陷分类与光学成像的工程原理

汽车密封件和磁材的AI视觉检测方案——缺陷分类与光学成像的工程原理

AI视觉检测在汽车零部件和磁材加工两个行业中的部署密度持续提升。以下以安徽密封件企业和磁材企业的设备方案为样本做缺陷分类和光学原理的技术分析。密封件四类缺陷的光学成像原理裂纹。密封件在硫化成型或冷却脱模过程中热应力集中区域容易出现线性开裂,裂纹宽度…

2026/7/23 17:36:22 阅读更多 →
Hugging Face遭自主AI Agent入侵,防御方用AI反击

Hugging Face遭自主AI Agent入侵,防御方用AI反击

Hugging Face本周披露,其检测并遏制了一次生产基础设施入侵事件。该攻击由自主AI Agent系统端到端驱动,而防御方则利用其基于AI的法医分析手段进行反击。自主AI Agent攻入生产基础设施攻击者利用Hugging Face数据集处理流程中的两个代码执行漏洞&#xf…

2026/7/22 15:37:57 阅读更多 →
【Redis】----如何测试redis单机的最大并发

【Redis】----如何测试redis单机的最大并发

文章目录一、Python 压测脚本1.1、redis_concurrent_test.py1.2、关键说明1.3、进阶优化建议(可选)1.4、协程版本补充(高并发推荐)二、redis内部提供的命令2.1、命令 redis-benchmark2.2、参数解释2.3、压测结果解读(G…

2026/7/23 17:37:21 阅读更多 →

最新新闻

两台linux 服务器同步修改的文件

两台linux 服务器同步修改的文件

两台服务器同步修改的文件 为什么用 * 会报错? 未指定递归:scp 默认只拷贝单个文件。如果不加 -r 参数,遇到文件夹(如 res、src、assets)时,它会报错 not a regular file 并跳过。目标路径被本地 Shell 解析…

2026/7/23 17:37:16 阅读更多 →
vm虚拟机安装lede旁路由_Vmware虚拟机安装LEDE实现软路由openwrt

vm虚拟机安装lede旁路由_Vmware虚拟机安装LEDE实现软路由openwrt

我们曾在群里Nas里安装了LEDE实现了软路由openwrt,今天我们在虚拟机里通过Vmware虚拟机安装LEDE实现软路由openwrt,OpenWRT是目前网络上比较流行的路由器固件,有着强大的功能和扩展性,一个嵌入式的 Linux 发行版,OpenWrt的包管理提…

2026/7/23 17:37:16 阅读更多 →
计算机Django毕设实战-基于 Django 框架的贵州土特产展销管理系统 黔货出山数字化平台 —— 贵州特色产品商城设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机Django毕设实战-基于 Django 框架的贵州土特产展销管理系统 黔货出山数字化平台 —— 贵州特色产品商城设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/23 17:37:16 阅读更多 →
计算机Django毕设实战-基层社区居民健康报备管控系统设计与实现 基于 Django 的常态化社区疫情防控管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机Django毕设实战-基层社区居民健康报备管控系统设计与实现 基于 Django 的常态化社区疫情防控管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/23 17:37:16 阅读更多 →
计算机Django毕设实战-高校学生综合素质量化测评系统设计 基于 Python 的学生综测成绩统计分析系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机Django毕设实战-高校学生综合素质量化测评系统设计 基于 Python 的学生综测成绩统计分析系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/23 17:37:16 阅读更多 →
Tiva™ TM4C129LNCZAD GPTM定时器中断配置与寄存器详解

Tiva™ TM4C129LNCZAD GPTM定时器中断配置与寄存器详解

1. GPTM中断与定时器配置的核心逻辑在嵌入式开发里,定时器就像你手腕上的秒表,而中断就是秒表到点后发出的“滴滴”声,提醒你该干下一件事了。Tiva™ TM4C129LNCZAD微控制器里的通用定时器模块(GPTM)功能强大&#xff…

2026/7/23 17:36:16 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻