OPengl实现小球围绕大球旋转的效果
一些特殊函数的介绍
glutWireSphere(r,s1,s2)
该函数用于渲染一个球体(由线条构成球体)。球体球心位于原点。在OpenGL中默认的原点就是窗口客户区的中心;
r 是球的半径,s1是以Z轴上线段为直径分布的圆周线的条数,s2是围绕在Z轴周围的线的条数glRotatef(-80.0f,10.0f,1.0f,0.0f)
表示将当前图形沿方向向量(-10,1,0)顺时针旋转80度glTranslatef(0.0f,-20.0f,-40.0f)
表示将当前图形向x轴平移0,向y轴平移-20,向z轴平移-40注意如果先旋转在绘制,则是表现为自转;而先绘制在旋转,再移动一定距离,是为了到达绘公转的地方
我们在变换坐标的时候,使用的是glTranslatef(),glRotaef()等函数来操作,操作的是什么呢?操作的是当前矩阵,我们也知道,这些坐标变换(翻转,旋转也好)都是通过操作矩阵来实现的,而矩阵相乘是会叠加的,当你用完一个变换函数后,当前操作的矩阵就被改变了,当你还停留在变换以前的思维,我在这个地方绘制恰好是我想要的时候,你会发现再绘制出来的不是在你想要的位置,因为你在操作变换的时候,当前矩阵被改变了。
当你做了一些移动或旋转等变换后,使用
glPushMatrix()
;OpenGL 会把这个变换后的位置和角度保存起来。然后你再随便做第二次移动或旋转变换,再用glPopMatrix()
;OpenGL 就把刚刚保存的那个位置和角度恢复。
实验截图
代码如下
#include "GL\glut.h"static int year = 0, day = 0;void display(void)
{glClear(GL_COLOR_BUFFER_BIT); //清空颜色缓冲区glColor3f(1, 1, 1); //重置颜色,白色glPushMatrix(); //压栈glutWireSphere(1, 20, 16); //绘制太阳glRotatef((GLfloat)year, 0, 1, 0); //沿y轴旋转 glTranslatef(3, 0, 0); //将场景中的物体沿x轴正方向移动2个单位长glRotatef((GLfloat)day, 0, 1, 0); //沿y轴旋转glutWireSphere(0.2, 10, 8); //绘制行星glPopMatrix(); //出栈glutSwapBuffers();glFlush(); //刷新窗口以显示当前绘制图形
}void init(void)
{glClearColor(0, 0, 0, 0);glShadeModel(GL_FLAT); //选择平面明暗模式或光滑明暗模式
}void reshape(int w, int h)
{glViewport(0, 0, (GLsizei)w, (GLsizei)h); //设置机口glMatrixMode(GL_PROJECTION); //指定哪一个矩阵是当前矩阵glLoadIdentity();gluPerspective(60, (GLfloat)w / (GLfloat)h, 1.0, 20); //创建透视投影矩阵(fovy,aspect,zNear,zFar);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0, 5, 5, 0, 0, 0, 0, 1, 0);
}
void keyboard(unsigned char key, int x, int y)
{switch (key){case 'd':day = (day + 10) % 360;glutPostRedisplay();break;case 'D':day = (day - 10) % 360; // 大写情况下是逆向的glutPostRedisplay();break;case 'y':year = (year + 5) % 360;glutPostRedisplay();break;case 'Y':year = (year - 5) % 360; // 大写情况下是逆向的glutPostRedisplay();break;default:break;}
}int main(int argc, char *argv[])
{glutInit(&argc, argv); //固定格式glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //缓存模式glutInitWindowSize(600, 600); //显示框的大小glutInitWindowPosition(100, 100); //确定显示框左上角的位置glutCreateWindow("第三次作业");init(); // 初始化glutDisplayFunc(display); // 执行显示glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop(); //进人GLUT事件处理循环return 0;
}
总结
本次任务是对opengl中绘制的顺序和逻辑考察,参考了网上的一些好的代码,感觉学到了好多东西
OPengl实现小球围绕大球旋转的效果相关推荐
- java 运动的大球吃小球_大球吃小球
Ball.java package day7; import java.awt.Color; import java.awt.Graphics; public class Ball { int x,y ...
- canvas小球绕大球转动动画
<!DOCTYPE html> <html> <head> <title>html拖拽事件</title> <script src=' ...
- 案例06:大球自转+小球公转+移动
OpenGL + OpenGL ES +Metal 系列文章汇总 这个案例是OpenGL中的一个比较经典的综合案例,结合了OpenGL中大部分知识点,下面就来了解下这个案例 先来看看最终的效果 整体的 ...
- unity3D台球游戏之球杆围着白球旋转瞄准目标
有一个星期没写博客了,最近搬到同学的工作室来混了,上一个游戏是我用unity做的第一个游戏,变成web版和PC版很easy,但是变成android版的时候我就倒霉咯,我在虚拟机上和真机上都不能运行,设 ...
- unity3D台球游戏之球杆围着白球旋转瞄准目标 ***
unity3D台球游戏之球杆围着白球旋转瞄准目标 有一个星期没写博客了,最近搬到同学的工作室来混了,上一个游戏是我用unity做的第一个游戏,变成web版和PC版很easy,但是变成android版的 ...
- 第十五篇:大球联赛与小球联赛
关于大小球的研究,是一个资深玩家必须重视的课题,很多人研究赔率和让球盘口,而对庄家为每一场球设置的大小球盘与比赛走势之间的关联,知之甚少.其实,大小球盘,同样可以成为你分析比赛的一个重要辅助工具. 理 ...
- 大球吞小球html5游戏在线玩,大球吃小球大作战
大球吃小球大作战是以大鱼吃小鱼这个定论做的一款休闲类游戏,游戏玩法如题,尽量多的吃掉比你小的,不要被比你大的吃掉了哟. 官方介绍 大球吃小球大作战是一款酷萌的休闲游戏,玩家在游戏中就要大球吃小球,努力 ...
- Python大球吃小球
本小游戏采用了pygame模块 1.产生随机颜色的小球.2.小球具有移动.吃别的小球.绘制这3个方法.3.鼠标点击事件 上源码 // 大球吃小球 from enum import Enum, uniq ...
- 大球吃小球html5,怎么用html5制作简单的大球吃小球的游戏
匿名用户 1级 2017-12-16 回答 <html> <head> <title> 大球吃小球by大奔 </title> <script ty ...
最新文章
- python accept解析_python中requests库使用方法详解
- 红绿灯问题(位运算)
- OpenCV图像数据访问,查询表和时间消耗测试
- 45度炸队Alpha冲刺博客集
- C# 数据结构--排序[下]
- 七种方式,教你在SpringBoot初始化时搞点事情!
- 小时光扫地机器人圆圆_小时光:圆圆录像功能已开启,无死角录制林一霸道总裁一面,超甜...
- MT7621搭载openwrt实现U盘等设备自动挂载
- 多个excel工作簿合并_无需VBA代码,1分钟合并多个工作簿至一个工作簿!
- 可以说是迄今为止最好用的右键菜单管理工具
- java 计算农历_java计算农历日期
- js多重循环遍历渲染
- 电影和电视Movies and TV
- 6、T5L DGUS ll 应用开发指南摘录(一)
- svn查看ip linux,查看svn服务器的ip地址
- 最小二乘法直线拟合及其Matlab实现
- Android系统自定义关机充电图标
- 识别win10和linux的MBR,Win10下安装ElementaryOS双系统:UEFI和Legacy引导
- 《软件测试》第十章 外国语言测试
- Android屏幕背光调整机制