OpenGL中太阳_地球_月亮
计算机图形学复习题目

第一章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 举例说明什么是请求方式、取样方式、事件方式及其组合形式。
基于OpenGL的地球/地图三维模拟软件设计

( H 叩 A - m d n ta e e m yld , ab 09 , hn ) h o A miirlnC mln .H ri 1 00 C i p s i a n 5 a
Ab ta t O e G s te o e s r c : p n L i h p n 3一 D rp i ds ly d sg n i n n ,a d i i iey a pid i e g a hc i a e in e vr me t n t s w d l p l n t p o e h 3一D s lt n a i a o 嗍 mu i fri f ce c n tb l y o t e iin y a d s i t .Ho e e .te 3一 D s u a o ft e e r d ma s s a i w vr h i lt n o a t a p i m i h hn
dcm n v w sut e r ne b c e o d O  ̄G rp i ee p n p t ̄ .T ed i ou et i t c r ,oi t oj tm t d a pn L g h sdvl m t l f /e r u ed e h n a c oe a o h e g sn
h e at o e g o nma o S s s te k y p r rte d i fte a i t n a d GI y tm .Ac o dn e e r v me t f h s n h i n e c r i g t t a t mo e n ,ma ip y oh h p ds l a n i t ru d w v i t n p st n a n,t i lt ot e i d g d b C MF a d te ar o go n a e dr c o o i o d s a he s uain s f r e i e y V / C a d i h ei i n p m o wa s s n n s t
计算机图形学第五次实验报告

《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。
二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。
1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。
三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。
要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。
消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。
物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。
用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。
1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。
世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。
为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。
物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。
观察坐标系的原点一般即是观察点。
物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。
选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。
因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。
这需要对物体进行三维旋转和平移变换。
常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。
利用OpenGL绘制三维地球模型

并指定 球体上点 的法线 向量和纹理 坐标 的方 法来实 现 。采 用 本方法 可以建立 一定半径 、经纬细分 程序可 控 以及 纹理 映射
关系稳定的球体模 型。 地球 是个 椭球体 ,且球 面上海拔 高度分 布不均 ,在设 计 球体 时 ,可首 先将地球想 像成一个 规则球形 ,对 于球面 上任 意一点 ,将地球球 面半径 与该 点对应 高程数 据相加 ,即可得 到该 点距 球心 的距离 ,通 过对球面 上点 的建 模 .可 以得 到具 有真实感 的地球 三维球 面 .叠加全球 遥感影像 数据 形成球 面 纹理 ,从而实现地球仪 的效果 。 球是 曲面 ,按有 限单元 化的思 想 将其进 行 曲 面小片 化 。 地理位 置通过经 纬线来标 定 .经线 和纬线 的交点就 是相应 的 几何 顶点 。顶 点之 间相连 接 ,可 以将 球 削出一 个 正 n面 体 , 对于正 n面体 中的每个三 角形 ,计算 每条边 的 中点 ,中点和 中点 进行连线 。这样一个 三角形小 面就用 4个小 的三角 形来 代替 。最后 把新 生成 的顶 点坐标 所表 示 的向量 进行 单位 化 , 并将此 向量乘上地球 球心距顶 点的距离 ( 即球 面半 径 R与该
Ke y wo r d s : Op e n GL g r a p h i c s l i b r a r y: 3 D Wo r l d Ma p; L OD t e c h n o l o g y
地球模 型的三维 可视化在 G o o g l e e a r t h 、Wo r l d Wi n d等商 业 软件 中已有 所 体 现 ,但 其核 心 算 法 鲜有 系统 研 究 , G o o g l e E a r t h以三 维地球 的形 式把大 量卫 星图片 、航拍 照片和
OpenGL实验指导

计算机图形学实验指导书课程名称: 计算机图形学基础英文名称: Computer Graphics 课程性质: 限选编写人: 孔繁茹2010年9月1日计算机学院阅读说明● 未加标注的为参考实验 ● 标有☆的为必做实验 ● 标有★的为选做实验实验要求● 每个小组 ≤ 4人,需要完成以下任务⏹ 所有必做实验 (40%) 8 * 5分 ⏹ 2项选做实验 (20%) 2 * 10分 ⏹ 1项综合实验 (40%) 1 * 40分Part 1 预备知识实验1.1 环境设置[参考程序] demo.c 图 1.1.1 一、实验目的熟悉VC 编程环境, 配置OpenGL 图形环境 二、实验内容1.OpenGL 环境设置将OpenGL 所需函数库和头文件复制到指定目录.也可以通过批处理文件的方式, 将下面四行存入一文本文件, 改名为set.bat , 然后双击set.bat 运行. copy glut.h "C:\Program Files\Microsoft Visual Studio\VC98\Include\GL" copy glut32.lib "C:\Program Files\Microsoft Visual Studio\VC98\Lib" copy glut32.dll "C:\WINDOWS\system32" pause注意: 如果VC 安装在D 盘或其他盘, 应修改相应路径 2.编译运行demo.c, 查看环境是否配置成功Part 2 OpenGL 编程基础图 1.1.1实验2.1 OpenGL 编程基础[参考程序]hello.c 图2.1.1 chap2-1.cpp 图2.1.2一、实验目的熟悉OpenGL 编程框架、基本函数、几何原语 二、实验内容1. 运行hello.c, 查看运行结果, 并完成以下练习1) 改变背景颜色 2) 改变图形颜色 3) 改变窗口大小 4) 改变窗口位置2. 用OpenGL 几何原语绘制点, 直线, 多边形, 三角形带等基本图形. OpenGL 编程基础可参考附录。
OpenGL入门教程(精)

