实验5 OpenGL二维几何变换

发布时间:2026/7/22 15:39:19

实验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

相关新闻

看懂芯片系统框图,从 RP2040 的 “微型工厂” 开始

看懂芯片系统框图,从 RP2040 的 “微型工厂” 开始

2026/7/22 15:39:19

芯片系统框图 对于任何芯片,框图都是学习的核心起点 —— 它是芯片的 “架构说明书”,能帮你建立对芯片的​系统性认知​(而非零散的功能罗列),这是学习所有芯片的统一路径。通过框图,你能先掌握以下通用维…

阿里云 Docker 镜像加速器完整评测(生产环境必看,2026 最新规则)

阿里云 Docker 镜像加速器完整评测(生产环境必看,2026 最新规则)

2026/7/22 15:39:19

目录 一、核心定位与硬性限制(最关键) 强制限制(官方 2024-07 公告生效)阿里云帮助... 二、优点(阿里云内网环境极强) 三、致命缺点(生产环境短板) 四、分场景生产使用方案 场…

html之flex伸缩盒子;grid布局

html之flex伸缩盒子;grid布局

2026/7/22 15:39:19

flex伸缩盒子 利用flex伸缩盒子可以把父级下的div的换行去掉,排列在一行中 demo来自微信小程序 先将父级div定义成伸缩盒子,然后子级每份占据1份父类空间flex简述 flex中三个属性&#xff1b;在后端看来这是flex构造方法的3个入参 flex: <flex-grow> <flex-shrink>…

从0到1掌握TuneUp JS:iOS自动化测试框架搭建全流程

从0到1掌握TuneUp JS:iOS自动化测试框架搭建全流程

2026/7/22 17:59:25

从0到1掌握TuneUp JS&#xff1a;iOS自动化测试框架搭建全流程 【免费下载链接】tuneup_js A JavaScript library to ease automated iOS UI testing with UIAutomation and Instruments. 项目地址: https://gitcode.com/gh_mirrors/tu/tuneup_js TuneUp JS是一款基于Ap…

MCP对话式剪辑技术:重构视频创作流程

MCP对话式剪辑技术:重构视频创作流程

2026/7/22 17:59:25

1. 对话式剪辑技术解析&#xff1a;MCP如何重构视频创作流程在视频创作领域&#xff0c;专业剪辑软件的学习曲线往往让非专业用户望而却步。最近接触到的MCP&#xff08;Model Context Protocol&#xff09;技术&#xff0c;通过对话交互的方式彻底改变了这一现状。以火山引擎V…

深远海漂浮式光伏平台关键技术解析与应用

深远海漂浮式光伏平台关键技术解析与应用

2026/7/22 17:59:25

1. 项目背景与核心价值漂浮式光伏技术正在从近岸走向深远海&#xff0c;这个转变背后是海洋清洁能源开发的必然趋势。去年在青岛参加海洋能大会时&#xff0c;我和几位同行就讨论过&#xff1a;传统固定式海上光伏在20米以浅水域尚可实施&#xff0c;但一旦进入30米以上水深区域…

百考通:AI赋能,提供直观示例参考,让调研都高效落地

百考通:AI赋能,提供直观示例参考,让调研都高效落地

2026/7/22 17:59:25

在数字化时代&#xff0c;市场调研、产品设计、学术研究等场景中&#xff0c;问卷设计作为核心环节&#xff0c;直接影响着数据收集的质量与工作推进的效率。传统问卷设计往往面临流程繁琐、耗时耗力、问题设计不精准等痛点&#xff0c;而百考通&#xff08;https://www.baikao…

TMS320F2837xD GPIO配置全解析:从复用机制到实战避坑

TMS320F2837xD GPIO配置全解析:从复用机制到实战避坑

2026/7/22 17:59:25

1. 项目概述与核心价值 在嵌入式系统开发中&#xff0c;尤其是基于德州仪器&#xff08;TI&#xff09;C2000系列DSP&#xff08;如TMS320F2837xD&#xff09;的电机控制、数字电源或工业自动化项目里&#xff0c;GPIO&#xff08;通用输入输出&#xff09;的配置是硬件驱动层最…

讲透 LangGraph:从状态图到 Agent 工程化|create_react_agent:Agent 循环如何建图

讲透 LangGraph:从状态图到 Agent 工程化|create_react_agent:Agent 循环如何建图

2026/7/22 17:49:25

前面十二篇&#xff0c;我们从 StateGraph 一路讲到了 reducer、条件边、并行、Send、checkpoint、interrupt、time travel、subgraph 和 Runtime。 这些能力看起来很分散&#xff0c;但当你调用一个预构建 Agent 工厂时&#xff0c;它们会被组装到同一张图里。 最典型的入口…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/21 5:45:57

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/21 9:56:14

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵&#xff08;连锁便利店/商超标准配置&#xff09; 自助收银Kiosk一体机&#xff1a;顾客结算、自助核销优惠券、商品素材预览&#xff1b;运营折叠平板&#xff1a;店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/21 3:09:32

1 和小红书类似&#xff0c;可以采用类似判断方法------------其实他比小红书好判断&#xff0c;因为他没有图片&#xff0c;控件位置几乎是固定的&#xff0c;都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的&#xff0c;所以我就…

设计EDA 首席专家 12 维度 JD(HR 仅高管 / HRD 使用)

设计EDA 首席专家 12 维度 JD(HR 仅高管 / HRD 使用)

2026/7/22 0:08:09

定位&#xff1a;公司 EDA 技术最高负责人、技术天花板、战略级专家、流片总兜底人 属于P9/Fellow/ 首席科学家级&#xff0c;不做日常执行&#xff0c;管方向、管架构、管风险、管突破。1. 对标层级内部职级&#xff1a;P9 / 首席专家 / Fellow 外部对标&#xff1a;华为 20–…

费用率无法实时监控怎么办?费用率联动预算管理怎么实现?

费用率无法实时监控怎么办?费用率联动预算管理怎么实现?

2026/7/22 0:08:09

很多企业费用管控存在严重滞后性&#xff1a;日常差旅、招待、营销、人力费用持续发生&#xff0c;但费用率只能等到月末结账、营收数据出来后才能计算核对&#xff0c;月度中途费用超标、营收不达标导致的费用率失衡完全无法感知。等到月末发现整体费用率远超预算目标时&#…

设计EDA 研发总监 12 维度 JD(HR 内部仅高管层使用)

设计EDA 研发总监 12 维度 JD(HR 内部仅高管层使用)

2026/7/22 0:08:09

定位&#xff1a;公司 EDA / 设计平台最高管理岗&#xff0c;技术 管理 经营三重决策&#xff0c;对整体流片、效率、质量、成本、团队负最终责任1. 对标层级内部职级&#xff1a;M3 / P8 / 总监级 外部对标&#xff1a;华为 20 级、互联网 M2 / 总监、头部芯片 / EDA 公司研…