OpenGL项目:绘制简单场景

合集下载

opengl学习(三)----绘制简单图形(一)

opengl学习(三)----绘制简单图形(一)

opengl学习(三)----绘制简单图形(⼀)今天说⼀说⼏种简单的图元。

所有的⼏何图元都是根据它们的顶点来描绘的。

⽽顶点就是它们在屏幕上的坐标位置。

我喜欢把这⼏个简单的图元称为点线⾯。

点,可以看到⼀个顶点;线,就是两个顶点指定的⼀条有限长度的线段;⾯,其实更准确讲是⼀个凸多边形。

opengl⾥所讲的多边形是内部⽤颜⾊填充的,视觉上称为⾯我个⼈认为是更贴近的。

当然,多边形也是由指定的顶点组成的。

需要注意的是,要想被opengl按照设计被绘制必须正确的认识到,所谓的多边形是顶点都处于⼀个平⾯上,凸多边形。

凸多边形不能理解的,请问度娘。

来看⼀个例⼦:C++代码1. glBegin(GL_POLYGON);2. glVertex2f(0.0, 0.0);3. glVertex2f(0.0, 3.0);4. glVertex2f(4.0, 3.0);5. glVertex2f(6.0, 1.5);6. glVertex2f(4.0, 0.0);7. glEnd();先不去关⼼代码本⾝,这段代码最终的结果是要指定5个顶点绘制⼀个凸五边形。

注意,不是5条线段⽽是⼀个凸五边形的平⾯。

不管是点线⾯的哪⼀种,都是需要指定⼀组顶点的。

如何判定顶点指定的开始和结束就是glBegin和glEnd的⼯作。

引⽤void glBegin(Glenum mode);标志着⼀个顶点数据列表的开始,它描述了⼀个⼏何图元。

mode参数指定了图元的类型。

void glEnd(void);标志着⼀个顶点数据列表的结束。

mode设置的不同,代表着将要绘制的图元也不同。

下⾯这个表就是图元的名称和含义:值含义GL_POINTS 单个的点GL_LINES ⼀对顶点被解释为⼀条直线GL_LINE_STRIP ⼀系列的连接直线GL_LINE_LOOP 和上⾯相同,但第⼀个顶点和最后⼀个顶点彼此相连GL_TRIANGLES 3个顶点被解释为⼀个三⾓形GL_TRIANGLES_STRIP 三⾓形的连接串GL_TRIANGLES_FAN 连接成扇形的三⾓形系列GL_QUADS 4个顶点被解释为⼀个四边形GL_QUADS_STRIP 四边形的连接串GL_POLYGON 简单的凸多边形的边界试想着,如果将glBegin(GL_POLYGON)修改为glBegin(GL_POINTS),绘制出来的将是什么图形呢? 哈哈,那就是5个点⽽已么。

OpenGL 3基本图形绘制

OpenGL 3基本图形绘制

模型-视图变换过程就是一个将顶点坐标从世界坐标变换到 视觉坐标的过程。这里很重要的是对两个坐标系的认识。 世界坐标系也称为全局坐标系。它是一个右手坐标系,可 以认为该坐标系是固定不变的,在初始态下,其x轴为沿屏

幕水平向右,y轴为沿屏幕垂直向上,z轴则为垂直屏幕面
向外指向用户。

视觉坐标系(即观察坐标系)也称为局部坐标系。它是一个
(1)确定当前矩阵栈 void glMatrixMode(Glenum mode); 参数取值:
GL_MODELVIEW:模型视图矩阵
GL_PROJECTION:投影矩阵 GL_TEXTURE:纹理矩阵 默认的选定矩阵为模型-视图变换。
矩阵栈及其操作(2/8)
清矩阵栈栈顶
void glLoadIdentity(void); •将栈顶矩阵替换为单位矩阵 •取消之前变换的作用 M … I

对于二维图形向二维屏幕的投影,则应使用实 用库中的如下函数:
void gluOrtho2D(Gldouble left, Gldouble right,
Gldouble bottom, Gldouble top);

前面提到过,用二维顶点命令绘制的二维物体 的z坐标均为零,而gluOrtho2D()命令假定场景 中的 z 坐标介于-1.0和 1.0 之间。
左手坐标系,该坐标系是可以活动的。在初始态下,其原
点及x、y轴分别与世界坐标系的原点及x、y轴重合,而z轴 则正好相反,即为垂直屏幕面向内。

默认:视点在原点,视线沿Z轴负方向。
坐标系
右手坐标系
y
窗口 x
o z
缺省的观察坐标系
视点变换

View变换可以改变视点的位置和方向,要在 Model变换之前调用。设置任意观察坐标点。

基于OpenGL的三维图形绘制实验

基于OpenGL的三维图形绘制实验

基于OpenGL的三维图形绘制实验基于OpenGL的三维图形绘制实验⽬录实验题⽬:交互图形程序设计基础实验 (3)1.实验⽬的 (3)2.实验内容 (3)2.1 实验内容 (3)2.2 实验任务 (3)3.实验过程 (4)3.1 预处理 (4)3.3 主要函数说明 (5)3.4 过程描述 (6)3.5 运⾏截图 (7)4.实验结果 (7)5.实验体会 (7)实验题⽬:交互图形程序设计基础实验1.实验⽬的1)理解并掌握三维基本图形数据结构表⽰⽅法。

2)掌握编写OpenGL图形程序的基本⽅法.3)掌握OpenGL基本图形表⽰及绘制。

2.实验内容2.1 实验内容基于OpenGL的三维图形绘制实验⽬的是掌握图形信息的表⽰、数据的组织,在此基础上基于OpenGL绘制出三维图形。

实验内容包括OpenGL编程环境搭建、OpenGL程序结构、基本数据类型、核⼼函数等的使⽤;基本图形的绘制(点、线段、折线、闭合折线、多边形、三⾓形、三⾓扇、三⾓条带、四边形、四边形条带等)及图形属性控制(线宽、颜⾊、线型、填充样式等);对指定的若⼲三维模型进⾏建模、绘制,在⼀个程序框架下实现,提交1次程序,1份实验报告。

2.2 实验任务1、使⽤Visual C++建⽴⼀个单⽂档(SDI)程序,完成OpenGL绘制框架程序的设计。

在此基础上参照提供的资料,定义绘制函数,基于⾃定义的若⼲点坐标与颜⾊,分别绘制绘制点、线段、不闭合折线、闭合折线、多边形、三⾓形、四边形、三⾓扇、三⾓条带、四边形条带。

