glPushMatrix()和glPopmatirx()

原文地址:http://blog.csdn.net/tyxkzzf/article/details/40907273OpenGL有三个矩阵堆栈,分别是GL_MODELVIEW(模型视图矩阵堆栈)、GL_PROJECTION(投影矩阵堆栈)、GL_TEXTURE(纹理矩阵堆栈),用法和普通堆栈一样;这里我们只讲模型视图矩阵堆栈,OpenGL提供了相应的接口:glPushMatir

大家好,又见面了,我是你们的朋友全栈君。

原文地址:http://blog.csdn.net/tyxkzzf/article/details/40907273

OpenGL有三个矩阵堆栈,分别是GL_MODELVIEW(模型视图矩阵堆栈)、GL_PROJECTION(投影矩阵堆栈)、GL_TEXTURE(纹理矩阵堆栈),用法和普通堆栈一样;

这里我们只讲模型视图矩阵堆栈,OpenGL提供了相应的接口:glPushMatirx()和glPopMatrix()。

这个模型视图矩阵堆栈是干嘛用的呢?我们在三维空间中绘制模型,大部分时候需要对模型进行移动、旋转、缩放操作,其实OpenGL移动的不是模型,而是坐标系(效果是一样的啦,就比如你坐在车上,跟你并排的还有一辆车,都是静止不动的,这时候你倒车的效果和旁边那辆车前进的效果是不是一样的)。但是,但空间中有多个模型的时候,这个时候,问题来了,我们怎么确定每个模型都绘制在预期的位置呢?

比如,我们想要绘制太阳系,中间是太阳,静止不动,地球围绕太阳旋转,月亮围绕地球旋转,如下图所示的情景:

glPushMatrix()和glPopmatirx()

我们首先将坐标系移动到太阳的位置,绘制太阳,再将坐标系移动到地球的位置,绘制地球,然后将坐标系移动到月亮的位置,绘制月亮;如果还有金星、木星、火星呢,他们也都是以太阳为中心旋转,这样子,我们可以绘制完月亮之后再将坐标系回退到绘制地球的时候的坐标系,移动相应的位置,绘制金星,然后再回退或者移动新位置绘制木星。。。。。。这样的操作不但麻烦,而且容易出错(麻烦的东西都比较容易出错,所以要简洁),那怎么办最好呢,其实就是绘制地球、金星、木星、火星等的时候以太阳为坐标原点,在绘制地球之前先把当前的模型视图矩阵压入堆栈中保存下来(glPushMatirx),这样你在进行变换就不会影响到堆栈中的矩阵,这个时候将坐标系移动到地球的位置绘制地球,绘制完成之后将模型视图矩阵堆栈中的栈顶矩阵(就是我们刚才保存的矩阵)弹出(glPopMatrix),恢复原来的坐标系,再压入堆栈,绘制金星,再弹出。。。。。。

可以使用嵌套,即:

绘制太阳

压栈

(栈顶矩阵为太阳对应的模型视图矩阵)

移动坐标系到地球位置

绘制地球

压栈(这里就嵌套了)

(栈顶矩阵为地球地球对应的模型视图矩阵)

移动坐标系到月亮的位置

绘制月亮

压栈(嵌套又见嵌套)

(栈顶局长为月亮对应的模型视图矩阵)

移动坐标系到月亮的月亮(虚构)的位置

绘制月亮的月亮

出栈

(栈顶矩阵恢复为地球地球对应的模型视图矩阵,这时可以绘制第二个月亮了)

出栈

(栈顶矩阵恢复为太阳对应的模型视图矩阵,这时可以绘制金星、木星、火星等等了)

出栈

(栈顶为最初的模型视图矩阵,这时可以绘制太阳2,太阳3.。。。。。。太阳9,后羿射日前)

具体代码为(代码只实现了绘制两个月亮,也是嵌套,没有那么多,原理是一样的)

[cpp] 
view plain
 copy

 
