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*应用程序的用户界面必须由其它工具包创建,比 ...
随机推荐
- WeihanLi.Redis自定义序列化及压缩方式
WeihanLi.Redis自定义序列化及压缩方式 Intro WeihanLi.Redis 是基于 StackExchange.Redis 的扩展,提供了一些常用的业务组件和对泛型的更好支持,默认使 ...
- SQL 高效运行注意事项(二)
SQL Server高效运行总的来说有两种方式: 一. 扩容,提高服务器性能,显著提高CPU.内存,解决磁盘I/O瓶颈.硬件的提升是立竿见影的,而且是风险小,在硬件更新换代非常快的年代, 当SQLSe ...
- rabbitmq消费者“无故消失”
hi,all 导读:9月1号17:12左右,发现影子队列存在大量“unacked”(收到了消息,但是还没有手动确认消息)的消息,一段时间后“unacked”的数量没有减少,但是观察消费者端的日志, ...
- 华为云.NET Core支持情况调查
各大公有云都提供了开发者开发的SDK,今天我们来看看华为云对.NET Core的支持情况怎么样? .NET SDK地址 https://developer.huaweicloud.com/sdk#.N ...
- [Abp vNext 源码分析] - 3. 依赖注入与拦截器
一.简要说明 ABP vNext 框架在使用依赖注入服务的时候,是直接使用的微软提供的 Microsoft.Extensions.DependencyInjection 包.这里与原来的 ABP 框架 ...
- Spring Boot 1.5.x 基础学习示例
一.为啥要学Spring Boot? 今年从原来.Net Team“被”转到了Java Team开始了微服务开发的工作,接触了Spring Boot这个新瓶装旧酒的技术,也初步了解了微服务架构.Spr ...
- python验证码简单识别
因为需求,所以接触了验证码这一块,原本感觉到会很难,学了之后挺简单的,但后来又发现自己还是too young... PIL(python Image Library) 目前PIL的官方最新版本为1.1 ...
- 接口自动化:HttpClient + TestNG + Java(二) - 第一个接口测试:get请求
在上一篇中,我们搭建好了HttpClient + TestNG + Java的自动化接口测试环境,这一篇我们就赶紧开始编写我们的第一个接口测试用例. 本篇会对问题解决的思路进行更详尽的阐述. 2.1 ...
- 编译安装Keepalived2.0.0
简介 Keepalived是基于vrrp协议的一款高可用软件.Keepailived有一台主服务器和多台备份服务器,在主服务器和备份服务器上面部署相同的服务配置,使用一个虚拟IP地址对外提供服务,当主 ...
- .NetCore采取JWT方式进行身份认证
验证与授权 Authentication(身份认证) 认证是系统对请求的用户进行身份识别的过程. Authorization (授权) 授权是对认证通过后的用户进行权限分配的过程.授权简单理解就是:识 ...