
为了解决这个问题,你可以应用opengl投影模式和相机视图来变换坐标,使你的图形对象在任何屏幕上面都有正确的比例。在es 2.0或者3.0的api里面,应用投影和相机视图时,首先要向图形对象的顶点着色器添加一个矩阵成员对象,当矩阵对象添加后,就可以向对象生成和应用投影和相机视图矩阵。3. 创建投影和相机视图矩阵 - 生成可应用到图形对象的投影和视图矩阵。
有时候在经过一些变换后我们想回到原来的状态,就像我们谈恋爱一样,换来换去还是感觉初恋好,怎么办?强大的opengl就帮我们提供了两个函数:giPushMatrix()和glPopMatrix();
而gdi+在全局坐标中存储区域,并且允许区域发生任何可存储在变换矩阵中的变换(如缩放和旋转)。刚体从世界坐标系转换到相机坐标系的过程,可以通过旋转和平移来得到,我们将其变换矩阵由一个旋转矩阵和平移向量组合成的齐次坐标矩阵(为什么要引入齐次坐标可见后续文章)来表示:。具体而言,对一张雾霾图像,作者对其进行多种变换,包括图像白平衡、对比度增强和伽马矫正等操作提取图像内部的不同颜色或对比度特征,然后将得到的变换图像输入到门限融合卷积神经网络中,利用神经网络对雾霾图像的每个变换图像估计一个权重矩阵,再利用权重矩阵对所有的变换图像进行融合获得最终的去雾结果图。
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()调用时glpushmatrix 函数有什么用,将当前坐标系保存下来,将当前坐标系的矩阵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);

作用:用于指定用哪个矩阵作为当前矩阵,mode用于指定哪一种矩阵栈是其后矩阵操作的目标。mode可取:
GL_MODELVIEW: 把其后的矩阵操作施加于造型视图矩阵栈。(默认)
GL_PROJECTION: 把其后的矩阵操作施加于投影矩阵栈。
GL_TEXTURE: 把其后的矩阵操作施加于纹理矩阵栈。

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

其实摄像机和模型矩阵本质上是一回事(这也是为什么OpenGL把这两个矩阵放在一起保存的原因),因为比如把整个世界向y+方向移动10跟把摄像机向y-方向移动10是等价的。旋转也是一样。
gdi+提供了matrix(矩阵) 对象,它是一种可以使(缩放、旋转和平移等)变换(transformation)简易灵活的强大工具。变换矩阵操作可以分为视角(viewing),模型(modeling)和投影(projection)操作,这些操作可以有选择glpushmatrix 函数有什么用,平移,缩放,正侧投影,透视投影等。而gdi+在全局坐标中存储区域,并且允许区域发生任何可存储在变换矩阵中的变换(如缩放和旋转)。
附上代码例子:

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-116241-1.html
麦地路