现在你调用glPushMatrix,然后再调用一堆平移、旋转代码等等,然后再画图。那些平移和旋转都是基于坐上角为原点进行变化的。...这时就调用glPopMatrix从栈里取出一个“状态”了,这个状态就是你调用glPushMatrix之前的那个状态。...就如很多opengl的书上所讲:调用glPushMatrix其实就是把当前状态做一个副本放入堆栈之中。...当你做了一些移动或旋转等变换后,使用glPushMatrix(); OpenGL 会把这个变换后的位置和角度保存起来。...将本次需要执行的缩放、平移等操作放在glPushMatrix和glPopMatrix之间。glPushMatrix()和glPopMatrix()的配对使用可以消除上一次的变换对本次变换的影响。
本篇先谈一下glpushmatrix和glpopmatrix这两个函数吧。 opengl中的坐标变换,总是针对当前矩阵,如果当前矩阵为M,紧跟的变换矩阵为I,则执行完I后,当前矩阵变为M*I。...一个方法是把当前矩阵M*I/I,但这样做不仅麻烦,而且还会遇到其它问题;另一种方法就是我们把状态M保存下来,但需要的时候再调出来,这时就该glpushmatrix与glpopmatrix上场了。...假设有一个存放矩阵变换的堆栈,当前矩阵为M,使用glpushmatrix将当前矩阵M的副本M1压入栈顶,当前矩阵变为M1=M,当执行下一步的矩阵变换I后,当前矩阵变为M1*I,执行完相应的绘画功能后,我们希望下一步的操作的当前矩阵为
所以在场景中存在多种矩阵变换时,glPushMatrix()和glPopMatrix()一般情况下也要结合glMatrixMode(GLenum mode)运用,系统才知道具体操作的是哪个矩阵栈。...display(void) 13 { 14 glClear (GL_COLOR_BUFFER_BIT); 15 glColor3f (1.0, 1.0, 1.0); 16 17 glPushMatrix
; glShadeModel(GL_FLAT); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix...格式为glRotatef (角度,x轴,y轴,z轴),这里是绕Z轴旋转 glTranslatef(1.0f, 0.0f, 0.0f);//再用平移矩阵乘当前矩阵,注意顺序 glPushMatrix... glRotatef((GLfloat) elbow, 0.0f, 0.0f, 1.0f); glTranslatef(1.0f, 0.0f, 0.0f); glPushMatrix...display()中用到了glPushMatrix()和glPopMatrix(),事实上glPushMatrix()可以理解为建立一个局部坐标系,glPopMatrix()恢复全局坐标系,它们可以嵌套使用
gl.glClearColor(0.5f, 0.5f, 0.5f, 1); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glPushMatrix...gl.glRotatef(rotX, 1, 0, 0); gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION,lightPos, 0); gl.glPushMatrix...gl.glPushMatrix(); gl.glTranslatef(0, 2, 0); gl.glColor3f(0.8f, 0.8f, 0.8f); gl.glPopMatrix(...gl.glPixelStorei(GL2.GL_UNPACK_SKIP_PIXELS, 0); gl.glPixelStorei(GL2.GL_UNPACK_SKIP_ROWS, 0); gl.glPushMatrix...(); gl.glLoadIdentity(); gl.glMatrixMode(GL2.GL_PROJECTION); gl.glPushMatrix(); gl.glLoadIdentity
); glColor3f(1,0,0); //写入代码; glutSolidCube(1); //绘制立方体身 glPopMatrix(); glPushMatrix...glColor3f(1,1,0); //写入代码; glutSolidCube(1); //绘制立方体头 glPopMatrix(); glPushMatrix...glColor3f(1,0.5,0.2); //写入代码; glutSolidCube(1); //绘制立方体手 glPopMatrix(); glPushMatrix...glColor3f(1,0.5,0.2); //写入代码; glutSolidCube(1); //绘制立方体手 glPopMatrix(); glPushMatrix...glColor3f(0.5,0.5,1); //写入代码; glutSolidCube(1); //绘制立方体腿 glPopMatrix(); glPushMatrix
当我们需要保存时,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次的保存时,调用glPopMatrix()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。...myDraw (void) { glClear (GL_COLOR_BUFFER_BIT); //清空 glLoadIdentity(); //将当前矩阵设为单位矩阵 glPushMatrix...(); glTranslatef(-3.0,0.0,0.0); glPushMatrix(); glRotatef(45.0,0.0,0.0,1.0); glColor3f (0.0...drawSquare(); //中间左菱形 glPopMatrix(); glTranslatef(3.0,0.0,0.0); glPushMatrix...0.0); drawSquare(); //中间中菱形 glPopMatrix(); glTranslatef(3.0,0.0,0.0); glPushMatrix
GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //双缓冲机制 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix...1.0f); glutSolidTorus(1.0f, 2.0f, 30.0f, 30.0f);//绘制圆环 } glPopMatrix(); //装出 glPushMatrix...1.0f, 0.0f, 0.5); glutSolidSphere(2.0f, 30.0f, 30.0f);//绘制球体 } glPopMatrix(); glPushMatrix...glVertex3f(5, 0, 0); glVertex3f(5, 5, 0); glVertex3f(0, 5, 0); glEnd(); glPopMatrix(); glPushMatrix
当我们需要保存时,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次的保存时,调用glPopMatrix()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。...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
当我们需要保存时,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次的保存时,调用glPopMatrix()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。...glShadeModel (GL_FLAT); } void display(void) { glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glPushMatrix...提示:使用glPushMatrix()和glPopMatrix()在适当的时候保存和恢复坐标系统的位置。
std::cout << "not choose" << std::endl; } } } // 绘制立方体 void DrawCube(void) { glPushMatrix...GL_MODELVIEW); glLoadIdentity(); glColor3f(0, 0, 1); glScalef(0.3, 0.3, 0.3); // 缩放 glPushMatrix...{ times = 0; } if (times % 100 == 0) { rotate += 0.3; } glPushMatrix...glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glScalef(scale, scale, scale); // 缩放 glPushMatrix...glColor3f(0, 0, 1); glTranslatef(movX1, movY1, 0); DrawCube(); glPopMatrix(); glPushMatrix
自定义绘制圆函数 void glCircle() { double n=50;//分段数 float R=1.0;//半径 int i; //将绘图前的模型变换矩阵压入堆栈 glPushMatrix...0.2, -0.5); glEnd(); //绘制实心的圆环——在原有变换基础上,又增加了新的变换; //为了不影响后续对象的变换,采用压栈的方式,保存当前变换矩阵 glPushMatrix...glutSolidTorus(0.3, 0.7, 30.0f, 30.0f);//绘制实心圆环 } glPopMatrix(); //从堆栈中恢复已压栈的变换矩阵 //绘制实心球 glPushMatrix
vertices.push_back( Point( x, global_h-y ) ); } void points_draw() { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix...vertices.begin(), vertices.end()); //将vector数组传入狄洛尼三角形数据结构 //cgal提供狄洛尼三角形的核心数据结构就是Delaunay glPushMatrix
glLoadIdentity(); 每次的矩阵操作都叠加上一次的矩阵操作 , 最终的结果不可预知 ; 这里除了设置单位阵之外 , 还可以使用压栈和出栈操作 ; 矩阵压栈 : // 矩阵压栈 glPushMatrix...; 栈顶矩阵 : 栈顶的矩阵是 模型视图 ( ModelView ) 矩阵 , 该矩阵的值是 单位阵 \rm E ( 主对角线元素是 1 , 其它位置都是 0 ) ; 矩阵压栈 : 调用 GLPushMatrix...DispatchMessage(&msg); } // 渲染场景 // 设置单位矩阵 //glLoadIdentity(); // 矩阵压栈 glPushMatrix
glGetFloatv, glLightfv, glLoadIdentity, glMatrixMode, glMultMatrixf, glPopMatrix, \ glPushMatrix...glMatrixMode(GL_MODELVIEW) glPushMatrix() glLoadIdentity() #渲染场景 #self.scene.render...import random from OpenGL.GL import glCallList, glColor3f, glMaterialfv, glMultMatrixf, glPopMatrix, glPushMatrix...self.scaling_matrix = numpy.identity(4) def render(self): """ 渲染节点 """ glPushMatrix...self.scaling_matrix = numpy.identity(4) def render(self): """ 渲染节点 """ glPushMatrix
*/ glPushMatrix(); glTranslatef (-3.75, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat...*/ glPushMatrix(); glTranslatef (-1.25, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat...*/ glPushMatrix(); glTranslatef (1.25, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat...*/ glPushMatrix(); glTranslatef (3.75, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat...*/ glPushMatrix(); glTranslatef (1.25, 0.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient
); roangles=45.0f; } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix
void) { int i, j; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(0.0, 0.0, 0.0); glPushMatrix
64.0); roangles=45.0f; } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix
领取专属 10元无门槛券
手把手带您无忧上云