2、使⽤1中建⽴的程序框架,完成如下任务:(1)绘制正棱柱(底⾯多变形的边数及⾼度可以通过对话框输⼊)(2)正棱锥(底⾯多变形的边数及⾼度可以通过对话框输⼊)(3)正棱台(底⾯多变形的边数、台⾼、锥⾼可以通过对话框输⼊)注意模型坐标系的选择和顶点坐标的计算,每个图形的绘制单独写成函数。

加⼊菜单绘制三、四、五、六边的情况,其他边数情况从弹出对话框中输⼊参数,然后绘制。

基于OpenGL的自然景物的真实感绘制及其应用

基于OpenGL的自然景物的真实感绘制及其应用

( ) 学 模 型 : 是 构 建 所 描 述 的 自然 景 物 对 象 的 数 学 模 型 1数 就
公式 。 此为 图形生成 的最基础 、 最重要 的部分 , 模型构建 的好坏将 直接影 响到最终 的图形生成效率 。
对于具有规则形体模型 的图 形的真实 感描述 ,如立方体 、 圆 柱体等 , 用欧氏几何对其描述就显得非常有效 。但 是 自然界 中的 许多景物是不能用规则几何模型 有效 地表示出来的 。例如树 . 虽 然树 叶 的形 状 可 以用 多 边形 或 者 椭 圆 形 模 型 来 模 拟 . 干 也 可 以 树 用 不 同粗 细 的 圆柱 体 等 形 体 来 模 拟 ,但 是 要 把 每 一 个 树 的 树 干 、 树 叶准 确 地 放 到 其 对应 的位 置不 仅 繁 琐 , 且 耗 时 巨 大 。因 此 。 而 对 于诸 如 山、 、 、 树 火 云等这样 的极 不规则 的 自然景 物 的真实 感描 述 , 欧 氏 空 间 中的 规 则 形 体 模 型 就 显 得 无 能 为 力 了 。 对 于 描 述 用 这 些 不 规 则 的 自然 景 物 的算 法 研 究 现 在 已 成 为 热 门 学 科 。 2世纪 7 0 O年代 ,美 籍 法 裔数 学 家 曼 德 布 罗特 提 出 分 形 几 何 概念 为 解 决 这 类 自然 对 象 的造 型 和 真 实 感 图形 生 成 问题 提 供 了
p c e a n n i f h au a se ey I h s a e , tk n e d a n f h r e a a x mp e i s n r r st e e p r n e o t iig itt b o n t o e n t rl c n r . n t i p p r a i g t r wi g o e te s n e a l , t u u  ̄ e x e e c f iz n h y t h t i h i ul Op n O g n rt ih y r ai i g s t el t g e GL t e ea e hg l e l t i s c ma e h r a s ci wi i i m e ̄n e n e h i u s a d f g tc n q e . i

OpenGL入门程序三:点、线、面的绘制

OpenGL入门程序三:点、线、面的绘制

