OpenGL实例:几何变换
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实例:几何变换的更多相关文章
- OpenGL的几何变换4之内观察全景图
上一次写了OpenGL的几何变换3之内观察全景图 上次采用的是图片分割化方式,这次采用数据分割化方式. 先说下思路,数据分割化方式呢,是只读取一张图片imgData,然后通过glTexCoord2f( ...
- OpenGL的几何变换3之内观察全景图
继续上一篇文章的例子:OpenGL的几何变换2之内观察立方体 上一篇是通过绘图方式得到的立方体,没有贴图,这次加上纹理贴图. 通过纹理贴图有两种方案: 1.图片分割化,即是把一张完整的全景图片(就是支 ...
- OpenGL的几何变换[转]
OpenGL的几何变换 1.实验目的: 理解掌握一个OpenGL程序平移.旋转.缩放变换的方法. 2.实验内容: (1)阅读实验原理,运行示范实验代码,掌握OpenGL程序平移.旋转.缩放变换的方法: ...
- OpenGL实例:三角形
OpenGL实例:三角形 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多请查看:计算机图形学 1. 三角形的旋转 #include <GL/ ...
- OpenGL实例:纹理映射
OpenGL实例:纹理映射 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多请查看:计算机图形学 1. 介绍 用于指定一维.二维和三维纹理的函数分别 ...
- OpenGL的几何变换2之内观察立方体
我想实现的一个场景是:一个立方体,相机的坐标在立方体的中心点,相机不变,立方体旋转,可以站在立方体中心点查看立方体内部. 实际上就是立方体图像,这是在全景图片当作比较简单的方式,画面不会变形和扭曲,但 ...
- OpenGL的glViewPort窗口设置函数实现分屏
之前实现过全景图片查看(OpenGL的几何变换3之内观察全景图),那么我们需要进行分屏该如何实现呢?如下图: 没错就是以前提过的glViewPort函数,废话不多说了,我直接上代码: //从这里开始进 ...
- OpenGL绘制自由落体小球
OpenGL绘制自由落体小球 一. 程序运行的软硬件环境 本次设计在window10系统下进行,运用C++进行编写,在CodeBlocks环境下使用OpenGL进行设计. 所需环境配置分为2部分 ...
- Qt OpenGL三维绘图
简介 OpenGL是为三维绘图提供的标准应用编程接口. OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持.OpenGL*应用程序的用户界面必须由其它工具包创建,比 ...
随机推荐
- Vim中设置括号自动补全
1.打开用户Vim配置文件:~/.vimrc vim ~/.vimrc 2.输入以下配置: set tabstop=4 inoremap " ""<ESC>i ...
- this指针的初运用
this一般运用场景: 1.位于函数中,谁调用指向谁 var make = "Mclaren"; var model = "720s" function ful ...
- linux中使用docker-compose部署软件配置分享
本篇将分享一些 docker-compose 的配置,可参考其总结自己的一套基于docker的开发/生产环境配置. 安装docker及docker-compose install docker cur ...
- ThreadLocal的原理,源码深度分析及使用
文章简介 ThreadLocal应该都比较熟悉,这篇文章会基于ThreadLocal的应用以及实现原理做一个全面的分析 内容导航 什么是ThreadLocal ThreadLocal的使用 分析Thr ...
- 第1章 程序设计和C语言
1.1什么是计算机程序 程序,就是一组计算机能识别和执行的指令.每一条指令使计算机执行特定的操作.只要让计算机执行这个程序,计算机就会“自动地”执行各条指令,有条不紊地进行工作. 1.2什么是计算机语 ...
- Intellij IDEA 阅读源码的 4 个绝技,我必须分享给你!
前段时间分享了<阅读跟踪 Java 源码的几个小技巧>是基于 Eclipse 版本的,看大家的留言都是想要 IDEA 版本的源码阅读技巧. 所以,为了满足众多 IDEA 粉丝的要求,栈长我 ...
- 将svg文件化成字体图标的步骤
一 前提摘要 有一个活就是按照需求在现有的项目中新增几个项目和修改几个项目,是很简单的,但当中遇到了一个小问题,就是tabs中图标选中和被选中的颜色问题,如果是新开发的,目前掌握的有两种办法 ...
- MySQL系列--4.使用Python3访问数据库
1.安装MySQL驱动 pip install mysql-connector 安装完成后进入命令行模式,导入驱动,如果不报错,说明安装成功 Python 3.6.7 (default, Oct 22 ...
- [macOS开发.NET Core] 一个简单的WEB程序
上一篇咱们提到了在macOS下选进行开发. 咱们已经把工具准备完成了. 现在咱们做一个简单的DEMO 创建WEB程序  之前咱们已经创建过WEB程序,并且成功的运行过数据 现在咱们创建一个页面,并显 ...
- Python:黑板课爬虫闯关第一关
近日发现了[黑板课爬虫闯关]这个神奇的网页,练手爬虫非常的合适 地址:http://www.heibanke.com/lesson/crawler_ex00/ 第一关非常的简单 get 请求网址,在响 ...