在CODE上查看代码片
派生到我的代码片

  1. // Called to draw scene  
  2. void RenderScene(void)  
  3.     {  
  4.     // Earth and Moon angle of revolution  
  5.     static float fMoonRot = 0.0f;  
  6.     static float fEarthRot = 0.0f;  
  7.   
  8.     // Clear the window with current clearing color  
  9.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  10.   
  11.     // Save the matrix state and do the rotations  
  12.     glMatrixMode(GL_MODELVIEW);  
  13.     glPushMatrix();  
  14.   
  15.     // Translate the whole scene out and into view    
  16.     glTranslatef(0.0f, 0.0f, -300.0f);    
  17.       
  18.     // Set material color, Red  
  19.     // Sun  
  20.         glDisable(GL_LIGHTING);  
  21.     glColor3ub(255, 255, 0);  
  22.     glutSolidSphere(15.0f, 30, 17);  
  23.         glEnable(GL_LIGHTING);  
  24.   
  25.     // Move the light after we draw the sun!  
  26.     glLightfv(GL_LIGHT0,GL_POSITION,lightPos);  
  27.   
  28.     // Rotate coordinate system  
  29.     glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);  
  30.   
  31.     // Draw the Earth  
  32.     glColor3ub(0,0,255);  
  33.     glTranslatef(105.0f,0.0f,0.0f);  
  34.     glutSolidSphere(15.0f, 30, 17);  
  35.   
  36.     glPushMatrix();  
  37.     // Rotate from Earth based coordinates and draw Moon  
  38.     glColor3ub(200,200,200);  
  39.     glRotatef(fMoonRot,0.0f, 1.0f, 0.0f);  
  40.     glTranslatef(30.0f, 0.0f, 0.0f);  
  41.     fMoonRot+= 15.0f;  
  42.     if(fMoonRot > 360.0f)  
  43.         fMoonRot = 0.0f;  
  44.     glutSolidSphere(6.0f, 30, 17);  
  45.     glPopMatrix();  
  46.   
  47.     glColor3ub(100, 250, 0);  
  48.     glRotatef(fMoonRot, 1.0f, 0.0f, 0.0f);  
  49.     glTranslatef(0.0f, 20.0f, 0.0f);  
  50.     glutSolidSphere(6.0f, 30, 17);  
  51.   
  52.     // Restore the matrix state  
  53.     glPopMatrix();  // Modelview matrix  
  54.   
  55.     // Step earth orbit 5 degrees  
  56.     fEarthRot += 5.0f;  
  57.     if(fEarthRot > 360.0f)  
  58.         fEarthRot = 0.0f;  
  59.   
  60.     // Show the image  
  61.     glutSwapBuffers();  
  62. }  

实现效果图:

glPushMatrix()和glPopmatirx()

glPushMatrix()和glPopmatirx()

glPushMatrix()和glPopmatirx()

glPushMatrix()和glPopmatirx()

glPushMatrix()和glPopmatirx()

不过需要注意的是,模型视图矩阵堆栈最大为32个,Windows平台,有数量限制,超出的话将会报错。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125895.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • deepfakes视频的网站_deepfakes视频的网站[通俗易懂]

    deepfakes视频的网站_deepfakes视频的网站[通俗易懂]{“optioninfo”:{“dynamic”:”true”,”static”:”true”},”simplifiedDisplay”:”newEdition”,”newCard”:[{“link”:”https://www.aliyun.com/product/live”,”icon”:”live”,”title”:”视频直播LIVE”,”des”:”视频直播(ApsaraVideoLive…

    2022年5月26日
    36
  • Oracle Insert BLOB

    Oracle Insert BLOB来源于:http://arjudba.blogspot.com/2008/06/how-to-insert-blob-dataimage-video-into.htmlHowtoInsertBlobdata(image,video)intooracleBLOBsizeInthispostitisshownhowIcaninsertBlob

    2022年7月17日
    15
  • 软件详细设计模板

    产品名称Productname密级Confidentialitylevel  产品版本ProductversionTotal8pages共8页V1.01 XXX软件详细设计说明书   Preparedby拟制

    2022年4月7日
    50
  • eclipse安装教程与使用教程「建议收藏」

    eclipse安装教程与使用教程「建议收藏」第一首先在电脑的浏览器中输入“eclipse官网”。 然后在网页中点击进入eclipse的官方下载网站。 2 第二然后再点击页面右边的“download”。 在弹出的页面下面点击“downloadpackages”。 3 第三然后在下面找到“eclipseIDEforjavadevelopers”的选项。 在选项右边有一个“3…

    2022年5月8日
    46
  • 写web后端经验总结

    写web后端经验总结1.在写后台程序的时候,主要是增删改,这时候要做好前端发来的数据的校验

    2022年6月21日
    25
  • rgbd slam_深度感知摄像头

    rgbd slam_深度感知摄像头‘’工欲善其事必先利其器‘’我们先从能够获取RGBD数据的相机开始谈起。首先我们来看一看其分类。一、根据其工作原理主要分为三类:1.双目方案:(1)原理:http://blog.csdn.net/shenziheng1/article/details/52883536(2)产品:ZED:https://www.stereolabs.com/Tango:http://

    2022年9月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号