
为了解决这个问题,你可以应用opengl投影模式和相机视图来变换坐标,使你的图形对象在任何屏幕上面都有正确的比例。在es 2.0或者3.0的api里面,应用投影和相机视图时,首先要向图形对象的顶点着色器添加一个矩阵成员对象,当矩阵对象添加后,就可以向对象生成和应用投影和相机视图矩阵。3. 创建投影和相机视图矩阵 - 生成可应用到图形对象的投影和视图矩阵。
有时候在经过一些变换后我们想回到原来的状态,就像我们谈恋爱一样,换来换去还是感觉初恋好,怎么办?强大的opengl就帮我们提供了两个函数:giPushMatrix()和glPopMatrix();
首先我们要知道,对于矩阵的操作都是对于矩阵栈的栈顶来操作的。当前矩阵即为矩阵栈的栈顶元素,而对当前矩阵进行平移、旋转等的变换操作也同样是对栈顶矩阵的修改。所以我们在变换之前调用giPushMatrix()的话,就会把当前状态压入第二层,不过此时栈顶的矩阵也与第二层的相同。
pthread_cleanup_push()/pthread_cleanup_pop()采用先入后出的栈结构管理,void routine(void *arg)函数在调用pthread_cleanup_push()时压入清理函数栈,多次对pthread_cleanup_push()的调用将在清理函数栈中形成一个函数链,在执行该函数链时按照压栈的相反顺序弹出。我们在上面的代码中将canvas.translate()和canvas.rotate()放到了canvas.save()和canvas.restore()之间,这样做的好处是,在canvas.save()调用时,将当前坐标系保存下来,将当前坐标系的矩阵matrix入栈保存,然后通过translate或rotate等对坐标系进行变换,然后进行绘图,绘图完成后,我们通过调用canvas.restore()将之前保存的matrix出栈,这样就将当前绘图坐标系恢复到了canvas.save()执行的时候状态。假如有一个用来处理客户的 customeraction 类, 该动作类实现了 modeldriven 接口,当用户触发customeraction 动作时, modeldriven 将调用相关customeraction 对象的 getmodel() 方法, 并把返回的模型(customer实例)压入到 valuestack 栈. 接下来 parameters 将把表单字段映射到 valuestack 栈的栈顶对象的各个属性中. 因为此时 valuestack 栈的栈顶元素是刚被压入的模型(product)对象, 所以该模型将被填充. 如果某个字段在模型里没有匹配的属性, param 将尝试 valuestack 栈中的下一个对象.。

函数的作用过程可以用下图描述,更为直观。

在opengl场景中一般存在多种矩阵变换操作,而控制这些操作的命令主要用到
glMatrixMode(GLenum mode);