OpenGL 入门教程1.第一课:说起编程作图,大概还有很多人想起TC 的#include < graphics.h>吧?但是各位是否想过,那些画面绚丽的PC 游戏是如何编写出来的?就靠TC 那可怜的640*480 分辨率、16 色来做吗?显然是不行的。
本帖的目的是让大家放弃TC 的老旧图形接口,让大家接触一些新事物。
OpenGL 作为当前主流的图形API 之一,它在一些场合具有比DirectX 更优越的特性。
1、与C 语言紧密结合。
OpenGL 命令最初就是用C 语言函数来进行描述的,对于学习过C 语言的人来讲,OpenGL 是容易理解和学习的。
如果你曾经接触过TC 的graphics.h,你会发现,使用OpenGL 作图甚至比TC 更加简单。
2、强大的可移植性。
微软的Direct3D 虽然也是十分优秀的图形API,但它只用于Windows 系统(现在还要加上一个XBOX 游戏机)。
而OpenGL 不仅用于Windows,还可以用于Unix/Linux 等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。
并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关。
3、高性能的图形渲染。
OpenGL 是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL 提供强力支持,激烈的竞争中使得OpenGL 性能一直领先。
总之,OpenGL 是一个很NB 的图形软件接口。
至于究竟有多NB,去看看DOOM 3 和QUAKE4 等专业游戏就知道了。
OpenGL 官方网站(英文)下面我将对Windows 下的OpenGL 编程进行简单介绍。
学习OpenGL 前的准备工作第一步,选择一个编译环境现在Windows 系统的主流编译环境有V isual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL 的。
但这里我们选择V isual Studio 2005 作为学习OpenGL 的环境。
Stellarium入门

Stellarium入门(以0.10.2版为例)软件简介:Stellarium是一款免费开源的GPL(自由软件基金会GNU通用公共许可证)软件,它使用openGL技术对星空进行实时渲染。
软件可以真实地表现通过肉眼、双筒望远镜和小型天文望远镜所看到的天空。
不同编译版本的Stellarium可以在不同的操作系统下运行,目前支持的操作系统包括:Linux/Unix、Windows和MacOS X。
它可以根据观测者所处的时间和地点,计算天空中太阳、月球、行星和恒星的位置,并将其显示出来。
它还可以绘制星座、虚拟天文现象(如流星雨、日食和月食等)。
Stellarium可以用作学习夜空知识的教具,还可以作为天文爱好者星空观测的辅助工具,或者仅仅是满足一下好奇心。
由于其高质量的画质,一些天象馆将Stellarium用在了实际的天象放映中。
有些天文爱好者还使用Stellarium绘制他们文章中用到的星图。
——摘自百度百科初识stellarium:进入stellarium,我们将会看到如下首界面:我们可以看到左下角有横竖两条功能图标栏。
这里注意以下,这两条功能图标栏是会自动隐藏的,当你鼠标移到左下角边缘时,他们会自动弹出来。
先来说一下这些图标分别代表什么功能:1、左边缘栏(自上而下):位置设置、时间设置、星空显示设置、天体搜寻、软件设置、说明2、下边缘栏(从左到右):星座连线、星座名称、星座绘图(限西方88星座)、赤道坐标、地平坐标、地面、基点、大气、星云、行星标记、赤道—地平坐标转换、将选中天体居中、夜间模式、全屏、退出软件、(时间)慢速、正常速度、当前时间、加速对于这些功能,不用硬记,将鼠标移到上面就会显示出来,这里列出来这是为了后文叙述的方便。
第一次使用stellarium:第一次打开stellarium,你也许会发现,下边缘功能栏会显示你的观测地点是巴黎,这是软件默认的观测地点。
所以为了让我们在软件上能模拟出我们头上的星空,必须对观测地点进行设定。
基于OpenGL的综合地球物理可视化及其应用

