[opengl] 画一个可移动的自行车 二维几何变换(平移、旋转、缩放)

#include <cmath>
#include "glut.h"
#include "iostream"
using namespace std;
void init(void)
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
cout << "init.." << endl;
glLineWidth(1.0f);
glColor3f(1.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);//设置投影矩阵
glLoadIdentity();
gluOrtho2D(0.0, 600.0, 0.0, 600.0);//二维视景区域 左下角为原点
//glClear(GL_COLOR_BUFFER_BIT);
//glMatrixMode(GL_MODELVIEW);
//glLoadIdentity();
}
int dir = 0;
int angle = 0;
// 绘制车轮
void DrawWheel(double x, double y, double r)
{
int sec = 10;
for (int i = 0; i <= sec; i++)
{
double delta = 3.1415926*2.0 / sec;
glBegin(GL_LINE_LOOP);
glVertex2f(x, y);
glVertex2f(x + r * cos(delta*i), y + r * sin(delta*i));
glVertex2f(x + r * cos(delta*(i + 1)), y + r * sin(delta*(i + 1)));
glEnd();
}
}
//绘制自行车
void DrawBike() {
glClear(GL_COLOR_BUFFER_BIT);//清除窗口显示内容
glColor3f(1.0f, 0.0f, 0);
glPushMatrix();
glTranslatef(100+dir, 124, 0);
// 横车杆
glBegin(GL_LINES);
glVertex2f(0,0);
glVertex2f(100,0);
// 竖车杆
glVertex2f(70, 0);
glVertex2f(70, 30);
// 车把
glVertex2f(60, 30);
glVertex2f(80, 30);
glEnd();
glPopMatrix();
// 前车轮
glPushMatrix();
glTranslatef(100+dir, 100, 0);
glRotatef(angle, 0, 0, 1);
DrawWheel(0,0,25);
glPopMatrix();
// 后车轮
glPushMatrix();
glTranslatef(200+dir, 100, 0);
glRotatef(angle, 0, 0, 1);
DrawWheel(0, 0, 25);;
glPopMatrix();
glBegin(GL_LINES);
glVertex2f(0, 75);
glVertex2f(600, 75);
glEnd();
glutSwapBuffers();
}
void keyboard(unsigned char key, int x, int y)
{
if (key == 'a')// 向左平移
{
cout << "左移" << endl;
dir -= 10;
angle += 10;
glutPostRedisplay();//重绘窗口
}
if (key == 'd')// 向右平移
{
cout << "右移" << endl;
dir += 10;
angle -= 10;
glutPostRedisplay();//重绘窗口
}
}
void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(300, 100);
glutInitWindowSize(600, 600);
glutCreateWindow("lab5");
glutDisplayFunc(DrawBike);
init();
glutKeyboardFunc(keyboard);
glutMainLoop();
}
[opengl] 画一个可移动的自行车 二维几何变换(平移、旋转、缩放)的更多相关文章
- VS2008集成QT的OpenGL开发(实现二维图形的旋转)
主要是利用Qt中的定时器实现了二维图形的旋转功能: #ifndef QGLTEST_H #define QGLTEST_H #include <QGLWidget> #include &l ...
- IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)
问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10 分析: 2*2子数组的最大和.遍历求和,时 ...
- Qt信号槽机制的实现(面试的感悟,猜测每一个类保存的一个信号和槽的二维表,实际使用函数指针 元对象 还有类型安全的检查设定等等)
因为面试时问了我这道题,导致我想去了解信号槽到底是如何实现的,于是贴着顺序看了下源码,大致了解了整个框架.网上关于信号槽的文章也很多,但是大部分都是将如何应用的,这里我就写一下我所理解的如何实现吧, ...
- 《剑指Offer》第1题(Java实现):在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
一.题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...
- 功能要求:定义一个两行三列的二维数组 names 并赋值,使用二重循环输出二维数组中的元素。
功能要求:定义一个两行三列的二维数组 names 并赋值,使用二重循环输出二维数组中的元素 names={{"tom","jack","mike&qu ...
- 剑指offer-特定二维数组中查找一个元素是否存在-二分搜索-二维数组
int [][] array ={ {1,2,8,9}, {2,4,9,12}, {4,7,10,13}, {6,8,11,19} }; 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都 ...
- OpenGL——二维几何变换
平移.旋转.缩放的实现 #include<iostream> #include <math.h> #include<Windows.h> #include < ...
- 【转载】ArcBall二维控制三维旋转
原文:http://oviliazhang.diandian.com/post/2012-05-19/40027878859 由于目前大多的显示器是二维的,要控制三维物体的旋转就显得不那么直接了.Ar ...
- OpenGL 画出雷达动态扫描效果(二) 非底图
OpenGL 画出雷达动态扫描效果(一)中给出了已一张图片作为底图的雷达扫面程序 如果有漂亮的雷达底图的话,效果应该非常不错的,另外也可以直接手绘雷达框架 效果如下 雷达主体代码 glLineWidt ...
随机推荐
- Oracle 裁掉北京研发团队,相应职位撤回美国(收购了NetSuite,LogFire,Dyn)
根据中国日报报道,2017年1月14日上午9点09分,甲骨文北京研发团队的同事收到了来自BU老大的一封邮件.邮件上提及,由于市场变化,甲骨文开始整合各研发中心资源公司在云计算方向发力,文末单独提出了甲 ...
- 自动获取淘宝API数据访问的SessionKey
最近在忙与淘宝做对接的工作,总体感觉淘宝的api文档做的还不错,不仅有沙箱测试环境,而且对于每一个api都可以通过api测试工具生成想要的代码,你完全可以先在测试工具中测试之后再进行代码的编写,这样就 ...
- 学习Java,值得你留意的问题(1)更名为《学习Java,容易被你忽略的小细节(1)》
记得大二快要结束的时候,有个女孩子突然问我“你会Java吗,帮我做大作业好吗?” 实话说,那个女孩真的很漂亮,我当时也非常想帮她.但是我从来没有接触过Java,让我在短短的几天内完成Java程序设计课 ...
- 基于python实现的三方组件----Celery
一.基于python实现的三方组件----Celery 1.作用 用于异步周期任务的处理 2.Celery的组成 (1)任务 app (2)记录任务的缓存(通常用redis或rabbitMQ) 任务记 ...
- java集合框架collection(5)HashMap和TreeMap
上图转载自:http://www.cnblogs.com/vamei/archive/2013/04/15/3000913.html 一.区别和联系 1.迭代器 迭代器是一种设计模式,它是一个对象,它 ...
- PWN菜鸡入门之栈溢出 (2)—— ret2libc与动态链接库的关系
准备知识引用自https://www.freebuf.com/articles/rookie/182894.html 0×01 利用思路 ret2libc 这种攻击方式主要是针对 动态链接(Dynam ...
- PATB 1019. 数字黑洞 (20)
一个神奇的数字. 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定任一个各位数字不完全相同的4位正整数,如果我 ...
- 渐进式web应用开发---service worker 原理及介绍(一)
渐进式web应用(progressive Web app) 是现代web应用的一种新形式.它利用了最新的web功能,结合了原生移动应用的独特特性与web的优点,为用户带来了新的体验. 一:传统web端 ...
- 如何安装xenserver
xenserver安装 选择键盘 是否同意协议 清理磁盘 选择本地磁盘安装 选择本地镜像文件 输入管理密码 配置IP地址 配置DNS服务器地址 选择地点 配置NTP服务器地址 开始安装 安装完成
- 03-Spring profile实用精简版介绍
为什么说是实用精简版,没办法,工作太忙压力大啊,菜是原罪啊,所以接下来写的一些博客可能都是更偏实用性,精简点,方便自己回顾,快速上手使用即可,毕竟感觉不详细还有书不是吗. profile是用来干什么的 ...