今天忽然感悟到为什么在进行变换之前要用glPushMatrix();这个函数,而在变换完毕后有用glPopMatrix()这两个函数了,赶紧记下来:

    我们在变换坐标的时候,使用的是glTranslatef(),glRotaef()等函数来操作,操作的是什么呢?操作的是当前矩阵,我们也知道,这些坐标变换(翻转,旋转也好)都是通过操作矩阵来实现的,而矩阵相乘是会叠加的,当你用完一个变换函数后,当前操作的矩阵就被改变了,当你还停留在变换以前的思维,我在这个地方绘制恰好是我想要的时候,你会发现再绘制出来的不是在你想要的位置,因为你在操作变换的时候,当前矩阵被改变了。

   比如你在默认情况下在原点画了一个球,然后又进行了一个变换,比如用glTranslatef( 0.0, 0.0, 1.0 );沿z轴移动一定距离又画了一个球,然后你想再在原点画一个大一点的球覆盖原来的那个,当你绘制的时候就会发现,你现在绘制的球已不在你想像的地方了。


我们来做个实验:

代码如下:
void display()
{
glClear( GL_COLOR_BUFFER_BIT );
glShadeModel( GL_SMOOTH );


//现在原点绘制一个红色正方形
glColor3f( 1.0, 0.0, 0.0 );
glRectf( -0.05, -0.05, 0.05, 0.05 );

//glPushMatrix();

//变换--沿x轴移动
    glTranslatef( 0.2, 0.0, 0.0 );

    //glPopMatrix();

//再绘制一个正方形
glColor3f( 0.0, 1.0, 0.0 );
glRectf( -0.05, -0.05, 0.05, 0.05 );//这时,当我们还想在同样位置绘制时,却发现已经偏移

glFlush();
}



    当我们把glPushMatrxi()和glPopMatrix()注释掉以后我们发现,当我们再想在同样的位置绘制一个正方形的时候,就会发现已经按我们的glTransfef()所指定的沿x轴偏移了0.2个单位。

而当我们不把两句函数调用注释掉时,运行发现,绿色的正方形覆盖了原来的红色的正方形。


所以,这两个函数的压栈弹栈是有用地~~~~~~~~~~
这两个函数的具体的执行方式就不扯了,网上n多。
知之为知之,不知百度之
~~~~~~~~~~~~吼吼~~~~~~~~~~


续文:
顿悟这点以后,晚上又突然想明白了另一个大问题:移动光源的位置。
在顿悟以前,总觉得光源该怎么移动呢?那不是十分十分麻烦么,而且不知道怎么办,现在明白了这个道理以后,光照的移动就简单了。
移动方式:
      先pushMatrix()一下,然后在进行移动操作,然后旋转操作,然后指定光源的位置,然后PopMatrix()一下,就完成了。

测试代码:
#include <gl/glut.h>
static int spin = 0;
void init()
{
glShadeModel( GL_SMOOTH );
    glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );
glEnable( GL_DEPTH_TEST );
}

void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 }; 
glPushMatrix();
glTranslatef( 0.0, 0.0, -5.0 );

glPushMatrix();
glRotated( (GLdouble)spin, 1.0, 0.0, 0.0 );
glLightfv( GL_LIGHT0, GL_POSITION, position );
glTranslated( 0.0, 0.0, 1.5 );
glDisable( GL_LIGHTING );
glColor3f( 0.0, 1.0, 0.0 );
glutWireCube( 0.1 );//绿色的下框,代表光源位置
glEnable( GL_LIGHTING );
glPopMatrix();

glutSolidSphere( 0.5, 40, 40 );//被光照的物体
glPopMatrix();
glFlush();
}

void reshape( int w, int h )
{
    glViewport( 0, 0, (GLsizei)w, (GLsizei)h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 40.0, (GLfloat)w/(GLfloat)h, 1.0, 20.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}

void mouse( int button, int state, int x, int y )
{
switch ( button )
{
case GLUT_LEFT_BUTTON:
   if ( state == GLUT_DOWN )
   {
    spin = ( spin + 30 ) % 360;
    glutPostRedisplay();
   }
   break;
default:
   break;
}
}

int main( int argc, char ** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH );
glutInitWindowPosition( 100, 100 );
glutInitWindowSize( 500, 500 );
glutCreateWindow( argv[0] );
init();
glutDisplayFunc( display );
glutReshapeFunc( reshape );
glutMouseFunc( mouse );
glutMainLoop();
return 0;
}