让 处 理解 释人 员快 速有 效地 接受 数 据所蕴 含 的有
1 引 言
在 地 球 物 理 数 据 的 处 理 与 解 释 中 , 视 化 技 可
用 信 息 。 综 合 地球 物理 所包 含 的数据 量 大 , 型 多 , 类 形
式 各异 , 要求 的 表 达方 式 也 不 尽 相 同 。如 何 将 所
Op nGL n t e a d I s App i a i n lc to
LiSh gu n u a g,Li a o u Ti ny u,Ya ng bo
( n ttt f Geph sc n o tc ,Ch n i est f o ce c s I siueo o y isa d Gema is ia Unv r i o Gesin e ,Wu a 3 0 4 h n y h n 4 0 7 ,C ia)
p e a i n p o e s b s d o h e GL ,wh c sa p i d t e t i r a i h o t e s r t to r c s a e n t eOp n i h wa p l o a c r a n a e n t en r h a t e
s a ia i n a e r o be pa tc a l m p t n n t e p oc s i g a d i t r r t ton By u u lz to pp a s t r iul ry i or a t i h r e s n n n e p e a i . — s n s a i g Vi u lC+ + l ng ge i he r s a c f c m p e n i e ge hy is vs a ia i n,t i a ua n t e e r h o o r he s v op s c iu lz to hs
OpenGL中绘制太阳,地球,月亮的运动模型

计算机图形学实验报告1、实验目的和要求利用第七章所学的知识,试在OpenGL中绘制太阳,地球,月亮的运动模型,并用相应的代码表示出来。
2、实验内容OpenGL中只提供了两种投影方式,一种是正投影,另一种是透视投影。
不管是调用哪种投影函数,为了避免不必要的变换,必须调用glMAtrixMode (GL_PROJECTION )因此在本实验中要学习这种方法,并使用投影的方式来做题。
3、实验步骤1)相关算法及原理描述为了简单起见,我们把三个天体都想象成规则的球体。
而我们所使用的glut实用工具中,正好就有一个绘制球体的现成函数:glutSolidSphere,这个函数在“原点”绘制出一个球体。
由于坐标是可以通过glTranslate*和glRotate*两个函数进行随意变换的,所以我们就可以在任意位置绘制球体了。
函数有三个参数:第一个参数表示球体的半径,后两个参数代表了“面”的数目,简单点说就是球体的精确程度,数值越大越精确,当然代价就是速度越缓慢。
这里我们只是简单的设置后两个参数为20。
太阳在坐标原点,所以不需要经过任何变换,直接绘制就可以了。
地球则要复杂一点,需要变换坐标。
由于今年已经经过的天数已知为day,则地球转过的角度为day/一年的天数*360度。
前面已经假定每年都是360天,因此地球转过的角度恰好为day。
所以可以通过下面的代码来解决:glRotatef(day, 0, 0, -1);/* 注意地球公转是“自西向东”的,因此是饶着Z轴负方向进行逆时针旋转*/ glTranslatef(地球轨道半径, 0, 0);glutSolidSphere(地球半径, 20, 20);月亮是最复杂的。
因为它不仅要绕地球转,还要随着地球绕太阳转。
但如果我们选择地球作为参考,则月亮进行的运动就是一个简单的圆周运动了。
如果我们先绘制地球,再绘制月亮,则只需要进行与地球类似的变换:glRotatef(月亮旋转的角度, 0, 0, -1);glTranslatef(月亮轨道半径, 0, 0);glutSolidSphere(月亮半径, 20, 20);但这个“月亮旋转的角度”,并不能简单的理解为day/一个月的天数30*360度。
OpenGL(七)光照模型及设置

OpenGL(七)光照模型及设置OpenGL把现实世界中的光照系统近似归为三部分,分别是光源、材质和光照环境。
光源就是光的来源,是“光”这种物质的提供者;材质是指被光源照射的物体的表⾯的反射、漫反射(OpenGL不考虑折射)特性;材质反映的是光照射到物体上后物体表现出来的对光的吸收、漫反射、反射等性能;光照环境反应环境中所有光源发出的光经过⽆数次反射、漫反射之后整体环境所表现出来的光照效果。
指定合适的光照环境参数可以使得最后形成的画⾯更接近于真实场景。
⼀、光源光照模型OpenGL中的光照模型中的反射光分为三个分量,分别是环境反射光(Ambient Light)、漫反射光(Diffuse Light)和镜⾯反射光(Specular Light)。
环境光Ambient:是由光源发出经环境多次散射⽽⽆法确定其⼊射⽅向的光,即似乎来⾃所有⽅向。
其特征是⼊射⽅向和出射⽅向均为任意⽅向。
漫射光Diffuse:来⾃特定⽅向,它垂直于物体时⽐倾斜时更明亮。
⼀旦它照射到物体上,则在各个⽅向上均匀地发散出去,效果为⽆论视点在哪⾥它都⼀样亮,其特征是⼊射⽅向唯⼀、出射⽅向为任意⽅向。
镜⾯光Specular:来⾃特定⽅向并沿另⼀⽅向反射出去,⼀个平⾏激光束在⾼质量的镜⾯上产⽣100%的镜⾯反射,其特征是⼊射⽅向和出射⽅向均唯⼀。
创建光源OpenGL中⽤函数glLightfv来创建光源,函数原型是:void glLightfv (GLenum light, GLenum pname, const GLfloat *params)第⼀个参数light指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、...、GL_LIGHT7。
第⼆个参数pname指定光源特性,这个参数的具体信息见下表所⽰。
第三个参数设置相应的光源特性值。
例如下边定义了⼀个位置在(0,0,0),没有环境光,镜⾯反射光和漫反射光都为⽩光的光源:GLfloat light_position[] = { 0.0, 0.0, 0.0, 0.0 };GLfloat light_ambient [] = { 0.0, 0.0, 0.0, 1.0 };GLfloat light_diffuse [] = { 1.0, 1.0, 1.0, 1.0 };GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_AMBIENT , light_ambient );glLightfv(GL_LIGHT0, GL_DIFFUSE , light_diffuse );glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);光源的位置坐标采⽤齐次坐标(x, y, z, w)设置。
OpenGL入门教程(精)

