OpenGL中glPushMatrix和glPopMatrix的原理

glPushMatrix、glPopMatrix操作事实上就相当于栈里的入栈和出栈。
  很多人不明确的可能是入的是什么,出的又是什么。

比如你当前的坐标系原点在你电脑屏幕的左上方。如今你调用glPushMatrix,然后再调用一堆平移、旋转代码等等,然后再绘图。那些平移和旋转都是基于左上角为原点进行变化的。并且都会改变坐标的位置,经过了这些变化后,你的坐标肯定不再左上角了。
  那假设想恢复怎么办呢?这时就调用glPopMatrix从栈里取出一个“状态”了,这个状态就是你调用glPushMatrix之前的那个状态。就如非常多opengl的书上所讲:调用glPushMatrix事实上就是把当前状态做一个副本放入堆栈之中。

当你做了一些移动或旋转等变换后,使用glPushMatrix();
OpenGL 会把这个变换后的位置和角度保存起来。
然后你再随便做第二次移动或旋转变换,再用glPopMatrix();
OpenGL 就把刚刚保存的那个位置和角度恢复。

比方:
glLoadIdentity();
glTranslatef(1,0,0);//向右移动(1,0,0)
glPushMatrix();//保存当前位置
glTranslatef(0,1,0);//如今是(1,1,0)了
glPopMatrix();//这样,如今又回到(1,0,0)了

1.原理解说

最终明确为什么使用glPushMatrix()和glPopMatrix()的原因了。将本次须要运行的缩放、平移等操作放在glPushMatrix和glPopMatrix之间。glPushMatrix()和glPopMatrix()的配对使用能够消除上一次的变换对本次变换的影响。使本次变换是以世界坐标系的原点为參考点进行。以下对上述结论做进一步的解释:

1)OpenGL中的modelview矩阵变换是一个马尔科夫过程:上一次的变换结果对本次变换有影响,上次modelview变换后物体在世界坐标系下的位置是本次modelview变换的起点。默认时本次变换和上次变换不独立。

2)OpenGL物体建模实际上是分两步走的。第一步,在世界坐标系的原点位置绘制出该物体;第二步,通过modelview变换矩阵对世界坐标系原点处的物体进行仿射变换,将该物体移动到世界坐标系的目标位置处。

3)将modelview变换放在glPushMatrix和glPopMatrix之间能够使本次变换和上次变换独立。

4)凡是使用glPushMatrix()和glPopMatrix()的程序一般能够判定是採用世界坐标系建模。既世界坐标系固定,modelview矩阵移动物体。

一般说来,矩阵堆栈经常使用于构造具有继承性的模型,即由一些简单目标构成的复杂模型。比如,一辆自行车就是由两个轮子、一个三角架及其他一些零部件构成的。它的继承性表如今当自行车往前走时,首先是前轮旋转,然后整个车身向前平移,接着是后轮旋转,然后整个车身向前平移,如此进行下去,这样自行车就往前走了。将上述模型的构造过程放在glPushMatrix和glPopMatrix之间,则本次汽车在世界坐标系中的位置不是基于上一次汽车的位置而给出的(曾经一次的位置为參考),而是直接给出的以世界下的坐标(以世界坐标系的原点为參考)。整个过程是符合人的思维过程的,因为每次建模都是以单位阵为变换起点,故便于採用统一的实现方式进行处理。

矩阵堆栈对复杂模型运动过程中的多个变换操作之间的联系与独立十分有利。由于全部矩阵操作函数如glLoadMatrix()、glMultMatrix()、glLoadIdentity()等仅仅处理当前矩阵或堆栈顶部矩阵,这样堆栈中以下的其他矩阵就不受影响。堆栈操作函数有以下两个:
          void glPushMatrix(void);

          void glPopMatrix(void);

第一个函数表示将全部矩阵依次压入堆栈中,顶部矩阵是第二个矩阵的备份;便于场景须要操作顶部矩阵时第二个矩阵的值不变,再弹出时又恢复压栈之前的场景;压入的矩阵数不能太多,否则出错。第二个函数表示弹出堆栈顶部的矩阵,令原第二个矩阵成为顶部矩阵,接受当前操作,故原顶部矩阵被破坏;当堆栈中仅存一个矩阵时,不能进行弹出操作,否则出错。由此看出,矩阵堆栈操作与压入矩阵的顺序刚好相反,编程时要特别注意矩阵操作的顺序。为了更好地理解这两个函数,我们能够形象地觉得glPushMatrix()就是“记住自己在哪”,glPopMatrix()就是“返回自己原来所在地”。

