当前位置: 首页 > ds >正文

glPushMatrix/glPopMatrix简介及示例(在不同位置绘制图形)

glPushMatrix()函数

glPushMatrix()函数是OpenGL中的一个栈操作函数,用于将当前矩阵压入栈中。

在OpenGL中,矩阵是用来对三维坐标进行变换的工具。例如,使用glTranslatef()函数可以对坐标进行平移变换,使用glRotatef()函数可以对坐标进行旋转变换。

在调用glPushMatrix()函数之后,当前矩阵会被复制一份并压入栈中。这样,在之后的操作中,可以使用栈顶的矩阵进行变换,而不会影响之前的变换。

压入的当前矩阵是什么?

glPushMatrix()函数压入的是当前矩阵,当前矩阵是一个4*4的矩阵,用来存储当前所有变换信息。在OpenGL中,进行坐标变换时,会对当前矩阵进行相应的操作,例如平移、旋转、缩放等。

例如,在调用 glTranslatef(1.0, 0.0, 0.0) 之后,当前矩阵会被更新成平移矩阵,在调用glRotatef(30, 0.0, 1.0, 0.0)之后,当前矩阵会被更新成旋转矩阵。

glPushMatrix() 函数将当前矩阵复制一份并压入栈中,这样就可以在之后的操作中使用栈顶的矩阵进行变换而不会影响之前的变换。

示例:OpenGL一次画三个不同位置的圆柱体

在OpenGL中绘制三个不同位置的圆柱体,可以使用glPushMatrix()和glPopMatrix()函数。

首先,在绘制第一个圆柱体之前调用glPushMatrix(),这样可以将当前矩阵压入栈中。然后在绘制第一个圆柱体时,使用glTranslatef()函数将其平移到需要的位置。接着在绘制第二个圆柱体之前调用glPushMatrix(),并使用glTranslatef()函数将其平移到另一个位置。同理绘制第三个圆柱体。最后,在绘制完第三个圆柱体之后,需要调用glPopMatrix()两次 将矩阵出栈,这样才能保证矩阵变换不会影响后续的渲染。

如果你需要对每个圆柱体做不同的旋转或缩放,那么在glPushMatrix()和glTranslatef()之间增加glRotatef()或glScalef()函数即可。

下面是一个简单的示例,绘制三个不同位置的圆柱体,并将其旋转不同的角度。

glPushMatrix()
glTranslatef(1.0, 0.0, 0.0)
glRotatef(30, 0.0, 1.0, 0.0)
drawCylinder()
glPopMatrix()glPushMatrix()
glTranslatef(-1.0, 0.0, 0.0)
glRotatef(-30, 0.0, 1.0, 0.0)
drawCylinder()
glPopMatrix()glPushMatrix()
glTranslatef(0.0, 0.0, 1.0)
glScalef(0.5, 0.5, 0.5)
drawCylinder()
glPopMatrix()

在绘制圆柱体时,需要对每个圆柱体进行不同的平移和旋转变换,所以需要使用glPushMatrix()函数将当前矩阵压入栈中,这样可以保证每个圆柱体之间互不影响。

使用glPopMatrix()函数可以将当前矩阵从栈中弹出。这样可以保证当前矩阵只包含当前圆柱体的变换。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/m0_57236802/article/details/128702506

http://www.xdnf.cn/news/11349.html

相关文章:

  • 简单邮件传输协议(SMTP)
  • 【apache-tomcat安装配置】完整教程(保姆级)
  • MapX学习基本教程
  • 内存错误的原因和解决方法
  • Linux命令集(Linux文件管理命令--rm指令篇)
  • Android 开发环境搭建的步骤
  • 2024年最全Android修改PackageInstaller自动安装指定应用(3),面试被说跳槽频繁
  • 戴尔服务器安装windows server 2016提示:安装无法找到install.wim 错误代码0x80070026
  • 自动生成--Delphi多层数据库应用项目源代码
  • Delphi入门教程
  • 【Libra 技术解读】详解LibraBFT共识机制
  • Android Path菜单的简单实现
  • C#论坛
  • 数学之美:杨辉三角(帕斯卡三角)的奇特性质
  • 基于C语言的学生信息管理系统开发
  • JSP基于ssm的毕业论文管理系统rz7q5--(程序+源码+数据库+调试部署+开发环境)
  • 粉碎城堡链游Castle Crush,必看全新评测与攻略
  • a标签中href调用js的几种方法,程序员进阶
  • RIP路由协议详解
  • GBK编码表
  • GB2312/GBK/GB18030/BIG5 的历史
  • Vue中使用js-audio-recorder插件实现录音功能并实现上传Blob数据到SpringBoot后台接口
  • 【Java-API】lambda表达式4种方法引用
  • 磁盘分区魔法师Norton PartitionMagic(PQ8.0)使用图解和使用(搜藏)
  • 2023年-华为机试题库B卷(Python)【满分】
  • 谈谈MYSQL中的Explain
  • BootLoader这个玩意
  • Window.Open参数详解
  • 局域网的管理
  • 单板计算机的功能有哪些??