4、把解压得到的 glut.dll 和 glut32.dll 放到操作系统目录下面的 system32 文件夹内。(典型的位置为: C:\Windows\Sy st em32) 第三步,建立一个 OpenGL 工程 这里以 VisualStudio2005 为例。 选择 File->New->Project,然后选择 Win32 Console Application,选择一个名字,然后按 OK。 在谈出的对话框左边点 Application Settings,找到 Empty project 并勾上,选择 Finish。 然后向该工程添加一个代码文件,取名为“OpenGL.c”,注意用.c 来作为文件结尾。 搞定了,就跟平时的工程没什么两样的。 第一个 OpenGL 程序
在 glutDisplayFunc 函数中,我们设置了“当需要画图时,请调用 myDisplay 函数”。于是 myDisplay 函数就 用来画图。观察 myDisplay 中的三个函数调用,发现它们都以 gl 开头。这种以 gl 开头的函数都是 OpenGL 的标准函数,下面对用到的函数进行介绍。 1、glClear,清除。GL_COLOR_BUFFER_BIT 表示清除颜色,glClear 函数还可以清除其它的东西,但这里 不作介绍。 2、glR ect f,画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标。 3、glFlush,保证前面的 OpenGL 命令立即执行(而不是让它们在缓冲区中等待)。其作用跟 fflush(stdout) 类似。
OpenGL 入门教程
1.第一课:
说起编程作图,大概还有很多人想起 TC 的#include < graphics.h>吧? 但是各位是否想过,那些画面绚丽的 PC 游戏是如何编写出来的?就靠 TC 那可怜的 640*480 分辨率、16 色来做吗?显然是不行的。
计算机图形学 课程设计

2、gluSphere(quadric, 0.45f, 40, 40)函数是在原点绘制图形,经过 glTranslatef* 和 glRotatef*平移和旋转可以随意改变球体位置:
glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕 X 轴旋转-90 度 glTranslatef(1.7f, 0.0f, 0.0f); // 将坐标系右移 1.7f
8、建立一个地球公转轨道,调用函数 glTranslatef*把球体平移一定距离,使其在自
4
己的轨道上运行。同时为了使月球跟随地球,glRotatef(fEarthOrbit , 0.0f, 1.0f, 0.0f); 将坐标系绕 Y 轴旋转地球公转的角度,控制月亮跟随地球,用函数 glTranslatef*平移使月 球轨道在地球周围而不与地球重叠。
5
参数代表要操作的目标,GL_PROJECTION 是对投影矩阵操作,GL_MODELVIEW 是对模型视景矩 阵操作,GL_TEXTURE 是对纹理矩阵进行随后的操作。 13、glutIdleFunc(void (*func)(void))在 glutIdleFunc(void (*func)(void))回调函数 中指定一个函数,如果不存在其他尚未完成的事件(例如,当事件循环处于空闲的时候), 就执行这个函数。这个回调函数接受一个函数指针作为它的唯一参数。如果向它传递 NULL(0),就相当于禁用这个函数。glutMainLoop 进入 GLUT 事件处理循环。在一个 GLUT 程 序中,这个例程被调用一次 。一旦被调用,这个程序将永远不会返回 无限循环。它将调用 必要的任何已注册的回调。程序最后调用这个函数,让程序循环执行下去,使运动继续下去。
9、OpenGl 把三维坐标中的球体绘制到而为坐标屏幕,绘制的顺序是按代码的顺序来进 行的。因此后绘制的物体会遮住先绘制的物体,既使后绘制的物体在先绘制的物体后面也是 一样,使用深度测试可以解决这个问题。使用方法是:以 GL_DEPTH_TEST 为参数调用 glEnable 函数,启动深度测试。在必要时(通常是每次绘制画面开始时)清空深度缓冲,即: glClear(GL_DEPTH_BUFFER_BIT) , 其 中 glClear(GL_COLOR_BUFFER_BIT) 与 glClear(GL_DEPTH_BUFFER_BIT) 可 以 合 并 写 为 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT),且后者运行速度比前者快。
OPenGL知识点