OpenGL⼊门程序三:点、线、⾯的绘制1、点:void TestPoint(){//点的⼤⼩默认为⼀个像素,通过下⾯的函数可以设置⼀点的⼤⼩glPointSize(50.0f);glBegin(GL_POINTS);glVertex2f(0, 0);glVertex2f(0.5f, 0.5f);glEnd();}2、线:void TestLine(){//设置线的宽度glLineWidth(500.0f);glBegin(GL_LINES);glVertex2f(0, 0);glVertex2f(0.5f, 0.5f);glEnd();}3、虚线://画虚线void TestLineSttiple(){//开启虚线模式 , 使⽤ glDisable(GL_LINE_STIPPLE) 关闭虚线模式glEnable(GL_LINE_STIPPLE);//设置线的宽度glLineWidth(500.0f);//设置虚线的样式//参数⼀: 要画的点的个数//参数⼆: 是由1和0组成的长度为16的序列,从最低位开始看,如果为1,则直线上接下来应该画的factor个点将被画为实的;如果为0,则直线上接下来应该画的factor个点将被画为虚的。

glLineStipple(2, 0x0F0F);glBegin(GL_LINES);glVertex2f(0, 0);glVertex2f(0.5f, 0.5f);glEnd();4、多边形: 1>多边形的两⾯及绘制⽅式: 多边形的有两个⾯,每⼀个⾯均可以设置不同的绘制模式:填充(默认的绘制模式)、只绘制边缘轮廓、只绘制顶点。

glPolygonMode(GL_FRONT, GL_FILL); // 设置正⾯为填充⽅式 glPolygonMode(GL_BACK, GL_LINE); // 设置反⾯为边缘绘制⽅式 glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // 设置两⾯均为顶点绘制⽅式 2>⼀般约定,逆时针为正⾯,顺时针为反⾯, 可以通过glFrontFace函数来交换“正⾯”和“反⾯”的概念。

OpenGL完全教程 第三章 使用OpenGL绘图

OpenGL完全教程 第三章 使用OpenGL绘图
glClearColor(0,0,0,1);
3.1.4 绘制之前,清空屏幕和缓冲区
一般地,我们把所有绘制函数的调用写在 RenderScene 过程中。在每次绘制之前,我们都应该清空屏幕和缓冲区。 下面的代码用指定的清空颜色清空它们:
procedure RenderScene;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
图 3.1-1 WindowsGDI 下的窗体坐标 图 3.1-2 OpenGL 所定义的窗体坐标
例如,要设置如图 3.1-3 中的视见区域,我们应该调用函数: glViewPort(100,100,Width,Height);
图 3.1-3 3.1.2 创建投影变换
接下来,我们要设置一种投影变换。投影变换分为平行投影和透视投影。平行投影中,物体无论远近,大小都是 一样的,而透视投影则相反。因此,透视投影更像是我们眼睛所看到的景物。但在某些特殊的时候, 平行投影还是 有它的作用的,比如 3D 建摸程序。图 3.1-4 是甲烷分子模型在平行投影下的渲染结果,而图 3.1-5 是在透视投影下的 渲染结果。可以看到,平行投影下,四个氢原子(绿色的球体)大小是一样的,而在透视投影下,远处的氢原子要小一 些。
private procedure SetView; procedure RenderScene; //渲染函数 procedure InitializeOpenGL; //用于初始化 OpenGL 渲染环境
public { public declarations }
end;
然后,在 FormCreate 过程中添加对过程 SetView 的调用:
图 3.1-7 由 gluPerspective 定义的ห้องสมุดไป่ตู้截头体 我们用下面的代码定义透视投影:

使用opengl程序绘制实线虚线和点划线

使用opengl程序绘制实线虚线和点划线

使用opengl程序绘制实线虚线和点划线OpenGL是一种用于绘制2D和3D图形的跨平台编程接口。

它提供了一套功能强大的函数和工具,可以在各种显示设备上渲染图形。

在OpenGL中,可以使用不同的绘制模式来绘制实线、虚线和点划线。

本文将介绍如何使用OpenGL程序实现这些效果。

在开始之前,我们首先需要安装OpenGL库和开发环境。

OpenGL可以在不同的平台上使用,例如Windows、Linux和macOS。

对于Windows用户,可以使用MinGW或者MSYS2等工具链来配置开发环境。

对于Linux和macOS用户,可以使用GCC和Xcode来配置开发环境。

安装完成后,我们可以开始编写OpenGL程序。

在OpenGL中,绘图是通过一系列函数和状态来实现的。

以下是一个基本的OpenGL程序的框架:```cpp#include <GL/glut.h>void displa//清空屏幕glClear(GL_COLOR_BUFFER_BIT);//设置绘图颜色glColor3f(1.0f, 1.0f, 1.0f);//绘制实线glBegin(GL_LINES);glVertex2f(-0.5f, 0.0f);glVertex2f(0.5f, 0.0f);glEnd(;//绘制虚线//...//绘制点划线//...//刷新缓冲区glutSwapBuffers(;int main(int argc, char** argv)// 初始化窗口和OpenGL环境glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE , GLUT_RGB); glutInitWindowSize(800, 600); glutCreateWindow("OpenGL Program");//注册绘图函数glutDisplayFunc(display);//进入主循环glutMainLoop(;return 0;```在以上程序中,`glClear(GL_COLOR_BUFFER_BIT)`用于清空屏幕,`glColor3f(1.0f, 1.0f, 1.0f)`用于设置绘图颜色。

OpenGL_Qt学习笔记之_02(绘制简单平面几何图形)

OpenGL_Qt学习笔记之_02(绘制简单平面几何图形)

OpenGL_Qt学习笔记之_02(绘制简单平⾯⼏何图形)本⽂来讲讲怎样使⽤opengl来画平⾯⼏何图形,这⼀节本来是很简单的,因为某些问题都弄⼤半天了。

当然,这还是按照NeHe的教程来的学习的。

这次实现的功能是在窗⼝中画⼀个三⾓形,⼀个矩形,⼀个圆形。

⾸先来简单的看⼀下opengl中的基本坐标规则,如下图所⽰:假设左下⾓那个点是⼈的眼睛观察的位置,则向左为x正⽅向,向上为y的正⽅向(这点与opencv中不同),向⾥为z的正⽅向。

下⾯来看看怎么绘制平⾯⼏何图形。

在设置好需要画的⼏何图形的属性后,⽐如颜⾊信息,就以glBegin()开始,以glEnd()结束,glBegin()中的参数为所画⼏何图形的类型,⽐如说GL_ TRIANGLES代表三⾓形,GL_QUADS为矩形等等。

在glBegin()和glEnd()之间是放的点,这⾥是三维的点,这些点是对应所画矩形的类型的。

画圆的话稍微⿇烦⼀点,因为opengl中没有直接对应的类型,⼀般都是采⽤三⾓形来逼近,其它很多⼏何图形也是类似的。

在⽤三⾓形逼近时,是⽤的画连续三⾓形,⼀般有2种类型。

GL_TRIANGLE_STRIP和GL_TRIANGLE_PAN,这2者的区别⾸先来看个⽰意图:如果给定有顺序的点v0,v1,v2,v3,v4,v5,则采⽤GL_TRIANGLE_STRIP模式时,所画的连续三⾓形应该依次为:(v0,v1,v2),(v1, v2, v3), (v2, v3, v4),(v3, v4, v5);如果采⽤的是GL_TRIANGLE_PAN模式,则第⼀个点是固定的,且后⾯每次都要跳⼀个顶点,所以它的结果为(v0, v1, v2), (v0, v2, v3), (v0, v3, v4),(v0, v4, v5)。

因此我这⾥要画圆盘的话,就采⽤的GL_TRIANGLE_PAN模式了,⼤家可以⼿动画⼀下就知道,具体可以参考后⾯给出的代码。

每次绘⼀个⼏何图形,都会移动当前的焦点,采⽤的函数是glTranslatef,⽽⽹上的教程给该函数的参数时,都是类似这样的glTranslatef(-1.5f, 0.0f, -6.0f);NeHe的教程中也是⼀样,他的解释是移动多少个单位,⽐如说-1.5f就是向左移动1.5个单位,我⼀开始也在程序中这么弄,结果调试了4个多⼩时,就是不显⽰三⾓形,在⽹上找了很多⽅法,都试过了还不⾏。

OpenGL基本图形的绘制

OpenGL基本图形的绘制

OpenGL基本图形的绘制1.使用glColor,glPointSize函数绘制三个不同颜色和大小的点// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glPointSize(5.0f);glBegin(GL_POINTS);glColor3f(1.0,0.0,0.0);glVertex2f(0.3f,0.5f);glEnd();glPointSize(8.0f);glBegin(GL_POINTS);glColor3f(0.0,1.0,0.0);glVertex2f(0.0f,0.0f);glEnd();glPointSize(10.0f);glBegin(GL_POINTS);glColor3f(0.0,0.0,1.0);glVertex2f(-0.3f,-0.5f);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB); glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Three Point");glutDisplayFunc(&Display);glutMainLoop();return 0;}2.使用glColor,glLineWidth,glLineStripple函数绘制实心、虚线及渐变色线(1)实心线// T.cpp : Defines the entry point for the console application.//#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glEnable(GL_LINE_STIPPLE);glShadeModel(GL_SMOOTH);glLineStipple(2,0xFFFF);glLineWidth(2);glBegin(GL_LINES);glVertex2i(-100,0);glVertex2i(100,0);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB);glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Solid Line");glutDisplayFunc(&Display);glutMainLoop();return 0;}(2)虚线// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glEnable(GL_LINE_STIPPLE);glShadeModel(GL_SMOOTH);glLineStipple(4,0xAAAA);glLineWidth(2);glBegin(GL_LINES);glVertex2i(-100,0);glVertex2i(100,0);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB);glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Dotted Line");glutDisplayFunc(&Display);glutMainLoop();return 0;}(3)渐变线// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includeGLuint Line;void Initial(void) {glClearColor(0.0f, 0.0f, 0.0f, 0.0f);Line = glGenLists(1);glNewList(Line, GL_COMPILE);glTranslatef(-50.0, 20.0, 0.0);glColor3f(255.0, 0.0, 0.0);glLineWidth(2);glBegin(GL_LINES);glColor3f(255.0, 0.0, 0.0);glVertex2i(0,-20);glColor3f(0.0, 0.0, 255.0);glVertex2i(100,-20);glEnd();glEndList();void ChangeSize(int w, int h) {glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D (-70.0f, 70.0f, -70.0f, 70.0f);}void Display(void) {glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0, 0.0, 0.0);glCallList(Line);glFlush();}int main(int argc, char* argv[]) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(600,450);glutInitWindowPosition(100,100);glutCreateWindow("渐变色线");glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);Initial();glutMainLoop();return 0;}3.使用glColor,glPolygonMode函数绘制纯色、渐变色、轮廓多边形(1)纯色六边形// a.cpp : Defines the entry point for the console application.//#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0);glMatrixMode (GL_PROJECTION);gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300);glutCreateWindow("纯色六边形");init();glutDisplayFunc(polygon);glutMainLoop();}(2)渐变色六边形// a.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0);glMatrixMode (GL_PROJECTION);gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glColor3f(0.0,0.0,1.0);glVertex2iv(p1);glColor3f(0.0,1.0,0.0);glVertex2iv(p2);glColor3f(1.0,0.0,0.0);glVertex2iv(p3);glColor3f(0.0,0.0,1.0);glVertex2iv(p4);glColor3f(0.0,1.0,0.0);glVertex2iv(p5);glColor3f(1.0,0.0,0.0);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300);glutCreateWindow("渐变色六边形");init();glutDisplayFunc(polygon);glutMainLoop();}(3)轮廓渐变色六边形// a.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0); glPolygonMode (GL_FRONT_AND_BACK,GL_LINE); gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glColor3f(0.0,0.0,1.0);glVertex2iv(p1);glColor3f(0.0,1.0,0.0);glVertex2iv(p2);glColor3f(1.0,0.0,0.0);glVertex2iv(p3);glColor3f(0.0,0.0,1.0);glVertex2iv(p4);glColor3f(0.0,1.0,0.0);glVertex2iv(p5);glColor3f(1.0,0.0,0.0);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300); glutCreateWindow("轮廓渐变色六边形");init();glutDisplayFunc(polygon);glutMainLoop(); }。

基于OpenGL的3D游戏场景编辑器的设计与实现

基于OpenGL的3D游戏场景编辑器的设计与实现

2、AI的交互
在游戏中,是场景中的重要元素之一。它们需要与玩家进行交互以达到游戏 的平衡性。可以通过使用Unity3D提供的工具来实现,比如导航网格(NavMesh)、 障碍物识别等。此外,还可以通过编写自定义的逻辑来实现更复杂的交互行为。
总之,基于Unity3D的手机游戏场景设计与交互实现是游戏开发的核心任务 之一。通过合理的场景设计和交互实现,可以提高游戏的质量和可玩性。本次演 示主要从场景设计和交互实现两个方面出发,介绍了Unity3D在手机游戏开发中 的优势和实际应用案例。从总体上看,基于Unity3D的手机游戏场景设计和交互 实现可以帮助开发者更好地实现创意和想法,并提高游戏的吸引力和竞争力。
二、AI系统在Unity3D游戏中的 应用
2、1 AI系统概述
AI系统是指通过计算机程序模拟人类智能的一种技术。在游戏中,AI系统可 以控制游戏中的NPC(非玩家角色)的行为,使其具有更高的智能和自主性,增 加游戏的互动性和趣味性。
2、2 AI系统在Unity3D游戏中的 应用
在Unity3D中,AI系统可以通过脚本实现。例如,可以使用C#或JavaScript 等编程语言编写脚本,控制NPC的行为。例如,可以使用AI系统实现NPC根据玩家 的行为做出反应,或者使用模糊逻辑等方法调整NPC的行为。
OpenGL概述 OpenGL是一种用于渲染2D和3D图形的跨语言、跨平台的应用程 序编程接口(API)。它是一种基于像素的渲染方法,通过定义一系列的图形原 语,如点、线、多边形等,来进行2D和3D图形的绘制。OpenGL广泛应用于游戏、 影视、科学计算等领域。
在3D游戏场景编辑器中,OpenGL的主要作用是提供一个强大的图形渲染引擎, 使得我们可以轻松地创建和编辑3D场景。

浅谈怎样使用OpenGL绘制简单二维图形

浅谈怎样使用OpenGL绘制简单二维图形

浅谈怎样使用OpenGL绘制简单二维图形浅谈怎样使用OpenGL绘制简单二维图形摘要:在上一章节中我们讲解了OpenGL的基本原理,以及怎样在MFC中配置OpenGL 绘图环境,而在这一章节我开始正式绘图(注意上一章节的内容严格的来讲是属于window 编程,而不属于OpenGL)。

我们先从一个简单例子开始讲解:绘制一个在视图中央,长宽各为视图长宽一半的矩形。

1.1 视图设置与GDI二维函数库不同,OpenGL是一套三维绘图函数库。

使用GDI时,点的坐标对应的就是像素点坐标(已窗口左上角为(0,0)点),而OpenGL绘图时使用的是顶点坐标,要通过一系列转换最终换算成窗口的像素坐标,这种转换就是视图的设置,视图设置将在第三章详细讲解,本章只使用最简单的一种视图设置——2D正投影。

(视图设置的详细内容将在下一章讲解)设置2D正投影所需的函数如下:glMatrixMode(GL_PROJECTION);将投影矩阵设置为当前矩阵(后续设置矩阵的函数都是对投影矩阵起作用)glLoadIdentity();将当前矩阵设置为单位矩阵gluOrtho2D(left,right,bottom,top);创建一个把二维坐标投影到屏幕上的矩阵,并把当前矩阵与它相乘。

裁剪区域为矩形,它的左下坐标为(left,bottom),右上坐标为(right,top)。

glViewport(x,y,width,height);在窗口中定义一个像素矩形,最终的图像将映射到这个矩形中。

(x,y)参数指定了视口的左下角,width和height表示这个视口矩形的宽度和高度。

在默认情况下,视口的初始值是(0,0,winWidth,winHeight),其中winWidth和winHeight为对应窗口的大小。

在2D正投影模式下,OpenGL坐标于窗口显示的坐标对应逻辑如图 1 窗口映射关系所示:图 1 窗口映射关系1.2 绘制几何图元设置完视图和投影模式之后,我们便可以开始绘图了,但在这之前还要注意清空视图,防止绘图效果累加,比如要画一个移动圆形,如果不将前一帧的绘图擦除,我们将看到的是一系列的圆形,而不是一个移动的圆形,这和使用GDI在每次绘图都要用背景将上一次的绘图效果覆盖一样。

基于OpenGL的三维模型呈现与交互式场景设计

基于OpenGL的三维模型呈现与交互式场景设计

基于OpenGL的三维模型呈现与交互式场景设计OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨平台图形库,被广泛应用于计算机图形学、虚拟现实、游戏开发等领域。

在计算机图形学中,三维模型的呈现和交互式场景设计是一个重要的课题,本文将探讨基于OpenGL的三维模型呈现与交互式场景设计的相关内容。

1. OpenGL简介OpenGL是一种开放标准的图形API,由Khronos Group维护和更新。

它提供了一系列的函数,用于处理图形渲染、纹理映射、光照效果等。

通过OpenGL,开发者可以利用GPU的强大计算能力来加速图形渲染过程,实现高性能的图形应用程序。

2. 三维模型呈现在基于OpenGL的三维模型呈现中,首先需要加载模型数据。

模型数据通常包括顶点坐标、法向量、纹理坐标等信息。

开发者可以使用OpenGL提供的函数来加载和处理这些数据,然后将模型渲染到屏幕上。

2.1 模型加载模型加载是三维图形应用程序中的重要环节。

开发者可以使用各种建模工具创建三维模型,并将其导出为常见的文件格式,如OBJ、FBX等。

然后通过解析文件格式,将模型数据加载到内存中,并上传到GPU进行渲染。

2.2 着色器编程在OpenGL中,着色器是用来控制顶点和像素处理过程的程序。

开发者可以编写顶点着色器和片元着色器来实现对三维模型的渲染效果控制。

通过着色器编程,可以实现光照效果、纹理映射、阴影效果等。

2.3 纹理映射纹理映射是一种常用的技术,用来给三维模型赋予更加逼真的外表。

开发者可以将图片作为纹理贴图应用到模型表面上,从而实现木纹、金属质感等效果。

在OpenGL中,通过纹理坐标和纹理采样器,可以实现复杂的纹理映射效果。

3. 交互式场景设计除了呈现静态的三维模型外,交互式场景设计也是计算机图形学中一个重要的方向。

通过交互式设计,用户可以与三维场景进行实时交互,改变视角、操作物体等。

3.1 鼠标和键盘输入在交互式场景设计中,鼠标和键盘输入是最常见的用户交互方式。

基于OpenGL的三维游戏场景设计与渲染

基于OpenGL的三维游戏场景设计与渲染

基于OpenGL的三维游戏场景设计与渲染在当今数字游戏行业中,三维游戏场景设计与渲染一直是开发者们关注的焦点之一。

随着技术的不断进步和发展,基于OpenGL的三维游戏场景设计与渲染技术也日益成熟和普及。

本文将深入探讨基于OpenGL的三维游戏场景设计与渲染,包括其原理、流程、技术特点以及应用实例等方面的内容。

一、OpenGL简介OpenGL(Open Graphics Library)是一种跨平台的图形编程接口,广泛应用于计算机图形学、模拟、虚拟现实等领域。

作为一种开放标准,OpenGL提供了丰富的函数库,可以帮助开发者实现各种复杂的图形渲染效果。

二、三维游戏场景设计与渲染流程1. 场景建模在进行三维游戏场景设计时,首先需要进行场景建模。

通过建模软件(如Blender、Maya等),开发者可以创建各种物体、地形、角色等元素,并对其进行纹理贴图、动画设置等操作。

2. 光照与材质光照和材质是影响三维场景真实感的重要因素。

在OpenGL中,开发者可以通过设置光源类型、光照强度、材质属性等参数来模拟真实世界中的光照效果,从而使场景更加逼真。

3. 渲染技术在OpenGL中,常用的渲染技术包括光栅化渲染和射线追踪。

光栅化渲染是将三维物体投影到二维屏幕上进行渲染,而射线追踪则是通过模拟光线在场景中的传播路径来计算像素颜色值。

4. 特效与后期处理为了增强游戏场景的视觉效果,开发者还可以添加各种特效,如雾化效果、抗锯齿等,并通过后期处理技术对图像进行调色、模糊等处理。

三、基于OpenGL的三维游戏场景设计案例分析1.《我的世界》《我的世界》是一款使用OpenGL进行渲染的开放世界沙盒游戏。

通过方块式的画面风格和丰富多样的游戏内容,吸引了全球数百万玩家。

2.《巫师3:狂猎》《巫师3:狂猎》是一款采用OpenGL技术制作的大型角色扮演游戏。

游戏中精美逼真的画面和复杂多变的场景设计为玩家呈现了一个奇幻世界。

四、结语基于OpenGL的三维游戏场景设计与渲染技术在数字游戏行业中扮演着重要角色,为开发者提供了丰富多彩的创作空间。

opengl绘制教室

opengl绘制教室

OpenGL绘制虚拟教室姓名:王璞学号:220123132014年12月12日一、程序说明1.1项目要求①设计一个虚拟教室;②要求有四种物体以上;③具有光照、材质;④可以实现场景的巡游;1.2图形项目说明①绘制出的教室包含有黑板、时钟、讲台、课桌板凳、风扇、灯、门窗等基本物体,基本做到了对现实中教室的还原;②添加了灯光和纹理效果:地面、门窗、四面墙体、天花板及灯均使用了纹理贴图,使教室看起来更加生动形象;③为教室加上了时钟走时的动态效果,以及键盘交互功能,按键L可控制灯的开关,按键F可控制电风扇的转停;④在场景漫游方面:按键W控制前进、按键S控制后退、按键A控制左平移、按键D控制右平移、按键PagUp控制上移、按键PagDown控制下移、按键上控制y轴方向逆时针转动,按键下控制y轴方向顺时针转动,按键左控制x轴方向逆时针转动,按键右控制x轴方向顺时针转动共10个方向的漫游功能。

初始视角在位于教室最后方的中心线处。

1.3参考资料①/nehe NeHe OpenGL教程中文版②/nonkicat/archive/2013/03/28/2987125.html博客园[OpenGL]二次曲面图③/s/blog_4735d8eb010002t6.html vera的博客二、应用软件的总体设计2.1 需求规定输入:键盘的“←”、“↑”、“→”和“↓”、PagUp、PagDown、W、S、A、D。

输出:显示屏。

基本图形建模:工具库:四边形、立方体,球。

实用库:二次曲面。

使用旋转、平移、放大缩小等方法变换坐标矩阵,组成相应物体。

使用纹理和光照模型,完善场景外观。

其它处理:工具库:创建子窗口,键盘响应函数。

核心库:光栅位图。

Windows相关:读BMP位图作为纹理数据2.2 运行环境开发环境:Visual C++ 6.0 Console运行环境:Windows 8头文件:windows.h, glut.h, stdio.h , glaux.h, math.h, stdlib.h, time.h, iostream.h动态链接库:glu.dll, glu32.dll, glut32.dll和opengl32.dll静态链接库:glu32.lib, glut32.lib, opengl32.lib2.3 基本设计概念∙系统的初始化①窗口初始化②材质、光照∙对象模型的建立①房间墙体、门、窗、灯、黑板的绘制房间六面墙体、门、窗、灯和黑板的绘制均是通过画四边形的方式实现的,函数为glBegin(GL_QUADS),而其纹理则是按照由glBindTexture( )函数选择纹理、glTexCoord2f(1.0f, 1.0f);glVertex3f(-50.0f, -21.0f, -80.0f)函数将纹理坐标赋给顶点的方式完成纹理映射来实现的,其材质光照则是通过glMaterialfv( )函数完成。

使用OpenGL实现2D和3D图形

使用OpenGL实现2D和3D图形

使用OpenGL实现2D和3D图形
OpenGL是一种开放的、跨平台的3D图形编程接口,可以利
用其实现2D和3D图形效果。

它采用C语言语法,基于窗口
系统,其核心语句非常简单,强大的可扩展性,使得OpenGL
成为许多图形应用的最佳选择。

OpenGL提供几乎所有2D和
3D图形效果,如点、线、形状、贴图、细节、动画等。

若要使用OpenGL实现2D图形,首先需要设置和初始化OpenGL环境,然后调用OpenGL相关的函数定义和绘制2D
的场景图形,并设定颜色等信息进行渲染显示,最后对OpenGL环境进行清理。

实现3D图形的基本步骤和2D图形基本一致,但需要添加更
多的参数,如照相机位置、材质、光照、视角等。

此外,需要调用OpenGL上下文中定义的几何操作,并根据这些操作生成
3D模型数据,再将它们放入OpenGL环境中进行渲染和显示。

OpenGL提供了大量复杂的操作接口,可以方便快捷地实现
2D和3D图形,它使许多图形应用能够更加流畅,不论是PC
端还是移动端,都能够轻松实现精美的3D图形效果。

计算机图形学报告

计算机图形学报告

沈阳航空航天大学计算机图形学实验报告班级:34140102学号:20130 姓名:成绩:指导教师:实验一:OpenGL绘制球体线框图1.实验目的:本实验要求熟悉OpenGL基本图元函数的使用。

通过使用OpenGL及GLUT库在Visual C++环境下编写图形绘制程序掌握图形绘制的一般框架,从而为进一步做综合性的图形绘制实验奠定基础2.实验要求:编写一个程序,在窗口中显示一个旋转的球体线框,利用光标键可启动图形旋转切换视点。

3.实验过程:先配置环境,把相关文件放到相应的文件夹C:\Program Files\Microsoft Visual Studio\VC98\Include\GL C:\WINDOWS\system32 C:\Program Files\Microsoft Visual Studio\VC98\Lib建一个新工程,比照pdf敲代码再通过VC++进行编译4.实验结果:程序运行后,弹出窗口,使用光标键可使球体旋转。

代码:include <windows.h>#include <math.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glaux.h>void init();void CALLBACK reshapae(GLsizei w,GLsizei h);void CALLBACK display();GLfloat s, h;//回调函数,绘制窗口时调用void CALLBACK display(){//清空窗口设置背景为白色glClearColor(1, 1, 1, 1);glClear(GL_COLOR_BUFFER_BIT);//取景变换glLoadIdentity();gluLookAt(5, 5, h, s, 0, 0, 0, 1, 0);//glRotatef(30,1,1,0);//设置前景色为黑色glColor3f(0,0,0);//绘图开始,两条水平平行线GLfloat RAD = 3.1415926/180;GLfloat x, y, z, r;int i, j;for(i = 0; i < 180; i+=5){glBegin(GL_LINE_LOOP);r = 2 * sin(i * RAD);z = 2 * cos(i * RAD);for(j = 0; j <= 360; j+=10){x = r * cos(j * RAD);y = r * sin(j * RAD);glVertex3f(x, y, z);}glEnd();}for(j = 0; j < 360; j+=10){glBegin(GL_LINE_LOOP);for(i = 0;i <=180; i+=5){r = 2 * sin(i * RAD);z = 2 * cos(i * RAD);x = r * cos(j * RAD);y = r * sin(j * RAD);glVertex3f(x, y, z);}glEnd();}//清空帧缓存glFlush();}//OpenGL初始化,设置颜色为单一着色模式void init(){glShadeModel(GL_FLAT);s = 0;h = 5;}//回调函数,窗口初始化和大小改变时,调用此函数void CALLBACK reshape(GLsizei w,GLsizei h){//设置当前矩阵为投影变换矩阵glMatrixMode(GL_PROJECTION);//设置投影变换glLoadIdentity();gluPerspective(30, 1, -3, 3);//设置当前矩阵为模式变换矩阵glMatrixMode(GL_MODELVIEW);//设置视区变换glViewport(0, 0, w, h);}void CALLBACK Left(){s+=0.1;}void CALLBACK Right(){s-=0.1;}void CALLBACK Up(){h-=0.1;}void CALLBACK Down(){h+=0.1;}void main(){//设置OpenGL的显示模式:单缓存、RGB模式auxInitDisplayMode(AUX_SINGLE|AUX_RGB);//设置窗口位置、大小和标题auxInitPosition(0, 0, 300, 300);auxInitWindow("OpenGL Demo");init();//设置回调函数auxKeyFunc(AUX_LEFT,Left);auxKeyFunc(AUX_RIGHT,Right);auxKeyFunc(AUX_UP,Up);auxKeyFunc(AUX_DOWN,Down);auxReshapeFunc(reshape);auxMainLoop(display);}5.实验心得:对vc下opengl的配置还是花费了很多时间,通过本次试验,熟悉了OpenGL基本图元函数的使用,通过使用OpenGL及GLUT库在Visual C++环境下编写图形绘制程序掌握图形绘制的一般框架,从而为进一步做综合性的图形绘制实验奠定基础。

实验1__OpenGL基本图形绘制[整理版]

实验1__OpenGL基本图形绘制[整理版]

实验一OpenGL基本图形绘制一、实验目的和要求:1. 了解VC++环境下,OpenGL图形绘制的程序结构;2. 通过编程实现简单二维图形的绘制;3. 掌握理解简单的OpenGL程序结构;掌握OpenGL提供的基本图形函数,尤其是生成点、线、面的函数4. 掌握图形显示原理。

二、实验内容:1、OpenGL在VC++下的安装和配置2、读懂给定的示例程序,使用Visual C++ 6.0和OpenGL编写几个简单图形的绘制程序。

3、建议有能力的学生进一步学习OpenGL的复杂功能创建效果更好的三维图形;三、实验步骤:1、初步了解OpenGL的功能以及语法特点;2、下载glut包,复制 glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/include/gl文件夹下;3、创建VC工程:选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。

VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里;4、为项目添加文件:为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:\program files\ devstudio\vc\lib)中。

