在我们在做图形显示时,实际上我们不是对每一个图形都去从头开始绘制,对于形状相同或相似的图案,我们可以运用几何变换函数提高效率。我们看一看一个简单的示例。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <Gl/glut.h>
void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-400.0, 400.0, -300.0, 300.0);
}
void lineSegment()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);//应用建模观察矩阵
glColor3f(0.0, 0.0, 1.0);
glRecti(50, 100, 200, 150);//第一个蓝色矩形
glColor3f(1.0, 0.0, 0.0);
glTranslatef(-200.0, -50.0, 0.0);//位移
glRecti(50, 100, 200, 150);//第二个红色矩形
glColor3f(0.0,1.0, 0.0);
glLoadIdentity();//设定当前矩阵为单位矩阵
glRotatef(90.0, 0.0, 0.0, 1.0);//绕三维轴旋转90度
glRecti(50, 100, 200, 150);//第三个绿色矩形
glColor3f(1.0, 1.0, 0.0);
glLoadIdentity();
glScalef(-0.5, 1.0, 1.0);//缩放0.5倍,水平方向镜像
glRecti(50, 100, 200, 150);//第四个黄色矩形
glFlush();
}
void main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(50, 100);
glutInitWindowSize(800, 600);
glutCreateWindow("An Example OpenGL Program");
init();
glutDisplayFunc(lineSegment);
glutMainLoop();
}
可以看到对图形做二维几何变换是比较简单的,我们也不再赘述了,大家自己去推导下数学过程。我们这里简答解释下OpenGL矩阵操作。
我们前面也已经接触过一些,OpenGL通过glMatrixMode(GL_MODELVIEW)指定当前矩阵为建模观察矩阵,除了建模观察模式外,还可以指定投影模式、纹理模式和颜色模式等。指定矩阵后,后面的OpenGL变换子程序都是对当前矩阵的修改,即调用变换子程序所生成的矩阵与该模式的当前矩阵相乘。
我们可以有两个函数可以对当前矩阵赋值。
复制代码
1
glLoadIdentity();//设定当前矩阵为单位矩阵
复制代码
1
glLoadMatrixf(elements16);//为当前矩阵赋予参数值。该数组元素按列优先顺序指定。
OpenGL支持矩阵乘法:
复制代码
1
glMultMatrixf(M);
当前矩阵m=m*M。因为OpenGL采用栈的方式来存储矩阵,且为四种矩阵模式的每一种都指定一个栈,所以所有矩阵操作都是基于后进先出的原则进行操作。
复制代码
1
2
glMultMatrixf(M2);
glMultMatrixf(M1);
则M=M*M2*M1,始终是右乘,最先应用的变换是程序中最后指定的。
最后
以上就是危机龙猫最近收集整理的关于OpenGL从1.0开始--二维几何变换的全部内容,更多相关OpenGL从1内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复