1.创建一个OpenG L窗口:在这个教程里,我将教你在Wi ndows环境中创建OpenG L程序.它将显示一个空的Ope nGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序的框架.理解OpenG L如何工作非常重要,你可以在教程的末尾下载源程序,但我强烈建议你至少读一遍教程,然后再开始编程. 2.你的第一个多边形:在第一个教程的基础上,我们添加了一个三角形和一个四边形。
也许你认为这很简单,但你已经迈出了一大步,要知道任何在O penGL中绘制的模型都会被分解为这两种简单的图形。
读完了这一课,你会学到如何在空间放置模型,并且会知道深度缓存的概念。
3.添加颜色: 作为第二课的扩展,我将叫你如何使用颜色。
你将理解两种着色模式,在左图中,三角形用的是光滑着色,四边形用的是平面着色。
注意三角形上的颜色是如何混合的。
颜色为OpenG lL 工程增加很多。
通过理解平面着色(f lat c olori ng)和平滑着色(s mooth colo ring),你能显著的改善你的OpenG L Dem o的样子。
4.旋转: 在这一课里,我将教会你如何旋转三角形和四边形。
左图中的三角形沿Y轴旋转,四边形沿着X轴旋转。
这一章将引入两个变量, r tri 被用来存储三角形的角度, rqu ad存储四边形的角度。
和容易创建一个多边形组成的场景。
让这些物体动起来是整个场景变得生动起来。
在后面的课程钟我将教给你如何绕屏幕上的一个点旋转物体,使得物体绕屏幕而不是它的轴转动。
5.3D形体:既然我们已经领会到多边形,方形,色彩和旋转。
现在该建立3D物体了。
OpenGL简介资料

//主函数
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); //设置显示模式(颜色、缓冲区等)
glutCreateWindow(“A Simple Example”); //创建窗口
OpenGL功能(五)
纹理映射(Texture Mapping) 利用OpenGL纹理映射功能可以十分逼真地表 达物体表面细节。
OpenGL功能(六)
位图显示和图象增强 图象功能除了基本的拷贝和像素读写外,还提 供融合(Blending)、反走样(Antialiasing) 和雾(fog)的特殊图象效果处理。以上三条 可使被仿真物更具真实感,增强图形显示的效 果。
用OpenGL编写程序的基本模板
模板演示
基本操作(视口变换)
Void glViewport(GLint x,GLint y,GLsizei width,GLsizei height); 在窗口中指定一个用于显示图像的像素矩形。 参数(x,y)是视口左下角的坐标,而参数 width和height为视口的大小。默认情况下, 视口的初始值为(0,0,winWidth,winHeight),其 中winWidth和winHeight是窗口的大小。
将影响投影矩阵而不是模型视点矩阵,同时消除以前 的投影变换。每个投影变换函数都完整的描述了一种特 定的变换,因此通常不混合使用两种投影变换
(一)透视投影
void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble near,GLdouble far); 参数fovy是在yz平面内的视野角度,其取值范围为[0.0, 180.0];参数aspect是视景体顶面的宽高比(w/h);参数 near和far是视点和两个裁减面之间的距离,必须大于0。
OPENGL基础教程

OpenGL Step by Step 第一、准备好OpenGL。
第二、准备好开发环境。
1.OpenGL库和头文件2.GLUT库3.GLAUX库第三、准备好窗口。
第四、建立OpenGL应用程序框架。
第五、OpenGL原理与程序基本框架。
第六、坐标变换。
第八、法向与封闭实心物体第八、颜色与表面材质第九、颜色、颜色模型及表面材质第九、法向与面的朝向第十、光照效果第十、表面纹理细节第十一、表面纹理第十二、运动、相对运动、反向运动第十三、帧缓冲第十四、雾第十五、α融合OPENGL 基础教程 (4)1.前言 (4)1.1 OPENGL 简介及发展 (4)1.2 OPENGL与DIRECTX的关系 (6)1.3 OPENGL的准备工作 (6)2. 基本图元的绘制 (7)2.1 点、直线和多边形 (7)2.2 绘制三角形和四边形 (8)2.3 绘制三棱锥 (12)2.4 绘制圆 (13)2.5 绘制五角星............................................................................. 错误!未定义书签。
2.6 绘制正弦函数图形 (13)2.7 小结 (14)3. 基于VC的OPENGL建模程序 (15)3.1 openGL几何图元——点 (15)3.2 openGL几何图元——线 (21)3.3 绘制矩形 (25)3.4 绘制圆 (28)3.5 绘制五角星 (29)3.6 绘制正弦曲线 (30)3.7 清除屏幕颜色 (32)3.8 绘制多边形 (33)3.9 OPENGL中的颜色设置 (36)3.10 在3D空间中画直线 (42)OPENGL 基础教程1.前言1.1OPENGL 简介及发展OpenGL是OpenGraphicsLib的缩写,是一套三维图形处理库,也是该领域的工业标准。
计算机三维图形是指将用数据描述的三维空间通过计算转换成二维图像并显示或打印出来的技术。
太阳、月球、地球模型