选中菜单Project->Add ToProject->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。

这三个文件请务必加入,否则编译时会出错。

或者将这三个文件名添加到Project->Setting->Link-> Object /library Modules 即可。

计算机图形学OpenGL版实验5-8

计算机图形学OpenGL版实验5-8

实验5 OpenGL模型视图变换一、实验目的:理解掌握OpenGL程序的模型视图变换。

二、实验内容:(1)阅读实验原理,运行示范实验代码,理解掌握OpenGL程序的模型视图变换;(2)根据示范代码,尝试完成实验作业;三、实验原理:在代码中,视图变换必须出现在模型变换之前,但可以在绘图之前的任何时候执行投影变换和视口变换。

1.display()程序中绘图函数潜在的重复性强调了:在指定的视图变换之前,应该使用glLoadIdentity()函数把当前矩阵设置为单位矩阵。

2.在载入单位矩阵之后,使用gluLookAt()函数指定视图变换。

如果程序没有调用gluLookAt(),那么照相机会设定为一个默认的位置和方向。

在默认的情况下,照相机位于原点,指向Z轴负方向,朝上向量为(0,1,0)。

3.一般而言,display()函数包括:视图变换 + 模型变换 + 绘制图形的函数(如glutWireCube())。

display()会在窗口被移动或者原来先遮住这个窗口的东西被一开时,被重复调用,并经过适当变换,保证绘制的图形是按照希望的方式进行绘制。

