首页 > 编程知识 正文

glesatinib中文名(帝豪gl百度百科)

时间:2023-05-05 11:25:50 阅读:75783 作者:1385

百度百科的这篇文章很好,转载。 比复制API手册欺骗阅读量的专家写的要好得多。

原文链接: http://baike.baidu.com/link? URL=wpg jbi-yz S2 cue 6h PMD-n5ut6rn FCC 09 H4 a7tyxqlzbb7bgwxitr0u0z2wmfceloev6zbdlshka1XB0pejhlcq

个人资料

glPushMatrix被推入当前矩阵堆栈。

语法

语音输入pushmatrix (语音; 将当前矩阵保存在堆栈顶部(保存当前矩阵)。 参数此函数中是否有参数。返回值这是一个错误,按全矩阵堆栈或跳出包含单个矩阵的矩阵堆栈。 在其中一种情况下设置错误标志和OpenGL状态,并进行其他更改。 返回代码GL_STACK_OVERFLOW是完全调用当前矩阵堆栈的函数。 GL_INVALID_OPERATION调用在glBegin和glEnd的相应调用之间调用此函数。 用法/示例glPushMatrix函数推送当前矩阵堆栈,并在一个中复制当前矩阵。 这就是后glPushMatrix的调用栈的顶级矩阵与其下的相同。 在原理的说明中终于知道了使用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 ) )都只处理当前矩阵或堆栈顶部的矩阵,因此堆栈中的其他矩阵不受影响。 堆栈操作函数有两个: voidglpushmatrix(void )。 语音聚合矩阵(语音; 第一个函数表示按顺序将所有矩阵推入堆栈中,顶部矩阵是第二个矩阵的备份。 要压入的行列数量不能太多。 否则会出错。 第二个函数表示在堆栈顶部弹出的矩阵,将原来的第二个矩阵作为最上面的矩阵,接受当前操作,所以原来的最上面的矩阵被破坏; 如果堆栈中只有一个矩阵,则无法进行弹出操作。 否则会出错。 由此可见,矩阵堆栈操作和矩阵推入顺序正好相反,编程时需要特别注意矩阵操作的顺序。 为了更好地理解这两个函数,可以将glPushMatrix () (“记住自己在哪里”,glPopMatrix ) )想象为“返回到自己原来的位置”。

例1 .移动1. OpenGL光源位置的方法:首先执行pushMatrix (),然后执行移动操作,然后执行旋转操作,然后指定光源位置,然后执行PopMatrix ),即可完成。 # include ' windows.h ' # include GL/glut.hstaticintspin=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 ); lfloatposition [ ]={ 0.0,0.0,1.5,1.0

}; //第一点也是最重要的一点:OpenGL中的模型视图变换矩阵全是右乘当前变换矩阵 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/rydpw.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); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。