实验六一、实验目的与要求:1、实现太阳、地球、月球的运动模型。
2、创建一个球体动画,实现自由落体运动。
二、实验内容:1、通过不断修改旋转角度参数来实现天地运动;2、创建一个球体动画,使其在窗口内做自由落体,并在撞击到地面后弹回原来的高度三、实验步骤:1、相关算法及原理描述:动画的实现是通过不断修改旋转变换的角度参数来实现的。
在实现动画时,需要创建一个循环,在每次调用显示回调函数之前改变角度参数的值,使地球和月球看起来像绕着原子旋转。
为了不断地调用显示回调函数,需要利用GLUT库中的函数:void TimerFunc(unsigned int msecs, (*func) (int value), int value);指定一个定时器回调函数,即经过msecs毫秒后由GLUT调用指定的函数,并将value值传递给它。
被定时器调用的函数原型为:void TimerFunction(int value);但是,这个函数与其他的回调函数不一样,该函数只能调用一次。
为了实现连续的动画,必须在定时器函数中再次设置定时器回调函数。
为了使动画效果更好,需要使用双缓存技术,以及深度测试函数。
深度测试即当地球或月球运动到太阳的背面时,由于地球和月球是后绘制的,所以无法被太阳挡住,解决办法是启用深度测试。
深度测试是一种移除被挡住表面的有效技术,它的过程是:绘制一个像素时,会给它分配一个值(称为z值),这个值表示它与观察者的距离。
然后,如果需要在同一位置上绘制另一个像素,将比较新像素和已经保存在该位置的像素的z值。
如果新像素的z值小,即它离观察者更近因而在原来那个像素的前面,原来的像素就会被新像素挡住。
这一操作在内部由深度缓冲区完成。
为了启用深度测试,只要调用函数:glEnable(GL_DEPTH_TEST);打开深度测试功能。
要使用深度测试,必须在创建窗口时指定其具有深度缓冲区,代码为:glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 并且,为了使深度缓冲区正常完成深度测试功能,在每次渲染场景时,必须使用函数:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);消除深度缓冲区。
三维图形的光照、贴图及阴影处理(OpenGL)

三维图形的光照、贴图及阴影处理(OpenGL)实验过程:一、在VS6.0中建立新工程。
1、新建一个Win32 Application的工程。
2、向工程项目添加C++源文件。
3、将OpenGL框架复制到文件中。
4、设置OpenGL窗口标题。
二、场景设置。
1、视线处于一具有地板及前、左、右三面墙壁的空间中。
2、空间顶部中央有一光源。
3、空间中央有一地球仪,不断旋转。
三、建立视口结构及视点属性。
1、在坐标系上建立视图结构。
如图。
2、参数设置。
窗口大小:800*600。
视口大小:800*600。
透视深度:0.1~100。
透视角:60°。
视点位置:(0.0, 2.0, 15.0)。
视线方向:z轴负方向。
视点上方向:y轴正方向。
3、调用函数glViewport()、gluPerspective()和gluLookAt()实现。
四、绘制三维图形。
1、开启深度测试模式。
为防止图形重叠时出现层次混乱,必须对绘制图形进行消隐处理。
直接调用函数glEnable(GL_DEPTH_TEST)开启深度测试。
2、绘制地面与墙壁。
调用OpenGL基本几何元素绘制过程glBegin(GL_QUADS)、glBegin(GL_QUAD_STRIP)绘制四个平面,坐标范围为:x: -10~10, y: -2~20, z: -10~10。
坐标系结构如图。
3、绘制地球仪。
设计函数void DrawEarth()实现地球仪的绘制,分别调用OpenGL球面绘制函数gluSphere()绘制地球形状、柱面绘制函数gluCylinder()绘制地轴两头形状。
(1)参数设置。
球面半径:2。
球面细度:水平100,垂直100。
柱面半径:0.05。
柱面高度:1。
柱面细度:水平50,垂直1。
(2)结构如图。
4、绘制模拟光源。
(1)绘制“灯罩”。
调用glBegin(GL_TRIANGLE_STRIP)绘制4个三角形,构成棱椎形灯罩的4个侧面。
(2)绘制“灯泡”。
目标平行光参数设置