为什么调用glPushMatrix()和glPopMatrix() 转

相关文章

  1. 聚类算法(2)--Mean Shift

    目录 mean shift 算法理论 基本的Mean Shift向量形式 sklearn参数 python—sklearn实例演示 PS&#xff1a; Mean shift 算法是基于核密度估计的爬山算法&#xff0c;可用于聚类、图像分割、跟踪等&#xff0c;因为最近搞一个项目&#xff0c;涉及到这个算法的图像聚类实现…...

    2023/1/31 22:20:42
  2. 破堤模式A

    using System; using System.Collections.Generic; using System.Text; namespace testone { class KB { private int t, t0, Tf; private double hL;//堤坝高度&#xff08;常态&#xff09; public double hr;//堤坝内水高度&#xff08;过…...

    2023/1/31 22:19:56
  3. ListView与ArrayAdapter的使用

    要使用酷炫的listView&#xff0c;必须要会用适配器。 什么是适配器呢&#xff0c;适配器就是将布局和数据连接起来的东西。 比如&#xff0c;一个ListView里面有很多行东西&#xff08;Item&#xff09;&#xff0c;这些东西有可能只是一个字符串&#xff0c;也有可能是一个…...

    2023/1/31 22:19:08
  4. VirtualBox下安装ubuntu虚拟机图文详细教程

    1 VirtualBox安装 请参考&#xff1a;VirtualBoxan下载安装 2 安装前配置 1&#xff09;创建新虚拟机&#xff1a;选择“新建”(快捷键CtrlN)&#xff0c;然后在弹出框如图所示&#xff0c;设置虚拟机名称&#xff0c;虚拟机存放文件夹、类型、版本信息&#xff0c;然后点击…...

    2023/1/31 22:14:16
  5. some useful websit

    候俊杰(个人程序网站) http://www.jjhou.com ** 品 Code Project(编程) http://www.codeproject.com *** Code Guru(编程PoLtUi) http://www.codeguru.com **** 品 VCHELP(vc类copythwa) http://www.copathway.com ** 中国软件(程序综合4192) h…...

    2023/1/31 22:11:07
  6. java quartz 定时器,java 定时器 quartz的使用

    spring 3.0.5 quartz 1.8刚开始用的2.2.1的quartz 因为是spring3.0.5 不支持quartz 2.2.1 。使用时需要注意版本xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://www.springframework.org/schema/beanshttp://www.springframe…...

    2023/1/31 22:10:17
  7. 1.10 编程基础之简单排序 02 奇数单增序列 python

    http://noi.openjudge.cn/ch0110/02/ """1.10 编程基础之简单排序 02 奇数单增序列 http://noi.openjudge.cn/ch0110/02/""" nint(input())alist(map(int,input().split()))lenalen(a)ans01[]i0 while i<lena:if a[i]%21:ans01.extend([int(…...

    2023/1/31 22:07:51
  8. java反射机制 路径_Java 反射机制详解

    引言本文主要介绍Java中&#xff0c;有关反射机制、类的加载过程、以及控制反转方面的内容。Java 反射机制Java创建对象的方式有哪些&#xff1a;new、反射、反序列化、克隆class对象获取的方法有哪些&#xff1a;类名.class、getClass、forName、classLoader.loadClass(‘包类…...

    2023/1/31 22:04:45
  9. updatepanel失效怎么办_UpdatePanel DataGrid 中按钮失效(只刷新本页)的解决办法...

    UpdatePanel DataGrid 中按钮失效(只刷新本页)的解决办法在DataGrid的ItemDataBound中用ScriptManager注册事件响应protected void dgList_ItemDataBound(object sender, DataGridItemEventArgs e){try{switch (e.Item.ItemType){case ListItemType.AlternatingItem:case List…...

    2023/1/31 22:01:31
  10. matlab 图像处理 新浪 应变,基于MATLAB的图像处理程序

    图像变换(傅立叶变换), 图像增强, 边缘检测, 滤波, 图像压缩等.实验工具:MATLAB软件课程设计时间:2008年12月实 验 部 分1. 图像变换程序代码及说明clear allN100;fzeros(50,50); %产生一个50*50的全0数组f(15:35,23:28)1;%定义图像数组&#xff0c;从15行到35行&#xff0c…...

    2023/1/31 21:57:26
  11. ldap基本dn_LDAP DN语法用法

    对于读取操作&#xff0c;PHP支持称为并行搜索的功能。这并不像你想要的那么简单&#xff0c;但是你可以在一次操作中获得你想要的结果。$links array($link, $link); // yes, two references to the same link$DNs array(OUUsers,OUNA1,DCcorp,DCpvt,OUContacts,OUNA1,DCcor…...

    2023/1/31 21:52:30
  12. 软件测试面试题(一)

    软件的生命周期&#xff08;prdctrm&#xff09; 计划阶段&#xff08;planning&#xff09;-〉需求分析&#xff08;requirement&#xff09;-〉设计阶段&#xff08;design&#xff09;-〉编码&#xff08;coding&#xff09;->测试&#xff08;testing&#xff09;->运…...

    2023/1/31 21:51:55
  13. 即时通讯简单步骤

    Socket: 1>Socket又称"套接字” 2>网络上的两个程序通过一个双向的通信连接实现数据的交换&#xff0c;这个连接的一端称为一个socket。3>应用程序通常通过"套接字"向网络发出请求或者应答网络请求网络通信的要素:1>网络上的请求就是通过Socket来建…...

    2023/1/31 21:50:55
  14. python 工业软件开发_记一次工业软件开发经历

    项目概述项目背景&#xff1a;工厂表面处理产线项目b司接了a司一条表面处理产线的项目&#xff0c;包含硬件及软件&#xff0c;由于现在b司做的软件难用且数据难以查找&#xff0c;a司不满意验收不通过&#xff0c;款项没有结清。所有b司找到我们,希望我们能帮他搞定这个软件系…...

    2023/1/31 21:50:26
  15. initWithFormat与initWithString的区别、initWithFormat与stringWithFormat的区别

    一、initWithFormat会创建新空间&#xff0c;NSLog时可以“%d”。 initWithString不一定创建新空间&#xff0c;取决于参数。 &#xff08;1&#xff09;如果后边是常量字符串不会创建新空间&#xff0c;NSLog("%d",[str retainCount])时输出为-1&#xff0c;NSlog…...

    2023/1/31 21:48:45
  16. 神经网络人口预测matlab,利用MATLAB工具模拟实现人口预测实例分析.doc

    摘要:人口预测对于国民经济计划的制定和社会战略目标的决策具有重要参考价值&#xff0e;本文主要利用MATLAB软件对中国1974-2015年的人口总数数据进行统计分析&#xff0c;建立BP神经网络预测模型.把它与一元非线性回归模型进行对比&#xff0c;得出了BP神经网络模型更加适合于…...

    2023/1/31 21:46:50
  17. train_test_split用法总结

    sklearn.model_selection.train_test_split随机划分训练集和测试集 官网文档&#xff1a;http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html#sklearn.model_selection.train_test_split 一般形式&#xff1a; train_test_spli…...

    2023/1/31 21:44:05
  18. 苏宁!你还挺得过去吗?(苏宁大幅裁员)

    前两天才写了一篇《作为一个江苏人&#xff0c;我眼中的苏宁》&#xff0c; 说实话&#xff0c;我内心是有点不太相信&#xff0c;偌大的苏宁会走到今天这步田地。 可一件件传闻都慢慢变成了实锤&#xff01; 一、苏宁大裁员 一位多年老友刚跳槽去了苏宁&#xff1b; 入职一…...

    2023/1/31 21:43:54
  19. ~75背景1

    一、背景颜色 background-color 设置背景颜色 二、背景图片 1、background-image 设置背景图片 可以同时设置背景图片和背景颜色&#xff0c;这样背景颜色就会成为图片的背景色 如果背景图片小于元素&#xff0c;则背景图片会在元素中自动铺满 如果背景图片大于元素&#…...

    2023/1/31 21:43:52
  20. 关于一个进程结束另外一个带有NotifyIcon托盘的进程残留图标问题解决方法

    进程A用Process 启动进程B&#xff0c;这是B在右下角有托盘图标&#xff0c;然后用Process关闭进程B&#xff0c;但是右下角的图标还在&#xff0c;只有鼠标放上去后才消失。网上大部分介绍的方法时通过刷新任务栏托盘区,清除异常关闭进程的残留图标。该方法在win10系统上不起作…...

    2023/1/31 21:43:46

最新文章

  1. 为什么调用glPushMatrix()和glPopMatrix() 转

    今天忽然感悟到为什么在进行变换之前要用glPushMatrix();这个函数&#xff0c;而在变换完毕后有用glPopMatrix()这两个函数了,赶紧记下来&#xff1a;我们在变换坐标的时候&#xff0c;使用的是glTranslatef(),glRotaef()等函数来操作&#xff0c;操作的是什么呢&#xff1f;操…...

    2023/1/31 22:22:46
  2. MATLB|抽水蓄能电站系统的最优竞价策略研究

    &#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…...

    2023/1/31 22:22:17
  3. 小程序开发常见问题总结(超实用)

    小程序开发常见问题总结&#xff08;超实用&#xff09; 文章目录小程序开发常见问题总结&#xff08;超实用&#xff09;1.小程序user agent stylesheet问题。2.this.setData is not function错误3.flex布局3.1flex布局原理3.2flex父项属性3.3flex布局子项元素4.自定义组件1.在…...

    2023/1/31 22:22:12
  4. 【自学Docker】Docker update命令

    Docker update命令 大纲 docker update命令教程 docker update 命令可以用于更新一个或多个 Docker容器 的配置。该命令后面的 CONTAINER 可以是容器Id&#xff0c;或者是容器名。 docker update命令语法 haicoder(www.haicoder.net)# docker update [OPTIONS] CONTAINER […...

    2023/1/31 22:21:07
  5. 免费个人商城系统源码推荐

    1.来客推开源商城&#xff08;前后端开源&#xff0c;免费商用&#xff0c;可以LOGO&#xff09; 来客推开源版电商小程序&#xff0c;可去Logo前后端全部开源~ PHP5.6、 MYSQL5.5、Uniapp、原生小程序、原生IOS、原生Android、 自主研发框架&#xff08;古典式开发框架&…...

    2023/1/31 22:20:55
  6. 聚类算法(2)--Mean Shift

    目录 mean shift 算法理论 基本的Mean Shift向量形式 sklearn参数 python—sklearn实例演示 PS&#xff1a; Mean shift 算法是基于核密度估计的爬山算法&#xff0c;可用于聚类、图像分割、跟踪等&#xff0c;因为最近搞一个项目&#xff0c;涉及到这个算法的图像聚类实现…...

    2023/1/31 22:20:42
  7. 基于Android的家校互动系统app

    需求信息&#xff1a; 功能需求: 1&#xff1a;发通知、发作业 发通知和发作业&#xff0c;是学校教师特有的功能&#xff0c;教师可以通过平台进行通知和作业的发放&#xff0c;每当发一条信息&#xff0c;该班的所有人员便可以收到来自服务器的信息推送&#xff0c;提醒家长打…...

    2023/1/31 22:20:02
  8. 破堤模式A

    using System; using System.Collections.Generic; using System.Text; namespace testone { class KB { private int t, t0, Tf; private double hL;//堤坝高度&#xff08;常态&#xff09; public double hr;//堤坝内水高度&#xff08;过…...

    2023/1/31 22:19:56
  9. ListView与ArrayAdapter的使用

    要使用酷炫的listView&#xff0c;必须要会用适配器。 什么是适配器呢&#xff0c;适配器就是将布局和数据连接起来的东西。 比如&#xff0c;一个ListView里面有很多行东西&#xff08;Item&#xff09;&#xff0c;这些东西有可能只是一个字符串&#xff0c;也有可能是一个…...

    2023/1/31 22:19:08
  10. 数学建模学习笔记(14)聚类模型

    聚类模型K均值聚类算法和K均值聚类算法系统聚类算法&#xff08;层次聚类&#xff09;DBSCAN聚类算法聚类问题概述&#xff1a;把样本划分为由相似的对象组成的多个类的过程。 K均值聚类算法和K均值聚类算法 K均值聚类算法流程&#xff1a; 指定需要划分的簇的个数K。随机选…...

    2023/1/31 22:18:55
  11. Win11的几个实用技巧系列之不能玩植物大战僵尸、如何彻底删除360所有文件

    目录 Win11不能玩植物大战僵尸怎么办?Win11玩不了植物大战僵尸的解决方法 Win11玩不了植物大战僵尸的解决方法 win11如何彻底删除360所有文件?win11彻底删除360所有文件方法分享 win11如何卸载360&#xff1a; Win11不能玩植物大战僵尸怎么办?Win11玩不了植物大战僵尸的解…...

    2023/1/31 22:18:07
  12. 个人2台网站服务器,急急急 如何架设个人web服务器

    我的共享里面有一篇&#xff0c;很全&#xff0c;本来想贴在这里给你&#xff0c;但超过1000字了&#xff0c;你到那里自己下载一下&#xff0c;只要一分。已经重新上传“教你如何架设个人服务器----全教程”3 教你如何架设个人服务器----全教程(内网,公网)B。Web站点。点击“W…...

    2023/1/31 22:18:00
  13. FreeRTOS事件实验

    前面章节我们学习了如何使用信号量来实现同步&#xff0c;但是使用信号量来同步的 话任务只能与单个的任务进行同步。有时候某个任务可能会需要与多个任务进行 同步&#xff0c;此时信号量就无能为力。FreeRTOS 为此提供了一个可选的解决方法&#xff0c;那 就是事件标志组。本…...

    2023/1/31 22:17:50
  14. hadoop02--Apache Hadoop集群搭建与介绍

    文章目录本文重点内容大纲一、Apache Hadoop入门1.1、Hadoop介绍1.2、Hadoop起源发展1.3、Hadoop特性优点二、Apache Hadoop集群搭建2.1、发行版本2.2、Hadoop集群2.3、Hadoop部署模式、集群规划2.4、Hadoop源码编译三、Hadoop具体安装部署3.1、服务器基础环境准备3.2、安装包目…...

    2023/1/31 22:16:47
  15. [1181]linux两台服务器之间传输文件和文件夹

    文章目录scp1&#xff09;从服务器复制文件到本地&#xff1a;2&#xff09;复制文件到本地并重命名&#xff1a;3&#xff09;从服务器复制文件夹到本地&#xff1a;4&#xff09;从本地复制文件到服务器(不包括文件夹本身)&#xff1a;5&#xff09;从本地复制文件夹到服务器…...

    2023/1/31 22:16:40
  16. yolov5篇---yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程

    yolov5训练pt模型并转换为rknn模型&#xff0c;部署在RK3588开发板上——从训练到部署全过程一、任务介绍二、实验过程2.1 使用正确版本的yolov5进行训练(平台&#xff1a;x86机器ubuntu22.04系统)2.2 best.pt转换为best.onnx(平台&#xff1a;x86机器ubuntu22.04系统)2.3 best…...

    2023/1/31 22:15:41
  17. html简洁漂亮的个人简历,个人主页,个人简介网页版(源码)

    文章目录1.设计来源1.1 主界面1.2 基本资料1.3 专业技能1.4 教育经历1.5 工作经验2.效果和源码2.1 动态效果2.2 源代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/128349160 html简洁漂亮的个人简历,个人主页…...

    2023/1/31 22:15:26
  18. 性能优化系列之『服务器:如何开启和配置gzip压缩』

    文章の目录一、好处二、配置方法1、Nginx 配置&#xff1a;2、Apache 配置&#xff1a;三、生效检测写在最后一、好处 对文本进行压缩&#xff08;HTML/CSS/JS&#xff09;而对非文本不压缩&#xff08;jpg/gif/png&#xff09;压缩比约50%&#xff0d;70% 二、配置方法 1、…...

    2023/1/31 22:15:04
  19. Java多线程join()方法

    Java多线程join()方法 一、概述 1、join():等待这个线程死亡&#xff0c;相当于join(0)。 2、join(int n) &#xff1a;最多等待n毫秒之后在处理 -2.1、join的时间 < sleep的时间&#xff0c;那么sleep就会停止&#xff0c;运行时间就是join的时间 -2.2、join的时间 > …...

    2023/1/31 22:14:44
  20. Databend 开源周报 第 77 期

    Databend 是一款强大的云数仓。专为弹性和高效设计。自由且开源。 即刻体验云服务&#xff1a;https://app.databend.com 。 What’s New 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 Features & Improvements Meta 使用 expressin::TableSch…...

    2023/1/31 22:14:34