2. 举例

例1. OpenGL光源位置的移动

移动方式: 先pushMatrix()一下,然后在进行移动操作,然后旋转操作,然后指定光源的位置,然后PopMatrix()一下,就完毕了。

#include "windows.h"
#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 }; 

//第一点也是最重要的一点:OpenGL中的模型视图变换矩阵全是(顶点对象)右乘当前变换矩阵

//(右乘:顶点对象置于当前矩阵的右面。转载时gqb666添�。)

//或者这样理解:每一次变换都是变换矩阵右乘栈顶矩阵,顶点对象右乘终于的栈顶矩阵

//(右乘:变换矩阵置于栈顶矩阵的右面。转载时gqb666添�。)
glPushMatrix();  //将当前变换矩阵(单位阵)压入堆栈
glTranslatef( 0.0, 0.0, -5.0 );     // transformation 1
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();  //消除绘制绿色WireCube时对当前变换矩阵的影响

glutSolidSphere( 0.5, 40, 40 );//以被光照的物体
glPopMatrix(); // Pop the old matrix without the transformations.   //返回到单位矩阵
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;
}

例2  机械手臂的旋转

以下样例中的机械手臂是由两个简单的长方体根据一定的继承关系构成的。glPushMatrix和glPopMatrix之间的变换相对前一次是独立的

#include "windows.h"
#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>

void myinit(void);

void drawPlane(void);

void CALLBACK elbowAdd (void);

void CALLBACK elbowSubtract (void);

void CALLBACK shoulderAdd (void);

void CALLBACK shoulderSubtract (void);

void CALLBACK display(void);

void CALLBACK myReshape(GLsizei w, GLsizei h);


static int shoulder = 0, elbow = 0;

void CALLBACK elbowAdd (void)

{
   elbow = (elbow + 5) % 360;

}

void CALLBACK elbowSubtract (void)

{
   elbow = (elbow - 5) % 360;

}

void CALLBACK shoulderAdd (void)

{
   shoulder = (shoulder + 5) % 360;

}

void CALLBACK shoulderSubtract (void)

{
   shoulder = (shoulder - 5) % 360;

}

void CALLBACK display(void)

{
   glClear(GL_COLOR_BUFFER_BIT);
   glColor3f(0.0, 1.0, 1.0);

   glPushMatrix(); // 将此句凝视掉后能够发现上一次的变换结果对当前变换有影响,加上了glPushMatrix的目的是让各次变换相互独立。

   glTranslatef (-0.5, 0.0, 0.0); // 将旋转后的Wirebox向左移动0.5个单位
   glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);   //看到shoulder是相对于0的绝对角度,不是基于上一次位置的相对角度。
   glTranslatef (1.0, 0.0, 0.0); //Step 1将WireBox向右移动一个单位
   // void auxWireBox(GLdouble width,GLdouble height,GLdouble depth)

   auxWireBox(2.0, 0.2, 0.5);  //这个WireBox以x=1为中心,width=2从该中心開始向两边各延伸1个单位。

   glTranslatef (1.0, 0.0, 0.0);
   glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
   glTranslatef (0.8, 0.0, 0.0);
   auxWireBox(1.6, 0.2, 0.5);

   glPopMatrix(); // 能够看出glPushMatrix和glPopMatrix之间的变换效果被消除。清除上一次对modelview矩阵的改动。
   glFlush();

}

void myinit (void)

{
   glShadeModel (GL_FLAT);

}

void CALLBACK myReshape(GLsizei w, GLsizei h)