目标平行光参数设置在计算机图形学中,平行光是一种特殊类型的光源,它是光线在一个方向上无限远延伸的光线束。
平行光的特点是光线的方向和强度在整个场景中都是恒定不变的,不会随着距离的增加而衰减。
平行光常常用来模拟太阳光,因为太阳距离地球非常遥远,故光线可以近似地看作是平行的。
在计算机图形学中,我们可以使用OpenGL或其他图形库来实现平行光。
为了达到理想的效果,我们需要设置一些参数来定义平行光的方向、强度和颜色。
首先,平行光的方向是非常重要的。
在OpenGL中,我们可以使用一个三维向量来表示光线的方向。
一般情况下,我们会将光线指向场景中的某个目标,比如太阳。
但是考虑到平行光的特性,实际上我们可以随意指定光线的方向,只要保证所有物体都能够受到平行光的照射即可。
一种常见的设置是将光线的方向设为(0, -1, 0),即垂直向下。
这样可以模拟太阳光从天空射向地面的效果。
其次,我们需要确定平行光的强度。
在OpenGL中,光源的强度可以使用一个4维向量表示,分别对应红、绿、蓝和透明度通道。
默认情况下,光源的强度为(1.0, 1.0, 1.0, 1.0),即纯白色不透明光。
我们可以通过调整这个向量中的数值来改变光源的强度和颜色。
例如,如果我们将强度调整为(0.8, 0.8, 0.8,1.0),即偏灰色不透明光,可以实现一种较为柔和的照明效果。
最后,我们还可以设置其他参数来调整平行光的效果。
例如,可以通过设置环境光反射系数、漫反射系数和镜面反射系数来调整光照的效果。
环境光反射系数控制了光线在场景中的整体强度,而漫反射系数控制了光线与物体表面的交互效果,镜面反射系数影响了物体的高光效果。
通过调整这些系数,我们可以实现不同的光照效果,比如镜面光泽、折射、阴影等。
综上所述,设置平行光的参数需要确定光线的方向、强度和颜色,以及其他影响光照效果的参数。
根据具体的需求,我们可以灵活地调整这些参数,以实现理想的光照效果。
在实际应用中,可能还需要考虑其他因素,比如光源的位置、光源的投射方式等,以进一步优化光照效果。
C++编写的太阳系与八大行星关系程序