由于栈的操作是线性表操作的特例,相对而言,链式栈的操作更易于实现。2、软件可设置指定数目操作,指定属性操作,也可以随机件数和随机属性进行操作,支持混批模式。记录标识、服务调用时间、流程实例、流程定义id、当前userid、当前user对应的工作项id、下一个活动产生的工作项id、下一活动产生工作项的参与者、当前user对应的活动实例id、当前user对应的活动定义id、目标活动实例id(用于回退补偿)、目标活动定义id(用于回退补偿)、ws接口名称、ws接口的处理状态( 1,成功。
GL_MODELVIEW: 把其后的矩阵操作施加于造型视图矩阵栈。(默认)
GL_PROJECTION: 把其后的矩阵操作施加于投影矩阵栈。
GL_TEXTURE: 把其后的矩阵操作施加于纹理矩阵栈。

注意上述三种模式分别对应了三种矩阵栈。
所以在场景中存在多种矩阵变换时,glPushMatrix()和glPopMatrix()一般情况下也要结合glMatrixMode(GLenum mode)运用,系统才知道具体操作的是哪个矩阵栈。
注意:
摄像机矩阵和模型矩阵用的是同一个矩阵,就是GL_MODELVIEW (model是模型搜索矩阵,view是摄像机矩阵,GL_MODELVIEW里保存的是这两个矩阵的积)。所以选择GL_MODELVIEW之后直接用glTranslate,glRotate之类的就行。

2.本实用新型技术方案中,还可以实现在竖直方向旋转摄像glpushmatrix 函数有什么用,摄像机安装在第二滑块座上,从而实现摄像机可在第一滑轨和第二滑轨构成的矩形平面上进行拍摄,扩大了拍摄范围。同时按下shift键即缩到最小key pad enter 设置成默认缩放key pad 0 移到座舱面板视角并返回ctrl - key pad 0 座舱面板视角开/关alt - key pad 0 把当前视角保存为最后的座舱面板视角ctrl - right shift 加快鼠标移动座舱视角速度alt - right shift 减慢鼠标移动座舱视角速度shift - right shift 正常的鼠标移动座舱视角速度ctrl - left shift 加快键盘移动座舱视角速度alt - left shift 减慢键盘移动座舱视角速度shift - left shift 正常的键盘移动座舱视角速度外部视角控制key pad 1 向左下旋转观察点key pad 2 向下旋转观察点key pad 3 向右下旋转观察点key pad 4 向左旋转观察点key pad 5 居中视角alt - key pad 5 返回开始点key pad 6 向右旋转观察点key pad 7 向左上旋转观察点key pad 8 向上旋转观察点key pad 9 向右上旋转观察点key pad * 观察点向前移动key pad / 观察点向后移动ctrl - key pad * 放大ctrl - key pad / 缩小ctrl - key pad enter 设置成默认缩放shift - 快速移动观察点ctrl - key pad 1~9 移动摄像机代替旋转。covmat是样本的协方差矩阵或样本的相关矩阵,此时不必输入变量x.scores表示因子得分的方法,scores=”regression”,表示用回归方法计算因子得分,当参数为scores=”bartlett”,表示用bartlett方法计算因子得分,缺省值为”none”,即不计算因子得分,retation表示旋转,缺省值为方差最大旋转,当rotation=”none”时glpushmatrix 函数有什么用,不作旋转变换。
虽然矩阵里可以保存任何变换,但按照OpenGL的概念,model和view矩阵里只能保存平移,旋转和缩放;project矩阵里只能保存投影矩阵,viewport矩阵里只能保存二维平移和缩放。这样来看把model和view放在一起是合理的。他们之间的区别纯粹是人为的。
附上代码例子:

1 #include <stdlib.h> 2 #include "include\glut.h" 3 4 static int year = 0, day = 0; 5 6 void init(void) 7 { 8 glClearColor (0.0, 0.0, 0.0, 0.0); 9 glShadeModel (GL_FLAT); 10 } 11 12 void display(void) 13 { 14 glClear (GL_COLOR_BUFFER_BIT); 15 glColor3f (1.0, 1.0, 1.0); 16 17 glPushMatrix(); 18 { 19 glutWireSphere(1.0, 20, 16); /* draw sun */ 20 glRotatef ((GLfloat) year, 0.0, 1.0, 0.0); 21 22 glTranslatef (2.0, 0.0, 0.0); //把坐标原点变换位置 23 24 glRotatef ((GLfloat) day, 0.0, 1.0, 0.0); 25 glutWireSphere(0.2, 10, 8); /* draw smaller planet */ 26 } 27 glPopMatrix(); 28 29 glutSwapBuffers(); 30 } 31 32 void reshape(int w, int h) 33 { 34 glViewport (0, 0, (GLsizei) w, (GLsizei) h); 35 glMatrixMode (GL_PROJECTION); 36 glLoadIdentity (); 37 gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); 38 39 glMatrixMode(GL_MODELVIEW); 40 glLoadIdentity(); 41 gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 42 } 43 44 void keyboard(unsigned char key, int x, int y) 45 { 46 switch (key) { 47 case 'd': 48 day = (day + 10) % 360; 49 glutPostRedisplay(); 50 break; 51 case 'D': 52 day = (day - 10) % 360; 53 glutPostRedisplay(); 54 break; 55 case 'y': 56 year = (year + 5) % 360; 57 glutPostRedisplay(); 58 break; 59 case 'Y': 60 year = (year - 5) % 360; 61 glutPostRedisplay(); 62 break; 63 case 27: 64 exit(0); 65 break; 66 default: 67 break; 68 } 69 } 70 71 int main(int argc, char** argv) 72 { 73 glutInit(&argc, argv); 74 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 75 glutInitWindowSize (500, 500); 76 glutInitWindowPosition (100, 100); 77 glutCreateWindow (argv[0]); 78 79 init(); 80 glutDisplayFunc(display); 81 glutReshapeFunc(reshape); 82 glutKeyboardFunc(keyboard); 83 glutMainLoop(); 84 return 0; 85 }

运行结果:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-116244-1.html
同我们一样
烊烊