OpenGL从1.0开始--二维几何变换

在我们在做图形显示时,实际上我们不是对每一个图形都去从头开始绘制,对于形状相同或相似的图案,我们可以运用几何变换函数提高效率。我们看一看一个简单的示例。

#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变换子程序都是对当前矩阵的修改,即调用变换子程序所生成的矩阵与该模式的当前矩阵相乘。
我们可以有两个函数可以对当前矩阵赋值。

glLoadIdentity();//设定当前矩阵为单位矩阵
glLoadMatrixf(elements16);//为当前矩阵赋予参数值。该数组元素按列优先顺序指定。

OpenGL支持矩阵乘法:

glMultMatrixf(M);

当前矩阵m=m*M。因为OpenGL采用栈的方式来存储矩阵,且为四种矩阵模式的每一种都指定一个栈,所以所有矩阵操作都是基于后进先出的原则进行操作。

glMultMatrixf(M2);
glMultMatrixf(M1);

则M=M*M2*M1,始终是右乘,最先应用的变换是程序中最后指定的。

### 使用OpenGL实现计算机图学中的二维几何变换 在计算机图学领域,OpenGL 是一种广泛使用的工具库,用于绘制和操作三维以及二维图。通过 OpenGL 的矩阵运算功能,可以轻松实现平移、旋转和缩放等基本的二维几何变换。 #### 平移变换 平移是一种简单的几何变换,它将对象沿某个方向移动特定的距离。可以通过设置模型视图矩阵来实现这一效果。以下是使用 OpenGL 进行平移的一个简单示例: ```cpp #include <GL/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT); // 设置颜色为红色 glColor3f(1.0, 0.0, 0.0); // 开始定义多边 glBegin(GL_POLYGON); glVertex2f(-0.5, -0.5); // 原始顶点位置 glVertex2f(0.5, -0.5); glVertex2f(0.5, 0.5); glVertex2f(-0.5, 0.5); glEnd(); // 应用平移变换 glTranslatef(0.7, 0.7, 0.0); // 绘制经过平移后的多边 glColor3f(0.0, 1.0, 0.0); // 改变颜色以便区分原始状和平移后的状 glBegin(GL_POLYGON); glVertex2f(-0.5, -0.5); glVertex2f(0.5, -0.5); glVertex2f(0.5, 0.5); glVertex2f(-0.5, 0.5); glEnd(); glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutCreateWindow("OpenGL Translation Example"); gluOrtho2D(-1.0, 1.0, -1.0, 1.0); glutDisplayFunc(display); glutMainLoop(); } ``` 上述代码展示了如何利用 `glTranslatef` 函数进行物体的平移[^1]。 #### 缩放变换 缩放变换会改变对象的比例大小。同样地,在 OpenGL 中也可以通过调整模型视图矩阵来进行此操作。 ```cpp // 在显示函数中应用缩放变换 glScalef(1.5, 0.5, 1.0); // 对象将在X轴上放大1.5倍,Y轴缩小到一半 ``` 这段代码片段演示了如何调用 `glScalef` 来执行缩放操作[^2]。 #### 旋转变换 为了使对象围绕原点或其他指定点旋转一定角度,可采用如下方法: ```cpp // 定义旋转角 (单位:度数) float angle = 45; // 执行旋转前先恢复初始状态以防累积影响 glPushMatrix(); { glRotatef(angle, 0.0, 0.0, 1.0); // Z轴上的顺时针旋转 // 此处继续绘图逻辑... } glPopMatrix(); // 结束局部坐标系修改 ``` 这里介绍了如何运用 `glRotatef` 方法完成绕Z轴的旋转处理。 以上就是基于 OpenGL 实现常见二维几何变换的一些基础概念及其对应的 C++ 示例代码展示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值