OpenGL实例:几何变换

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/

更多请查看:计算机图形学

1. 平移

#include <GL/glut.h>
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0); //指定清除颜色
//初始化视景体
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
glMatrixMode(GL_MODELVIEW);
}
//绘制中心在原点,边长为2的正方形
void drawSquare(void)
{
glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
glVertex2f(-1.0f, -1.0f);//左下点
glVertex2f(1.0f, -1.0f);//右下点
glVertex2f(1.0f, 1.0f);//右上点
glVertex2f(-1.0f, 1.0f);//左上点
glEnd();
}
void myDraw1(void)
{
glClear(GL_COLOR_BUFFER_BIT); //清空
glLoadIdentity(); //将当前矩阵设为单位矩阵
glColor3f(1.0, 0.0, 0.0);
drawSquare(); //在原点处绘制边长为2红色正方形
glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
glColor3f(0.0, 1.0, 0.0);
drawSquare(); //绘制边长为2绿色正方形
glTranslatef(0.0, -3.0, 0.0); //再向下移动3单位
glColor3f(0.0, 0.0, 1.0);
drawSquare(); //绘制边长为2蓝色正方形
glFlush();
}
void myDraw2(void)
{
glClear(GL_COLOR_BUFFER_BIT); //清空
glLoadIdentity(); //将当前矩阵设为单位矩阵
glColor3f(1.0, 0.0, 0.0);
drawSquare(); //在原点处绘制边长为2红色正方形
glPushMatrix();
glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
glColor3f(0.0, 1.0, 0.0);
drawSquare(); //绘制边长为2绿色正方形
glPopMatrix();
glTranslatef(2.0, 0.0, 0.0); //再向右移动2单位
glColor3f(0.0, 0.0, 1.0);
drawSquare(); //绘制边长为2蓝色正方形
glFlush();
}
void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(0, 0);
glutInitWindowSize(600, 600);
glutCreateWindow("Translate函数示例");
init();
glutDisplayFunc(myDraw1);
glutMainLoop();
}

图形:

2. 旋转

#include <GL/glut.h>
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
glMatrixMode(GL_MODELVIEW);
}
void drawSquare(void) //绘制中心在原点,边长为2的正方形
{
glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
glVertex2f(-1.0f, -1.0f);//左下点
glVertex2f(1.0f, -1.0f);//右下点
glVertex2f(1.0f, 1.0f);//右上
glVertex2f(-1.0f, 1.0f);//左上点
glEnd();
}
void myDraw1(void)
{
glClear(GL_COLOR_BUFFER_BIT); //清空
glLoadIdentity(); //将当前矩阵设为单位矩阵
glColor3f(1.0, 0.0, 0.0);
drawSquare(); //在原点处绘制边长为2红色正方形
glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
glRotatef(30, 0.0, 0.0, 1.0); //顺时针旋转30角度
glColor3f(0.0, 1.0, 0.0);
drawSquare(); //绘制边长为2绿色正方形
glLoadIdentity(); //将当前矩阵设为单位矩阵
glTranslatef(-2.0, -3.0, 0.0); //向左移动2单位,向下移动3单位
glRotatef(-30, 0.0, 0.0, 1.0); //逆时针旋转30角度
glColor3f(0.0, 0.0, 1.0);
drawSquare(); //绘制边长为2蓝色正方形
glFlush();
}
void myDraw2(void)
{
glClear(GL_COLOR_BUFFER_BIT); //清空
glLoadIdentity(); //将当前矩阵设为单位矩阵
glColor3f(1.0, 0.0, 0.0);
drawSquare(); //在原点处绘制边长为2红色正方形
glPushMatrix(); //把当前矩阵压入堆栈
glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
glRotatef(30, 0.0, 0.0, 1.0); //顺时针旋转30角度
glColor3f(0.0, 1.0, 0.0);
drawSquare(); //绘制边长为2绿色正方形
glPopMatrix(); //从堆栈栈顶弹出一个矩阵为当前矩阵
glTranslatef(-2.0, -3.0, 0.0); //向左移动2单位,向下移动3单位
glRotatef(-30, 0.0, 0.0, 1.0); //逆时针旋转30角度
glColor3f(0.0, 0.0, 1.0);
drawSquare(); //绘制边长为2蓝色正方形
glFlush();
}
void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(0, 0);
glutInitWindowSize(600, 600);
glutCreateWindow("Rotate函数示例");
init();
glutDisplayFunc(myDraw1);
glutMainLoop();
}

图形:

3. 缩放