{
   glViewport(0, 0, w, h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glTranslatef (0.0, 0.0, -5.0);  /* 觉得是viewing transform 不好理解,因此时是物体不动,世界坐标系向z轴正方向移动5个单位,眼睛位于世界坐标系的原点; 此处理解为对模型的变换更加直观既将物体向负z轴移动5个单位。*/
}

void main(void)

{
   auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
   auxInitPosition (0, 0, 400, 400);
   auxInitWindow ("Composite Modeling Transformations");
   myinit ();
   auxKeyFunc (AUX_LEFT, shoulderSubtract);
   auxKeyFunc (AUX_RIGHT, shoulderAdd);
   auxKeyFunc (AUX_UP, elbowAdd);
   auxKeyFunc (AUX_DOWN, elbowSubtract);
   auxReshapeFunc (myReshape);
   auxMainLoop(display);
}

2013-7-23日加入�:

在计算机图形学中,全部的变换都是通过矩阵相乘实现的,即物体定点构成的齐次坐标矩阵乘以三维变换矩阵就可得到变换后的物体齐次坐标矩阵。相同,在OpenGL中图远的坐标变换(移动、旋转、缩放)也是通过矩阵乘法实现的。OpenGL中比較重要的矩阵有投影矩阵和模型视图矩阵,外加纹理矩阵。矩阵堆栈基于矩阵引入,它能够以栈的形式保存相应的矩阵,压入和弹出操作同普通的栈,三种矩阵相应了三个矩阵堆栈。

      实际上在创建、装入、相乘模型视图变换和投影变换矩阵时都已经用到了矩阵堆栈。拿模型视图变换来说,在绘制复杂的场景时,会涉及到复杂的模型矩阵变换,经常我们须要保存这些变换的中间状态,以便在进行一些变换后高速恢复,而无需对当前模型矩阵进行反变换以进行恢复(费时)。比方,当前模型视图矩阵状态为矩阵A,场景绘制须要模型视图矩阵从A->B,然后从A->C......。利用矩阵堆栈,程序仅仅须要保存矩阵A(glPushMatrix),运行完A->B后,恢复模式视图矩阵为A(glPopMatrix),运行变换A->C。非常显然,使用矩阵堆栈比仅使用单个矩阵效率高非常多。

      函数glPushMatrix用于将当前矩阵压入矩阵堆栈(由函数glMatrixMode指定堆栈类型),即:该函数复制栈顶矩阵(比方矩阵A),并放置在栈顶(A‘),这样矩阵堆栈顶部有两个同样的矩阵,栈顶矩阵作为当前矩阵进行兴许变换。函数glPopMatrix弹出栈顶矩阵(A‘),以下一个元素变为栈顶(A),即恢复之前的模型视图状态。切记:当前矩阵永远位于堆栈顶部。矩阵堆栈是有深度的,假设压入过多矩阵或者堆栈仅仅有一个矩阵而调用glPopMatrix将导致错误。

      代码演示样例:

  1. glMatrixMode(GL_MODEVIEW); // set cur matrix mode  
  2. glPushMatrix(); // push cur matrix  
  3.     glTranslatef(*);  
  4.     glRotatef(*);  
  5.     glScalef(*);  
  6.     drawObject();  
  7. glPopMatrix();  

【2025最新版】Open3D 区域生长分割(python详细过程版) 点云区域生长分割算法的python详细过程版实现。博客长期更新,本文最新更新时间为:2025年3月23日。 阅读详情

相关推荐

c++11 无锁队列

/************************************************************************* &gt; File Name: lockfreequeue.cpp &gt; Author: &gt; Mail: &gt; Created Time: Wed 08 Aug 2018 11:38:08 AM CST ********...

qq_35728402的博客 5021

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

例如,在调用 glTranslatef(1.0, 0.0, 0.0) 之后,当前矩阵会被更新成平移矩阵,在调用glRotatef(30, 0.0, 1.0, 0.0)之后,当前矩阵会被更新成旋转矩阵。在绘制圆柱体时,需要对每个圆柱体进行不同的平移和旋转变换,所以需要使用glPushMatrix()函数将当前矩阵压入栈中,这样可以保证每个圆柱体之间互不影响。glPushMatrix() 函数将当前矩阵复制一份并压入栈中,这样就可以在之后的操作中使用栈顶的矩阵进行变换而不会影响之前的变换。

m0_57236802的博客 3028

基于Jetson Nano与YOLOv5s的无人机道路抛洒物实时检测系统【附数据集+代码】

本文详细介绍基于Jetson Nano与YOLOv5s的无人机道路抛洒物实时检测系统,通过硬件选型、数据采集、模型优化等关键步骤,实现高效的道路安全监控。系统结合无人机高空视角和YOLOv5s算法,能精准识别各类抛洒物,实测准确率达98.2%,为交通管理提供智能化解决方案。

weixin_29081163的博客 1452

头歌实践教学平台:投影变换v1.0

(2).运用glPushMatrix()函数和glPopMatrix()函数进行矩阵操作,以中心为绘制原点,设置前景色为红色glColor3f(1.0, 0.0, 0.0),绘制单位立方体线框,用glutWireCube(1.0)完成;(3).运用glPushMatrix()函数和glPopMatrix()函数进行矩阵操作,设置前景色为绿色glColor3f(0.0, 1.0, 0.0),设置线宽为2.0用glLineWidth(2.0)完成,将原单位立方体线框沿X轴正方向平移2.0;

菜鸟的博客~ 1494

遥感生态指数(RSEI)——四个指数的计算

遥感生态指数是在4个生态指数的基础上通过主成分变换得出的一个评价生态环境质量的指标。因此,第二部分就是要分别计算出这4个指数的值。 ①首先,是绿度指数的计算,一般用归一化植被指数(NDVI) NDVI=(NIR-Red)/(NIR+Red) 在Bandmath工具中输入NDVI计算公式 (float(b4-b3))/(b4+b3) 其中,b3、b4分别是红波段和近红外波段 ②其次,是湿度计算。 WET = c1B1 + c2B2 + c3B3...

qq_41978498的博客 9万+

R语言分段回归

1.利用虚拟变量进行线性回归 (MEdata.csv的数据来源:https://github.com/ChenQihome9/优快云-Data-Library/blob/master/MEdata.csv) 问题13:针对TAX~GDP,使用分段回归方法,找到其回归方程。编程,并根据程序结果叙述如下几方面问题:(1)分几段最佳?(不超过5段内)(2)分段位置定在哪儿最佳?(3)写出最佳方...

ChenQihome9的博客 1万+

头歌-计算机图形学-点和直线的绘制

头歌-计算机图形学-CG1-v1.0-点和直线的绘制

weixin_52766015的博客 1万+

Oracle EBS的帐套由“4C”构成,而华为MetaERP将其发展为“6C”

华为MetaERP从OracleEBS的"4C"架构升级为"6C",实现核算理念革新。核心突破在于将会计科目、核算维度和核算单元解耦,形成"科目表+维度库"的灵活架构。新架构优势显著:1)科目回归会计本质,管理维度独立扩展;2)支持无限维度的精细化核算;3)实现数据权限隔离和内部交易自动化;4)采用元数据驱动设计,为AI应用奠定基础。这一平台化架构解决了大型企业在全球化、多元化发展中的核算难题,相比传统架构具有更强的灵活性和扩展性。

金牌架构师 202

glPushMatrix 与 glPopMatrix

1.原理讲解  终于明白为什么使用glPushMatrix()和glPopMatrix()的原因了。将本次需要执行的缩放、平移等操作放在glPushMatrix和glPopMatrix之间。glPushMatrix()和glPopMatrix()的配对使用可以消除上一次的变换对本次变换的影响。使本次变换是以世界坐标系的原点为参考点进行。下面对上述结论做进一步的解释: 1)OpenGL中

ssdut_209的博客 860

视频理解与处理——OpenClaw视频能力深度解析(2026视频版)

本文介绍了OpenClaw视频理解与处理的核心技术,重点分析了视频预处理流程。通过VideoProcessor类实现视频加载、帧采样、尺寸调整和归一化等基础处理功能,支持本地和在线视频源处理,为后续视频分析任务提供标准化输入。预处理模块采用均匀采样和标准化方法优化视频数据,确保动作识别、场景分析等高级应用的准确性,展现了OpenClaw强大的视频处理能力。

一键难忘的博客 464

解决微信小程序长页面滚动到底部点击底部的输入框后输入框漂浮且页面滚动到顶部

一、问题描述 项目中有一个长页面上部展示部分信息下部为信息录入,页面长度为三屏幕(不同手机屏幕大小略有差异),当滚动到第二屏或者第三屏去填写信息时点击输入框后输入框漂浮起来了并且页面向上滚动了一段距离,回到了第一屏中展示的内容。效果如图。 滚动到第二屏,证件号输入。 点击输入框 可以看到证件号输入框漂浮了起来并且页面滚动到了第一屏展示的内容。 注意:小程序是2018年上线,在2020年4月份之前该页面从未出现过这种现象。推测:微信的后续更新中对微信小程序基础库进行了重构,导致点击输入框后页

仰望星空的代码 3254

OpenGL:glPushMatrix();和glPopMatrix();的作用及其原理分析

今天做到一道题,大致就是问glPushMatrix();和glPopMatrix();存在会对图形绘制造成什么影响,为了能够清晰的反应到底会存在什么影响,我特地写了两行代码: 代码①: void draw1() { //glClear(GL_COLOR_BUFFER_BIT); //注释掉为了能反映每次循环三角形的位置 glBegin(GL_POLYGON); // 多边形 glColor3f(0.0, 0.0, 1.0); glVertex2f(0.05, -0.65); glVertex

weixin_52908396的博客 3863

PCL 基于法向距离的对应点获取

提出了一种基于法向量欧氏距离的点云配准方法。详细推导了法向量距离计算公式,并给出具体计算流程。在代码实现部分,采用PCL库完成了点云法向量计算和对应关系估计,通过可视化验证了算法有效性。实验结果表明,该方法能够准确获取点云间的对应关系,为后续点云配准奠定了基础。

点云侠的博客 225

OpenGL中glMatrixMode的使用,以及glPushMatrix和glPopMatrix的原理

一、glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项(参数)有3种模式: GL_PROJECTION 投影, GL_MODELVIEW 模型视图, GL_TEXTURE 纹理。二保存状态矩阵glPushMatrix、glPopMatrix操作事实上...

哲学天空的博客 1256

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

opengl入门记录--glPushMatrix和glPopMatrix原理

glPushMatrix、glPopMatrix操作事实上就相当于栈里的入栈和出栈。 很多人不明确的可能是入的是什么,出的又是什么。 比如你当前的坐标系原点在你电脑屏幕的左上方。如今你调用glPushMatrix,然后再调用一堆平移、旋转代码等等,然后再绘图。那些平移和旋转都是基于左上角为原点进行变化的。并且都会改变坐标的位置,经过了这些变化后,你的坐标肯定不再左上角了。   那假设想恢

阿a楞的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

glPushMatrix()/glPopMatrix() & glLoadMatrixf()

glPushMatrix()/glPopMatrix() & glLoadMatrixf() 这三个函数你搞清楚了没? 头大啊.. http://www.gamedev.net/community/forums/topic.asp?topic_id=489879 command result glLoadMatrixf(A)...

222

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

glPushMatrix()和glPopMatrix()的作用

当你做了一些移动或旋转等变换后,使用glPushMatrix(); OpenGL 会把这个变换后的位置和角度保存起来。 然后你再随便做第二次移动或旋转变换,再用glPopMatrix(); OpenGL 就把刚刚保存的那个位置和角度恢复。 比如: glLoadIdentity(); glTranslatef(1,0,0);//向右移动(1,0,0) glPushMat

dingyong12345的专栏 6044

glPushMatrix();glPopMatrix();以及glMatrixMode的用法

<br /><br />所有的这几个函数的本质都是对坐标系的操作。<br />前提知识:<br />1。每一种矩阵对应着一种坐标系。见图一<br />2。每一次对矩阵的操作都是对当前矩阵进行的。确切的说,作为一种状态机,每一时刻在矩阵方面只能有一种状态。<br />3。每一次压栈和出栈都对应着一种对坐标系的操作。<br />4。我们所有对矩阵的操作都是对矩阵栈的栈顶矩阵进行的。<br /> <br />图一<br />如图:全局坐标系中有一个局部坐标系,这个坐标系的状态对应着一种矩阵。假如当前矩阵为该矩阵,

因为了解所以无知 3092

Opengl中的glTranslatef、glPushMatrix和glPopMatrix

http://blog.youkuaiyun.com/stilling2006/article/details/3855338 1 、 在opengl中,函数glTranslatef的作用就是移动坐标原点。对应的3个参数对应着3个坐标轴。   如果你调用一次glTranslatef(1.0f,0.0f,0.0f)然后画一个小球,接着再调用次glTranslatef(0.0f,1.0f,0.0f)再

alexwang1983的专栏 721

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

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33830216的博客 107

OpenGL使用矩阵堆栈glpushMatrix的原因

http://anony3721.blog.163.com/blog/static/511974201133095555708/ 题外话:学习OpenGL有两个礼拜了,总结下才发现仅仅明白了其基本概念。光是GDI绘图中的窗口、视口以及设备环境的概念,就足足困扰我了一个礼拜,其实明白了只后发现一句话就描述清楚了,根本不像MSDN和google上讲的难的很。高手们可能是不屑于基础概念的讲解或者根本不

fr_han的专栏 1416
上一篇: 感觉离开了好久
下一篇: 惠普OpenStack生态圈现雏形
weixin_34356555
博客等级 码龄11年 4803粉丝 1187原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值