计算机图形学OpenGL中绘制太阳_地球_月亮的运动模型源代码
- 格式:doc
- 大小:14.00 KB
- 文档页数:2
基于opengl的3D天体运动模型设计方案学生: ____???___学号: ************指导老师: ___???___一、背景简介1.1设计概述本3D建模设计运用Win32程序设计的基本原理,基于OpenGL接口函数,以Microsoft Visual Studio 2008为开发工具,以C++语言为开发语言,设计了一个星空背景下的太阳—地球—月球公转自转运动模型,模拟了太阳的光照效果,并实现了可以加速和减速地球和月球的自转、公转速度,而且还可以调整视图的远近和方位,方便各方面的观察。
1.2 OpenGL的基本特点OpenGL即开放图形库(Open Graphics Library),是一个三维的计算机图形和模型库。
OpenGL作为一个性能优越的图形应用程序设计接口,适用于广泛的计算机环境。
从个人计算机到工作站和超级计算机,OpenGL都能实现高性能的三维图形功能。
OpenGL是一个与硬件图形发生器的软件接口,它包括了100多个图形操作函数,开发者可以利用这些函数来构造景物模型、进行三维图形交互软件的开发。
正如上一章所述,OpenGL是一个高性能的图形开发软件包。
OpenGL支持网络,在网络系统中用户可以在不同的图形终端上运行程序显示图形。
OpenGL作为一个与硬件独立的图形接口,它不提供与硬件密切相关的设备操作函数,同时,它也不提供描述类似于飞机、汽车、分子形状等复杂形体的图形操作函数。
用户必须从点、线、面等最基本的图形单元开始构造自己的三维模型。
当然,像OpenInventor那样更高一级的基于OpenGL的三维图形建模开发软件包将提供方便的工具。
因此OpenGL的图形操作函数十分基本、灵活。
它具有如下特点。
(1)图形质量好、性能高。
无论是三维动画、CAD,还是视觉模拟、可视化计算等,都利用了OpenGL高图形质量、高性能的特点。
这个特点使得程序开发者在广播、CAD/CAM/CAE、娱乐、医学图像和虚拟现实等领域中创造和显示出难以想象的2D和3D图形。
#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <glut.h>//行星GLfloat rot0 = 30.0;GLfloat rot1 = 0.0;GLfloat rot2 = 0.0;GLfloat rot3 = 0.0;GLfloat rot4 = 0.0;GLfloat rot5 = 0.0;GLfloat rot6 = 0.0;GLfloat rot7 = 0.0;GLfloat rot8 = 0.0;//卫星GLfloat rot9 = 0.0;GLfloat rot10 = 0.0;GLfloat rot11 = 0.0;void init(){glClearColor(0.0,0.0,0.0,0.0);glClearDepth(1.0);glShadeModel(GL_FLAT);}void display(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glColor3f(1.0,1.0,1.0);glLoadIdentity();//gluLookAt(0, 10, 10, 0,0,0,0, 1,0);//glRotatef(45.0,0.0,0.0,1.0);glTranslatef(0.0,0.0,-20.0);glRotatef(90.0,1.0,0.0,0);glPushMatrix();//绘制太阳glColor3f(1.0,0.0,0.0);glutSolidSphere(2.0,32,32);//绘制地球glPushMatrix();glColor3f(0.0,0.0,1.0);// 绘制辅助轨道glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 5.0, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置地球公转速度glRotatef(rot0,0.0,1.0,0.0);// 设置地球半径glTranslatef(5.0,0.0,0.0);// 设置地球自转速度//glRotatef(rot1,0.0,1.0,0.0);// 绘制地球glutSolidSphere(0.4,32,32);// 绘制地球的卫星-月亮glColor3f(0.5,0.6,0.5);// 抵消地球自转影响//glRotatef(-rot1,0.0,1.0,0.0);// 绘制辅助轨道glRotatef(90,1.0,0,0.0);glRotatef(-90,1.0,0,0.0);// 设置月亮公转速度glRotatef(rot9,0.0,1.0,0.0);// 设置月亮公转半径glTranslatef(0.6,0.0,0.0);// 绘制月亮glutSolidSphere(0.1,10,8); glPopMatrix();// 绘制水星glPushMatrix();glColor3f(0.0,1.0,1.0);// 绘制辅助轨道glRotatef(90,1.0,0,0.0); glutSolidTorus(0.02, 2.5, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置水星公转速度glRotatef(rot1,0.0,1.0,0.0);// 设置水星公转半径glTranslatef(2.5,0.0,0.0);// 设置水星自传glRotatef(rot3,0.0,1.0,0.0);// 绘制水星glutSolidSphere(0.2,32,32); glPopMatrix();//绘制金星glPushMatrix();glColor3f(0.0,1.0,0.0);//绘制辅助轨道glRotatef(90,1.0,0,0.0); glutSolidTorus(0.02, 3.4, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置金星公转速度glRotatef(rot2,0.0,3.0,0.0);// 设置金星公转半径glTranslatef(3.4,0.0,0.0);// 设置金星自传glRotatef(rot0,0.0,1.0,0.0);// 绘制金星glutSolidSphere(0.3,32,32); glPopMatrix();//绘制火星glPushMatrix();glColor3f(1.0,0.0,0.0);//绘制辅助轨道glRotatef(90,1.0,0,0.0); glutSolidTorus(0.02, 6.6, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置火星公转速度glRotatef(rot3,0.0,4.0,0.0);// 设置火星公转半径glTranslatef(6.6,0.0,0.0);// 设置火星自传glRotatef(rot7,0.0,2.0,0.0);// 绘制火星glutSolidSphere(0.5,32,32); glPopMatrix();//绘制木星glPushMatrix();glColor3f(2.0,0.1,1.0);//绘制辅助轨道glRotatef(90,1.0,0,0.0); glutSolidTorus(0.02, 8.5, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置木星公转速度glRotatef(rot4,0.0,0.4,0.0);// 设置木星公转半径glTranslatef(8.5,0.0,0.0);// 设置木星自传glRotatef(rot3,0.0,0.3,0.0);// 绘制木星glutSolidSphere(1.0,32,32);// 绘制木星卫星-木卫1glColor3f(0.4,0.3,0.5);// 抵消地球自转影响//glRotatef(-rot1,0.0,1.0,0.0);// 绘制辅助轨道glRotatef(90,1.0,0,0.0);glRotatef(-90,1.0,0,0.0);// 设置木卫1公转速度glRotatef(rot10,0.0,1.0,0.0);// 设置木卫1公转半径glTranslatef(1.3,0.0,0.0);// 绘制木卫1glutSolidSphere(0.1,10,8);// 绘制木星卫星-木卫2glColor3f(0.5f,0.5f,0.5f);// 抵消地球自转影响//glRotatef(-rot1,0.0,1.0,0.0);// 绘制辅助轨道glRotatef(90,1.0,0,0.0);glRotatef(-90,1.0,0,0.0);// 设置木卫2公转速度glRotatef(rot11,0.0,1.0,0.0);// 设置木卫2公转半径glTranslatef(1.2,0.0,0.0);// 绘制木卫2glutSolidSphere(0.08,10,8);glPopMatrix();//绘制土星glColor3f(1.0f, 1.0f, 0.0f);//绘制辅助轨道glRotatef(90,1.0,0,0.0); glutSolidTorus(0.02, 12.5, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置土星公转速度glRotatef(rot5,0.0,0.4,0.0);// 设置土星公转半径glTranslatef(12.5,0.0,0.0);// 设置土星自传glRotatef(rot3,0.0,0.3,0.0);// 绘制土星glutSolidSphere(0.85,32,32);//绘制土星光环glRotatef(90,1.0,0,0.0); glutSolidTorus(0.1, 1.25, 10, 64); glRotatef(-90,1.0,0,0.0);glRotatef(90,1.0,0,0.0);glutSolidTorus(0.07, 1.65, 10, 64); glRotatef(-90,1.0,0,0.0); glPopMatrix();glPopMatrix();//绘制天王星glPushMatrix();glColor3f(0.0f, 1.0f, 1.0f);//绘制辅助轨道glRotatef(90,1.0,0,0.0); glutSolidTorus(0.02, 15.5, 10, 64); glRotatef(-90,1.0,0,0.0);// 设置天王星公转速度glRotatef(rot6,0.0,0.4,0.0);// 设置天王星公转半径glTranslatef(15.5,0.0,0.0);// 设置天王星自传glRotatef(rot1,0.0,0.3,0.0);// 绘制天王星glutSolidSphere(0.15,32,32); glPopMatrix();//绘制海王星glColor3f(0.0f, 0.0, 8.0f);//绘制辅助轨道glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 17.5, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置海王星公转速度glRotatef(rot7,0.0,0.4,0.0);// 设置海王星公转半径glTranslatef(17.5,0.0,0.0);// 设置海王星自传glRotatef(rot3,0.0,0.3,0.0);// 绘制海王星glutSolidSphere(0.145,32,32);glPopMatrix();//绘制冥王星glPushMatrix();glColor3f(0.5f, 0.5f, 0.5f);//绘制辅助轨道glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 19.5, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置冥王星公转速度glRotatef(rot8,0.0,0.4,0.0);// 设置冥王星公转半径glTranslatef(19.5,0.0,0.0);// 设置冥王星自传glRotatef(rot2,0.0,0.3,0.0);// 绘制冥王星glutSolidSphere(0.145,32,32);glPopMatrix();glutSwapBuffers();glFlush();}void idle(){if(rot0>=360.0)rot0-=360.0;rot1+=0.416;if(rot1>=360.0)rot1-=360.0;rot2+=0.1631;if(rot2>=360.0)rot2-=360.0;rot3+=0.053;if(rot3>=360.0)rot3-=360.0;rot4+=0.0083;if(rot4>=360.0)rot4-=360.0;rot5+=0.0034;if(rot5>=360.0)rot5-=360.0;rot6+=0.00119;if(rot6>=360.0)rot6-=360.0;rot7+=0.00069;if(rot7>=360.0)rot7-=360.0;rot8+=0.0008;if(rot8>=360.0)rot8-=360.0;rot9+=1.0;if(rot9>=360.0)rot9-=360.0;rot10+=0.005;if(rot10>=360.0) rot10-=360.0;if(rot11>=360.0)rot11-=360.0;glutPostRedisplay();}void reshape(int w,int h){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0,(GLdouble)w/(GLdouble)h,1.0,100.0);glMatrixMode(GL_MODELVIEW);}void main(int argc,char **argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(600,400);glutInitWindowPosition(500,500);glutCreateWindow("planet sim");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutIdleFunc(idle);glutMainLoop();return;}。
第一章1.1 名词解释:图形、图像、点阵法、参数法。
1.2 图形包括哪两方面的要素?在计算机中如何表示它们?1.3 什么叫计算机图形学?分析计算机图形学、数字图像处理和计算机视觉学科间的关系。
1.4 有关计算机图形学的软件标准有哪些?1.5 试从科学发展历史的角度分析计算机图形学以及硬设备的发展过程。
1.6 试发挥你的想象力,举例说明计算机图形学有哪些应用范围,解决的问题是什么?1.7 一个交互性计算机图形系统必须具有哪几种功能?第二章2.1 名词解释:随机扫描、光栅扫描、图形显示子系统、像素点、光点、屏幕分辨率、显示分辨率、存储分辨率、组合像素法、颜色位面法、位平面、颜色查找表。
2.2 试列举出你所知道的图形输入与输出设备。
2.3 阴极射线管由哪几部分组成?它们的功能分别是什么?2.4 简述什么叫桶形失真?如何校正?2.5 简述荫罩式彩色阴极射线管的结构和工作原理。
2.6 比较荫罩式彩色阴极射线管和穿透式彩色阴极射线管的异同。
2.7 简述黑底荫罩式彩色阴极射线管的结构和特点。
2.8 简述光栅扫描图形显示器的工作逻辑。
2.9 基于光栅扫描的图形显示子系统由哪几个逻辑部件组成?它们的功能分别是什么?2.10 什么是像素点?什么是显示器的分辨率?2.11 某些显示卡为什么要采用颜色查找表?采用颜色查找表的系统的工作原理是什么?2.12 确定用你的系统中的视频显示器x和y方向的分辨率,确定其纵横比,并说明你的系统怎样保持图形对象的相对比例。
2.13 如何根据显示器的指标计算显示存储器的容量。
2.14 图形的硬拷贝设备有哪些,简述其各自的特点。
第三章3.1 名词解释(可用图示):回显、约束、网格、引力域、橡皮筋技术、草拟技术、拖动、旋转、形变。
3.2 什么是用户模型,设计一个好的用户接口要涉及到哪些因素?3.3 gks的有哪六种逻辑输入设备,试评价这六种逻辑分类方法。
3.4 举例说明什么是请求方式、取样方式、事件方式及其组合形式。
#include <assert.h>#include <cmath>#include <iostream>#include <vector>#include <glut.h>using namespace std;typedef vector<int> list;vector<list> ls, cs;int old_x, old_y, new_x, new_y, cx, cy, cr; int mouse_type;/* breseman画线算法*/void line(int x1, int y1, int x2, int y2) { glBegin(GL_POINTS);if (x1==x2 && y1==y2) {glVertex2i(x1, y1);return;}if (x1>x2) {swap(x1, x2);swap(y1, y2);}glVertex2d(x1, y1);int dy=abs(y2-y1);int dx=abs(x2-x1);if (dx>=dy) {int incy=(dy!=0?dy/(y2-y1):0);int p=2*dy-dx;int dy2=2*dy;int dd2=2*(dy-dx);int x, y=y1;for (x=x1+1; x<=x2; ++x) {if (p<0) {glVertex2i(x, y);p+=dy2;}else {y+=incy;glVertex2i(x, y);p+=dd2;}}}else {if (y1>y2) {swap(x1, x2);swap(y1, y2);}int incx=(dx!=0?dx/(x2-x1):0);int p=2*dx-dy;int dx2=2*dx;int dd2=2*(dx-dy);int x=x1, y;for (y=y1+1; y<=y2; ++y) {if (p<0) {glVertex2i(x, y);p+=dx2;}else {x+=incx;glVertex2i(x, y);p+=dd2;}}}glEnd();}/* 中点圆算法*/void circle(int cx, int cy, int r) { int x=0, y=r;float p=1.25-r;while (x<=y) {glBegin(GL_POINTS);glVertex2i(cx+x, cy+y);glVertex2i(cx-x, cy+y);glVertex2i(cx-x, cy-y);glVertex2i(cx+x, cy-y);glVertex2i(cx+y, cy+x);glVertex2i(cx-y, cy+x);glVertex2i(cx-y, cy-x);glVertex2i(cx+y, cy-x);glEnd();if (p<0) {++x;p+=2*x+1;}else {p+=2*x-2*y+5;++x;--y;}}}void draw(){int i;for (i=0; i<ls.size(); ++i)line(ls[i][0], ls[i][1], ls[i][2], ls[i][3]);for (i=0; i<cs.size(); ++i)circle(cs[i][0], cs[i][1], cs[i][2]);if(mouse_type == 1)line(old_x, old_y, new_x, new_y);if(mouse_type == 3)circle(cx, cy, cr); //圆上的点和半径}void display() {glClear(GL_COLOR_BUFFER_BIT);glColor3i(0, 0, 0);draw();glutSwapBuffers();}void keyboard( unsigned char key, int x, int y) {switch (key) {case 27:exit (0);break;case 'a':case 'A':break;default:if (key<='z' && key>='a' || key<='Z' && key>='A' || key<='9' && key>='0'){ cout<<char(key);}else{cout<<"\n字符码为"<<static_cast<int>(key);display();}}}void mouseclick( int button, int state, int x, int y ){cout<<"("<<x<<","<<y<<")";switch ( button ) {case GLUT_LEFT_BUTTON:if ( state == GLUT_DOWN ) {cout<<"左键被按下";old_x = x;old_y = 600-y;mouse_type = 1;}else if ( state == GLUT_UP ) {cout<<"左键被松开";list l;l.push_back(old_x);l.push_back(old_y);l.push_back(x);l.push_back(600-y);ls.push_back(l);mouse_type = 0;glutPostRedisplay();for(int i=0; i<ls.size(); ++i)cout<<endl<<"line_"<<i<<": "<<ls[i][0]<<","<<ls[i][1]<<" "<<ls[i][2]<<","<<ls[i][3];}break;case GLUT_MIDDLE_BUTTON:break;case GLUT_RIGHT_BUTTON:if ( state == GLUT_DOWN ) {cout<<"右键被按下";cx = x;cy = 600-y;mouse_type = 3;}else if ( state == GLUT_UP ) {cout<<"右键被松开";list l;l.push_back(cx);l.push_back(cy);cr=int(sqrt(double(x-cx)*(x-cx)+(600-y-cy)*(600-y-cy))+0.5);l.push_back(cr);cs.push_back(l);mouse_type = 2;glutPostRedisplay();for(int i=0; i<cs.size(); ++i)cout<<endl<<"circle_"<<i<<": "<<cs[i][0]<<","<<cs[i][1]<<" "<<cs[i][2];}break;}}void screenmotion(int x, int y){if(mouse_type == 1){new_x = x;new_y = 600-y;cout<<endl<<"new-line:"<<old_x<<","<<old_y<<" "<<new_x<<","<<new_y<<endl; }else if(mouse_type == 3){cr=int(sqrt(double(x-cx)*(x-cx)+(600-y-cy)*(600-y-cy))+0.5);cout<<endl<<"new-circle: "<<cx<<","<<cy<<" "<<cr<<endl;}glutPostRedisplay();}void init() {glClearColor(0.2, 0.5, 0.8, 0.0); //背景颜色glMatrixMode(GL_PROJECTION);gluOrtho2D(-1.0, 600, 0.0, 601);}int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowPosition(100, 50); //图框在屏幕的位置glutInitWindowSize(600, 600); //边框大小glutCreateWindow("图元算法"); //图框边显示的字init();glutDisplayFunc(display);glutMotionFunc(screenmotion);glutKeyboardFunc( keyboard );glutMouseFunc( mouseclick );glutMainLoop();return 0;}。
实验目的:
在VC6.0的opengl的环境下,实现固定物体的连续变化,从而使简单动画得以实现。
实验思想:
由于是简单图形的变化过程,所以问题关键在于:
1、物体的位置变化如何实现,而位置变化在opengl中体现在坐标的变化中,因而设置坐标的每一步物体的位置变化情况是该问题的关键,此关键代码如下:
wAngleX += 1.0f;
wAngleY += 10.0f;
wAngleZ += 5.0f;
2、再有就是如何使得连续的变化得以实现,这就实现了手动变化相自动变化的转变,为了实现这一问题,我们想到设置一个变化时间,使得物体在每个时间段变换一次位置,当这个时间适当小时,就实现了物体的连续变化;这就需要引进一个计时器,通过设置间隔时间实现物体的连续变化,此关键代码如下:
SetTimer(1, 150, NULL);
实验步骤:
1、初始化OpenGL。
2、设置菜单与关联函数初始化,设置视口与窗口匹配,重新设置坐标系统。
3、建立正交变换下的剪切体(即变换物体)。
4、编写变换幅度函数,设置没不变换情况。
5、编写连续变换计时器,使得在一定间隔下连续变换。
实验关键代码:
实验结果:。
地球动效代码地球动效是一种通过计算机程序实现的模拟地球自转和公转运动的效果。
通过编写相应的代码,可以让地球呈现出逼真的运动轨迹和变化。
在编写地球动效代码时,我们需要使用一些数学知识和计算机图形学的基础知识。
首先,我们需要确定地球的中心点和半径,以及地球自转和公转的速度。
然后,我们可以使用三维坐标系来表示地球的位置和运动轨迹。
在代码中,我们可以使用一些常见的编程语言,如JavaScript、Python或C++来实现地球动效。
下面是一个使用JavaScript语言实现地球动效的示例代码:```javascript// 设置地球的中心点和半径var earthCenter = { x: 0, y: 0, z: 0 };var earthRadius = 100;// 设置地球的自转和公转速度var earthRotationSpeed = 0.01;var earthRevolutionSpeed = 0.005;// 创建一个函数来更新地球的位置function updateEarthPosition() {// 计算地球的自转角度var earthRotationAngle = earthRotationSpeed * Date.now(); // 计算地球的公转角度var earthRevolutionAngle = earthRevolutionSpeed * Date.now();// 计算地球在三维坐标系中的位置var earthX = earthCenter.x + earthRadius * Math.sin(earthRevolutionAngle);var earthY = earthCenter.y + earthRadius * Math.cos(earthRevolutionAngle);var earthZ = earthCenter.z;// 将地球的位置应用到对应的HTML元素上var earthElement = document.getElementById('earth');earthElement.style.transform = 'translate3d(' + earthX + 'px, ' + earthY + 'px, ' + earthZ + 'px) rotateY(' + earthRotationAngle + 'rad)';}// 创建一个动画循环来更新地球的位置function animate() {requestAnimationFrame(animate);updateEarthPosition();}// 启动动画循环animate();```在这个示例代码中,我们首先设置了地球的中心点和半径,以及自转和公转的速度。
目录实验一:OpenGL基础知识 0实验二 OpenGL中的建模与变换 (1)实验三 OpenGL中的光照 (4)实验四 OpenGL中的拾取 (7)实验五 OpenGL中的纹理映射 (10)实验一:OpenGL基础知识一、实验目的1、建立Windows系统下的OpenGL实验框架。
2、学习理解OpenGL工作流程。
二、实验环境⒈硬件:每个学生需配备计算机一台。
⒉软件:Visual C++;三、实验内容1、建立非控制台的Windows程序框架。
2、建立OpenGL框架。
3、建立OpenGL框架的类文件。
4、完善Windows框架。
5、理解程序间的相互关系。
四、实验要求1、学习教材第2章的内容。
2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。
3、运行结果应该与教材中的相关实例相符。
4、编译第2章的框架代码,修改背景色、窗口标题。
五、程序设计提示(略)六、报告要求1.认真书写实验报告,字迹清晰,格式规范。
报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验原理。
2.报告中应书写主要源程序,且源程序中要有注释。
3.报告中应包含运行结果及结果分析。
如调试通过并得到预期的效果,请注明‘通过’并粘贴运行效果图;如未调试通过或结果不正确,试分析原因。
4.报告最后包含实验总结和体会。
实验二 OpenGL中的建模与变换一、实验目的1.学习配置OpenGL环境。
2.掌握在OpenGL中指定几何模型的方法。
3. 掌握OpenGL中的透视投影和正投影的设置方法,学会诊断投影问题导致的显示异常。
二、实验环境⒈ 硬件:每个学生需配备计算机一台。
⒉ 软件:Visual C++;三、实验内容1.建立OpenGL编程环境(注:Windows自带gl和glu,还需要安装glut库文件。
)(a)查看Windows自带的OpenGL文件。
在文件夹c:\windows\system32下查看是否存在文件opengl32.dll和glu32.dll;在Visual Studio的安装目录Vc7\PlatformSDK\Include\gl下查看是否存在gl.h和glu.h;在Vc7\PlatformSDK\Lib 下是否存在opengl32.lib和glu32.lib。