在VC6.0坏境下,用API编写的太阳系与八大行星关系程序具体操作步骤如下:(1)新建Win32API程序,工程名为:太阳系模拟。
(2)在工程目录下新建Data文件夹,在里面存放太阳.jpg ,水星金星.jpg ,地球.jpg,火星.jpg, 木星.jpg ,土星.jpg,天王星.jpg, 海王星.jpg,土星光环.jpg十张图片。
(3)新建文件:5DG’ SCuttingEarth.cpp,T exture.cpp,Vector3D.cpp,trxture.h,vector3d.h(4)在工程主文件中编写代码如下。
1.//5DG’ SCuttingEarth.cpp#define WM_TOGGLEFULLSCREEN (WM_USER + 1) // 定义全屏/窗口切换消息#define TIMER1 101 // 定义时钟代号,设置为101号#define TITLE "5DG's Cutting Earth" // 定义窗口标题#define CLASSNAME "5DG_OPENGL" // 定义窗口类名#define WIDTH 640 // 定义窗口宽度#define HEIGHT 480 // 定义窗口高度#define BPP 16 // 定义每象素的位数#define MAXTEXTURE 10 // 最大纹理数为2// 在此处引用程序要求的头文件:#include <windows.h> // Windows 的头文件#include <gl\gl.h> // OpenGL32库的头文件#include <gl\glu.h> // Glu32库的头文件#include <math.h> // 数学函数库的头文件#include <stdio.h> // 标准输入/输出库的头文件#include "Texture.h" // 纹理载入的头文件#include "Vector3D.h"// 在此处加入程序要求的库到链接器中:#pragma comment(lib, "opengl32.lib") // 链接时查找OpenGL32.lib#pragma comment(lib, "glu32.lib") // 链接时查找glu32.lib// 在此处定义与窗口相关的结构体:typedef struct { // 定义处理键盘的结构体BOOL keyDown [256]; // 存储键盘按键状态的数组} Keys;typedef struct { // 定义存储应用程序实例的结构体HINSTANCE hInstance; // 应用程序实例const char* className; // 应用程序类名} Application;typedef struct { // 定义初始化窗口所需信息Application* application; // 所属的应用程序char* title; // 窗口标题int width; // 窗口宽度int height; // 窗口高度int bitsPerPixel; // 每像素的位数BOOL isFullScreen; // 是否全屏} GL_WindowInit;typedef struct { // 定义窗口结构体Keys* keys; // 键盘HWND hWnd; // 窗口句柄HDC hDC; // 设备描述表HGLRC hRC; // 绘制描述表GL_WindowInit init; // 提供Window初始化信息的结构体} GL_Window;// 此代码模块中包含的函数的前向声明:BOOL Initialize(GL_Window* window, Keys* keys); // 设置你绘制前的初始化值void DrawSceneGL(void); // 在这里完成场景的绘制void Update(void); // 在此处更新对消息的动作void Deinitialize(void); // 在此处做退出前扫尾工作GL_Window* OGL_window; // 存储窗口信息Keys* OGL_keys; // 存储按键信息// 在此处定义用户变量:GLuint texture[MAXTEXTURE]; // 存储纹理GLfloat pos_z = -70.0f; // 初始化场景的深度GLfloat angle_Y =0.0f ; // 用来绕Y 轴旋转物体GLfloat p1 = 0.0f;GLUquadricObj *qSphere; // 用来绘制球体CVector3 specalPoint[8];// 定义切割平面的位置和控制变量GLint aType = 0;BOOL stopRot=FALSE; // 控制地球是否自转BOOL plane0_on = FALSE; // 第零号切割平面(上下切割)GLdouble plane0[] = {0.0f, 1.0f, 0.0f, 0.0f};GLfloat plane0_y = 1.0f;BOOL plane1_on = FALSE; // 第一号切割平面(左右切割)GLdouble plane1[] = {-1.0f, 0.0f, 0.0f, 0.0f};GLfloat plane1_x = -1.0f;BOOL plane2_on = TRUE; // 深度缓存切割平面(内外切割)GLfloat plane2_z = -1.0f;GLfloat speed = 0.2f;BOOL pKey3 = FALSE ;BOOL pKeyS = FALSE ;BOOL Pause = FALSE;void ResizeWindowGL(int width, int height) // 重新设置窗口大小{glViewport(0, 0, (GLsizei)(width), (GLsizei)(height));// 重置当前视口大小glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式glLoadIdentity(); // 重置投影矩阵gluPerspective(45, (float)width/(float)height, 0.1, 100); // 设置透视投影glMatrixMode(GL_MODELVIEW); // 切换到模型视图矩阵glLoadIdentity(); // 重置模型视图矩阵}BOOL ChangeScreenResolution(int width, int height, int bitsPerPixel) // 修改屏幕分辨率{DEVMODE dmScreenSettings; // 设备设置模式ZeroMemory(&dmScreenSettings, sizeof(DEVMODE));// 清空dmScreenSettings.dmSize = sizeof(DEVMODE); // Devmode结构的大小dmScreenSettings.dmPelsWidth = width; // 设置为屏幕宽度dmScreenSettings.dmPelsHeight = height; // 设置为屏幕高度dmScreenSettings.dmBitsPerPel = bitsPerPixel; // 设为指定位长;dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;// 尝试设置显示模式并返回结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学实验报告
实验步骤
1)算法及原理描述
为了简单起见,我们把三个天体都想象成规则的球体。
而我们所使用的glut实用工具中,正好就意位置绘制球体了。
函数有三个参数:第一个参数表示球体的半径,后两个参数代表了“面”的数目,简单点说就是球体的精确程度,数值越大越精确,当然代价就是速度越缓慢。
这里我们只是简单的设置后两个参数为20。
太阳在坐标原点,所以不需要经过任何变换,直接绘制就可以了。
地球则要复杂一点,需要变换坐标。
由于今年已经经过的天数已知为day,则地球转过的角度为day/一年的天数*360度。
前面已经假定每年都是360天,因此地球转过的角度恰好为day。
所以可以通过下面的代码来解决:
glRotatef(day, 0, 0, -1);
/* 注意地球公转是“自西向东”的,因此是饶着Z轴负方向进行逆时针旋转*/ glTranslatef(
成:day/30*360 - day,即减去原来已经转过的角度。
这只是一种简单的处理,当然也可以在绘制地球前用glPushMatrix保存矩阵,绘制地球后用glPopMatrix恢复矩阵。
再设计一个跟地球位置无关的月亮位置公式,来绘制月亮。
通常后一种方法比前一种要好,因为浮点的运算EPTH_TEST为参数调用glEnable函数,启动深度测试。
2、在必要时(通常是每次绘制画面开始时),清空深度缓冲,即:glClear(GL_DEPTH_BUFFER_BIT);其中,glClear (GL_COLOR_BUFFER_BIT)与glClear(GL_DEPTH_BUFFER_BIT)可以合并写为:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);且后者的运行速度可能比前者快。
到此为止,我们终于可以得到整个“太阳,地球和月亮”系统的完整代码。
程序调试、测试与运行结果分析
2)运行结果
如下图,程序调试成功,并且能正常显示,不足之处:调试了半天,右键显示及调节属性的功能仍旧没法实现,最后不得不把那个函数删掉,感觉很是遗憾。
1、实验总结
通过本次试验,进一步认识,感觉OpenGL的功能很强大,居然可以实现三维的
动画变换,程序调试成功后把我乐坏了!!由于自己不太擅长编程,所以有些功能还不能完全实现,但我会尽自己最大努力来克服自己的编程不足之处,多加练习。
5、附录
带注释的源程序
#include <glut.h>
static int day = 200; // day的变化:从0到359
void myDisplay(void)
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75, 1, 1, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, -0, 0, 0, 0, 0, 0, 0, 1);
// 红色的“太阳”
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidSphere(, 100, 100);
// 蓝色的“地球”
glColor3f(0.0f, 0.0f, 1.0f);
glRotatef(day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(0, 0.0f, 0.0f);
glutSolidSphere(, 100, 100);
// 黄色的“月亮”
glColor3f(1.0f, 1.0f, 0.0f);
glRotatef(day/30.0*360.0 - day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(, 0.0f, 0.0f);
glutSolidSphere(4345000, 100, 100);
glFlush();
glutSwapBuffers();
}
void myIdle(void)
{
++day;
if( day >= 360 )
day = 0;
myDisplay();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(450, 450);
glutCreateWindow("mywork ");
glutDisplayFunc(&myDisplay);
glutIdleFunc(&myIdle);
glutMainLoop();
return 0;
}。