4.在调用glFrustum()设置投影变换之前,在reshape()函数中有一些准备工作:视口变换 + 投影变换 + 模型视图变换。

由于投影变换,视口变换共同决定了场景是如何映射到计算机的屏幕上的,而且它们都与屏幕的宽度,高度密切相关,因此应该放在reshape()中。

reshape()会在窗口初次创建,移动或改变时被调用。

OpenGL中矩阵坐标之间的关系:物理坐标*模型视图矩阵*投影矩阵*透视除法*规范化设备坐标——〉窗口坐标(1)视图变换函数gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0,)设置照相机的位置。

把照相机放在(0,0,5),镜头瞄准(0,0,0),朝上向量定为(0,1,0)朝上向量为照相机指定了一个唯一的方向。

计算机图形学-OpenGL多光源场景绘制

计算机图形学-OpenGL多光源场景绘制

计算机图形学-OpenGL多光源场景绘制实验名称:OpenGL多光源场景绘制(实验六)班级:信09-1学号:2108190911211姓名:王杰【实验⽬的】1. 掌握GLUT实⽤包中创建多⾯体以及⼆次曲⾯的函数2. 掌握OpenGL中的基本光照函数【实验内容】#includevoid init(void){glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_SMOOTH);glEnable(GL_LIGHTING);glEnable(GL_LIGHT1);GLfloat light_position1[] = { 5.0, 18.0, 0.0, 1.0 };//光源位置坐标GLfloat light_ambient1 [] = { 0.8, 0.5, 0.0, 1.0 };//环境光GLfloat light_diffuse1 [] = { 1.0, 1.0, 1.0, 1.0 };//漫反射光GLfloat light_specular1[] = { 0.0, 1.0, 1.0, 1.0 };//镜⾯光glLightfv(GL_LIGHT1, GL_POSITION, light_position1);glLightfv(GL_LIGHT1, GL_AMBIENT , light_ambient1 );glLightfv(GL_LIGHT1, GL_DIFFUSE , light_diffuse1 );glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular1);glEnable(GL_LIGHT2);GLfloat light_position2[] = { 1.0, 14.0, 0.0, 1.0 };//⽆穷远光源位置坐标GLfloat light_ambient2 [] = { 0.8, 0.5, 0.0, 1.0 };//环境光GLfloat light_diffuse2 [] = { 1.0, 1.0, 1.0, 1.0 };//漫反射光GLfloat light_specular2[] = { 0.0, 1.0, 1.0, 1.0 };//镜⾯光glLightfv(GL_LIGHT2, GL_POSITION, light_position2);glLightfv(GL_LIGHT2, GL_AMBIENT , light_ambient2 );glLightfv(GL_LIGHT2, GL_DIFFUSE , light_diffuse2 );glLightfv(GL_LIGHT2, GL_SPECULAR, light_specular2);glEnable(GL_LIGHT3);GLfloat light_position3[] = { 4.0, 10.0, 1.0, 2.0 };//⽅向光源位置坐标GLfloat light_ambient3 [] = { 0.8, 0.5, 0.0, 1.0 };//环境光GLfloat light_diffuse3 [] = { 1.0, 1.0, 1.0, 1.0 };//漫反射光GLfloat light_specula3 [] = { 0.0, 1.0, 1.0, 1.0 };//镜⾯光GLfloat light_spot_direction3 [] = { 0.0, 1.0, -1.0 };GLfloat light_spot_exponent3 [] = { 0.0 };GLfloat light_spot_cutoff3 [] = { 180 };glLightfv(GL_LIGHT3, GL_POSITION, light_position3);glLightfv(GL_LIGHT3, GL_AMBIENT , light_ambient3 );glLightfv(GL_LIGHT3, GL_DIFFUSE , light_diffuse3 );glLightfv(GL_LIGHT3, GL_SPECULAR, light_specula3);glLightfv(GL_LIGHT3, GL_SPOT_EXPONENT, light_spot_exponent3);glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, light_spot_direction3);glLightfv(GL_LIGHT3, GL_SPOT_CUTOFF, light_spot_cutoff3);GLfloat material_ambient [] = { 0.2, 0.2, 0.0, 0.0 };//环境光GLfloat material_diffuse [] = { 0.0, 0.2, 1.0, 1.0 };//漫反射光GLfloat material_specular[] = { 1.0, 1.0, 1.0, 0.0 };//镜⾯光glMaterialfv(GL_FRONT,GL_AMBIENT,material_ambient);//材质环境光glMaterialfv(GL_FRONT,GL_DIFFUSE,material_diffuse);//材质漫反射光glMaterialfv(GL_FRONT,GL_SPECULAR,material_specular);//材质镜⾯光}void display(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glColor3f(0.0,0.0,0.0);glTranslatef(-0.5,0.0,-3.0);glRotatef(10,3,3,3);glutSolidOctahedron ();//⼋⾯体glFlush();glTranslatef(1.7,0.0,-3.0);glutSolidTorus (0.3,0.2,10,10);//环⾯glFlush();}void reshape(int w, int h){glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);elseglOrtho (-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}int main(int argc, char** argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA|GLUT_DEPTH); glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;}【运⾏结果截图】【正交及透视投影函数功能及使⽤说明】。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机图形学报告
(项目一)
专业:计算机科学与技术
姓名:
学号:
班级:
目录
1.引言 (3)
1.1编写目的 (3)
1.2项目背景 (3)
2.开发结果 (3)
2.1开发环境 (3)
2.2主要功能及性能 (3)
2.3场景介绍 (3)
2.4操作介绍 (4)
2.5灯光介绍 (6)
3.总结 ............................................................................................................. 错误!未定义书签。