#include <GL/glut.h>
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
glMatrixMode(GL_MODELVIEW);
}
void drawSquare(void) //绘制中心在原点,边长为2的正方形
{
glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
glVertex2f(-1.0f, -1.0f);//左下点
glVertex2f(1.0f, -1.0f);//右下点
glVertex2f(1.0f, 1.0f);//右上点
glVertex2f(-1.0f, 1.0f);//左上点
glEnd();
}
void myDraw1(void)
{
glClear(GL_COLOR_BUFFER_BIT); //清空
glLoadIdentity(); //将当前矩阵设为单位矩阵
glColor3f(1.0, 0.0, 0.0);
drawSquare(); //在原点处绘制边长为2红色正方形
glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
glScalef(1.0, 1.5, 1.0); //X和Z方向保持不变,Y方向放大为原来的1.5倍
glColor3f(0.0, 1.0, 0.0);
drawSquare(); //绘制边长为2绿色正方形
glLoadIdentity(); //将当前矩阵设为单位矩阵
glTranslatef(-2.0, -3.0, 0.0); //向左移动2单位,向下移动3单位
glScalef(0.5, 1.5, 1.0); //Z方向保持不变,X方向缩小为原来的0.5倍,Y方向放大为原来的1.5倍
glColor3f(0.0, 0.0, 1.0);
drawSquare(); //绘制边长为2蓝色正方形
glFlush();
}
void myDraw2(void)
{
glClear(GL_COLOR_BUFFER_BIT); //清空
glLoadIdentity(); //将当前矩阵设为单位矩阵
glColor3f(1.0, 0.0, 0.0);
drawSquare(); //在原点处绘制边长为2红色正方形
glPushMatrix(); //把当前矩阵压入堆栈
glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
glScalef(1.0, 1.5, 1.0); //X和Z方向保持不变,Y方向放大为原来的1.5倍
glColor3f(0.0, 1.0, 0.0);
drawSquare(); //绘制边长为2绿色正方形
glPopMatrix(); //从堆栈栈顶弹出一个矩阵为当前矩阵
glTranslatef(-2.0, -3.0, 0.0); //向左移动2单位,向下移动3单位
glScalef(0.5, 1.5, 1.0); //Z方向保持不变,X方向缩小为原来的0.5倍,Y方向放大为原来的1.5倍
glColor3f(0.0, 0.0, 1.0);
drawSquare(); //绘制边长为2蓝色正方形
glFlush();
}
void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(0, 0);
glutInitWindowSize(600, 600);
glutCreateWindow("Scale函数示例");
init();
glutDisplayFunc(myDraw1);
glutMainLoop();
}

图形:

4. 菱形旋转变换

#include <GL/glut.h>
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0); //指定清除颜色
//初始化视景体
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
glMatrixMode(GL_MODELVIEW);
}
//绘制中心在原点的菱形
void drawDiamond(void)
{
glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
glVertex2f(2.0f, -1.0f);//下点
glVertex2f(4.0f, 0.0f);//右点
glVertex2f(2.0f, 1.0f);//上点
glVertex2f(-0.0f, 0.0f);//左点
glEnd();
}
void wrrDraw(void)
{
glClear(GL_COLOR_BUFFER_BIT); //清空
glLoadIdentity(); //将当前菱形设为单位菱形
glRotatef(90, 0.0, 0.0, 1.0); //逆时针旋转90角度
glColor3f(1.0, 0.0, 0.0);
drawDiamond(); //绘制红色菱形
glRotatef(-120, 0.0, 0.0, 1.0); //顺时针旋转120角度
glColor3f(0.0, 0.0, 1.0);
drawDiamond(); //绘制蓝色菱形
glRotatef(-120, 0.0, 0.0, 1.0); //顺时针旋转120角度
glColor3f(0.0, 1.0, 0.0);
drawDiamond(); //绘制绿色菱形
glFlush();
}
void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(0, 0);
glutInitWindowSize(600, 600);
glutCreateWindow("菱形函数的绘制");
init();
glutDisplayFunc(wrrDraw);
glutMainLoop();
}

图形:

5. 综合实验

#include <GL/glut.h>
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
glMatrixMode(GL_MODELVIEW);
}
void drawSquare(void) //绘制中心在原点,边长为2的正方形
{
glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
glVertex2f(-1.0f, -1.0f);//左下点
glVertex2f(1.0f, -1.0f);//右下点
glVertex2f(1.0f, 1.0f);//右上点
glVertex2f(-1.0f, 1.0f);//左上点
glEnd();
}
void myDraw(void)
{
glClear(GL_COLOR_BUFFER_BIT); //清空
glLoadIdentity(); //将当前矩阵设为单位矩阵
glPushMatrix();
glTranslatef(0.0f, 2.0f, 0.0f);
glScalef(3.0, 0.5, 1.0);
glColor3f(1.0, 0.0, 0.0);
drawSquare(); //上面红色矩形
glPopMatrix();
glPushMatrix();
glTranslatef(-3.0, 0.0, 0.0);
glPushMatrix();
glRotatef(45.0, 0.0, 0.0, 1.0);
glColor3f(0.0, 1.0, 0.0);
drawSquare(); //中间左菱形
glPopMatrix();
glTranslatef(3.0, 0.0, 0.0);
glPushMatrix();
glRotatef(45.0, 0.0, 0.0, 1.0);
glColor3f(0.0, 0.7, 0.0);
drawSquare(); //中间中菱形
glPopMatrix();
glTranslatef(3.0, 0.0, 0.0);
glPushMatrix();
glRotatef(45.0, 0.0, 0.0, 1.0);
glColor3f(0.0, 0.4, 0.0);
drawSquare(); //中间右菱形
glPopMatrix();
glPopMatrix();
glTranslatef(0.0, -3.0, 0.0);
glScalef(4.0, 1.5, 1.0);
glColor3f(0.0, 0.0, 1.0);
drawSquare(); //下面蓝色矩形
glFlush();
}
void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(0, 0);
glutInitWindowSize(600, 600);
glutCreateWindow("几何变换函数综合示例");
init();
glutDisplayFunc(myDraw);
glutMainLoop();
}