4.参考文献 ..................................................................................................... 错误!未定义书签。

5.代码 ............................................................................................................. 错误!未定义书签。

1.引言
1.1编写目的
利用OpenGL绘制一个简单的场景
–包含球、正方形、网格数据
–交互操作:平移、缩放、旋转
–可以使用不同的灯光
1.2项目背景
openGL编程在计算机图形学中具有非常重要的作用,是实现计算机图形的一个重要工具,通过openGL编程,我们能更好的学习计算机图形学,同时也能提高我们自己的实际动手能力。

2.开发结果
2.1开发环境
Windows7旗舰版
Vs2012
2.2主要功能及性能
利用OpenGL绘制一个简单的场景
–包含球、正方形、网格数据
–交互操作:平移、缩放、旋转
–可以使用不同的灯光
2.3场景介绍
绘制一个简单的场景,包含球、正方形、网格数据。

如图:
2.4操作介绍
利用上下左右方向键进行上下左右移动,如图:
利用home,end,pgup,insertj进行上下左右的旋转,如图:
2.5灯光介绍
包括三中灯光:环境光,漫射光,平面光
利用鼠标右键进行灯光选择:漫射光如图:
3.总结
4.参考文献
1、OpenGL超级宝典
2、博客:vs2012中OpenGL配置
3、计算机图像学基础5.代码
// DiffuseLight.cpp
// OpenGL SuperBible
// Demonstrates simple diffuse lighting // Program by Richard S. Wright Jr.
#include<GLTools.h>// OpenGL toolkit #include<GLMatrixStack.h>
#include<GLFrame.h>
#include<GLFrustum.h>
#include<GLGeometryTransform.h>
#include<StopWatch.h>
#include<math.h>
#ifdef __APPLE__
#include<glut/glut.h>
#else
#define FREEGLUT_STATIC
#include<GL/glut.h>
#endif
GLFrame viewFrame; GLFrustum viewFrustum; GLTriangleBatch sphereBatch;
//GLBatch sphereBatch; GLMatrixStack modelViewMatrix; GLMatrixStack projectionMatrix; GLGeometryTransform transformPipeline; GLShaderManager shaderManager;
GLuint ADSLightShader;
GLint locAmbient;
GLint locDiffuse;
GLint locSpecular;
GLint locLight;
GLint locMVP;
GLint locMV;
GLint locNM;
GLint lightOnOff = 0;
//points
static const float vertex_list[][3] = {
-0.5f, -1.5f, -0.5f,
0.5f, -1.5f, -0.5f,
0.5f, -0.5f, -0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, -1.5f, 0.5f,
0.5f, -1.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, 0.5f,
};
//points connect
static const GLint index_list[][4] = {
{0, 1, 2, 3},
{3, 2, 6, 7},
{4, 5, 6, 7},
{0, 1, 5, 4},
{1, 5, 6, 2},
{0, 4, 7, 3}
};
// draw cube
void DrawCube(void)
{
int i,j;
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_QUADS);
for(i=0; i<6; ++i)
{
for(j=0; j<4; ++j)
{
glVertex3fv(vertex_list[index_list[i][j]]);
}
}
glEnd();
}
void SetupRC(void)
{
// Background
glClearColor(0.0f, 1.0f, 0.0f, 1.0f );
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
shaderManager.InitializeStockShaders();
//viewFrame.MoveForward(4.0f);
// Make the sphere
gltMakeSphere(sphereBatch, 0.5f, 26, 13);
ADSLightShader = shaderManager.LoadShaderPairWithAttributes("ADSGouraud.vp", "ADSGouraud.fp", 2, GLT_ATTRIBUTE_VERTEX, "vVertex",
GLT_ATTRIBUTE_NORMAL, "vNormal");
locAmbient = glGetUniformLocation(ADSLightShader, "ambientColor");
locDiffuse = glGetUniformLocation(ADSLightShader, "diffuseColor");
locSpecular = glGetUniformLocation(ADSLightShader, "specularColor");
locLight = glGetUniformLocation(ADSLightShader, "vLightPosition");
locMVP = glGetUniformLocation(ADSLightShader, "mvpMatrix");
locMV = glGetUniformLocation(ADSLightShader, "mvMatrix");
locNM = glGetUniformLocation(ADSLightShader, "normalMatrix");
}
// Cleanup
void ShutdownRC(void)
{
}。

相关文档
最新文档