图形:

OpenGL实例:几何变换的更多相关文章

  1. OpenGL的几何变换4之内观察全景图

    上一次写了OpenGL的几何变换3之内观察全景图 上次采用的是图片分割化方式,这次采用数据分割化方式. 先说下思路,数据分割化方式呢,是只读取一张图片imgData,然后通过glTexCoord2f( ...

  2. OpenGL的几何变换3之内观察全景图

    继续上一篇文章的例子:OpenGL的几何变换2之内观察立方体 上一篇是通过绘图方式得到的立方体,没有贴图,这次加上纹理贴图. 通过纹理贴图有两种方案: 1.图片分割化,即是把一张完整的全景图片(就是支 ...

  3. OpenGL的几何变换[转]

    OpenGL的几何变换 1.实验目的: 理解掌握一个OpenGL程序平移.旋转.缩放变换的方法. 2.实验内容: (1)阅读实验原理,运行示范实验代码,掌握OpenGL程序平移.旋转.缩放变换的方法: ...

  4. OpenGL实例:三角形

    OpenGL实例:三角形 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多请查看:计算机图形学 1. 三角形的旋转 #include <GL/ ...

  5. OpenGL实例:纹理映射

    OpenGL实例:纹理映射 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多请查看:计算机图形学 1. 介绍 用于指定一维.二维和三维纹理的函数分别 ...

  6. OpenGL的几何变换2之内观察立方体

    我想实现的一个场景是:一个立方体,相机的坐标在立方体的中心点,相机不变,立方体旋转,可以站在立方体中心点查看立方体内部. 实际上就是立方体图像,这是在全景图片当作比较简单的方式,画面不会变形和扭曲,但 ...

  7. OpenGL的glViewPort窗口设置函数实现分屏

    之前实现过全景图片查看(OpenGL的几何变换3之内观察全景图),那么我们需要进行分屏该如何实现呢?如下图: 没错就是以前提过的glViewPort函数,废话不多说了,我直接上代码: //从这里开始进 ...

  8. OpenGL绘制自由落体小球

    OpenGL绘制自由落体小球 一.    程序运行的软硬件环境 本次设计在window10系统下进行,运用C++进行编写,在CodeBlocks环境下使用OpenGL进行设计. 所需环境配置分为2部分 ...

  9. Qt OpenGL三维绘图

     简介 OpenGL是为三维绘图提供的标准应用编程接口. OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持.OpenGL*应用程序的用户界面必须由其它工具包创建,比 ...

随机推荐

  1. 设置Mac 终端走代理

    1.打开终端执行:export http_proxy=socks5://127.0.0.1:1080 这个只能在当前终端执行一次退出后就需要重新设置 如果需要开机自动设置,把上面的代码加到~/.bas ...

  2. App瘦身、性能优化总结

    App瘦身 资源瘦身 使用tinypng压缩PNG图片.视频可以通过 Final cut等软件进行分辨率压缩.音频则降低码率即可. 非必须资源文件可以放到自己服务器上 启动图使用 LaunchScre ...

  3. 常见dos命令行

    查找本地端口占用情况 是否8080端口被占用netstat -aon|findstr "8080" 在1.txt文档当中查找java字符串type 1.txt|findstr 'j ...

  4. Windows Server 2012 R2安装Oracle 11g问题

      1.[INS-13001]环境不满足最低要求 如图:   oracle11g早于Windows Server 2012 R2 解决方法:找到解压目录../win64_11gR2_database\ ...

  5. winform 实现类似于TrackBar的自定义滑动条,功能更全

    功能很全,随便列几个 1.可以设置滑块的大小,边框颜色.背景色.形状等等吧 2.可以设置轨道的方向.边框颜色.背景色.阴影等等 ... 效果图: 下载链接https://download.csdn.n ...

  6. 处理安卓和ios当页面原生键盘弹出,输入框不显示

    $('input').on('click', function () { var target = this; // 使用定时器是为了让输入框上滑时更加自然 setTimeout(function() ...

  7. zabbix安装及简单使用备注

    1.安装mysql yum install -y mariadb mariadb-server systemctl start mariadb 2.安装apache yum -y install ht ...

  8. “Validation failed for one or more entities”异常的解决办法

    日志中出现Entity Framework修改数据库时的错误: Validation failed for one or more entities. See 'EntityValidationErr ...

  9. js设置回车键触发事件

    设置按回车键时触发查询事件: document.onkeydown = function(e){ var ev = document.all ? window.event : e; if(ev.key ...

  10. Linux中Mysql的简介和安装

    MySQL 简介 点击查看MySQL官方网站 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前属于Oracle旗 ...