Opengl实验报告及源代码实验七 模型加载
图形学实验报告 OpenGL中的实体模型与层次模型
《计算机图形学基础》
实验3
OpenGL中的实体模型与层次模型
一、实验目的及要求
1.掌握GLUT库中的多面体函数的绘制方法;
2.掌握GLUT库中的二、三次曲面的绘制方法;
3.掌握绘制实体或线框模型的绘制方法;
4.掌握显示列表的用法;
二、实验环境
主要是软件开发环境:VC 6.0
三、实验内容
1.利用OpenGL绘制简单多面体、二次及三次曲线的例子。
2.利用OpenGL绘制奥运五环标志。
四、实验结果
1、利用OpenGL绘制简单多面体、二次及三次曲线的例子。
2、利用OpenGL绘制奥运五环标志
五、程序代码
1、利用OpenGL绘制简单多面体、二次及三次曲线#include
static GLsizei iMode = 1;
static GLfloat xRot = 0.0f; //x方向旋转参数
static GLfloat yRot = 0.0f; //y方向旋转参数GLUquadricObj *obj; //二次曲面对象
void Initial(void)
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glColor3f(0.0f, 0.0f, 0.0f);
obj = gluNewQuadric( );
gluQuadricDrawStyle(obj, GLU_LINE); //以线框方式绘制二次曲面对象
}
void ChangeSize(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
基于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中建⽴的程序框架,完成如下任务:
opengl实验报告
opengl实验报告
OpenGL实验报告
引言:
OpenGL(Open Graphics Library)是一种跨平台的图形编程接口,被广泛应用
于计算机图形学、游戏开发和科学可视化等领域。本实验报告将介绍我对OpenGL的实验研究和学习成果。
一、实验目的
本次实验的主要目的是掌握OpenGL的基本概念和使用方法,了解图形渲染的
原理和过程,以及学习如何在OpenGL中创建和操作图形对象。
二、实验环境
本次实验使用的是OpenGL的最新版本,并在Windows操作系统下进行开发。使用的开发工具是Visual Studio和OpenGL的开发库。
三、实验过程
1. 熟悉OpenGL的基本概念
在开始实验之前,我先学习了OpenGL的基本概念,包括OpenGL的坐标系统、图形渲染管线、着色器等。了解这些概念对于后续的实验非常重要。
2. 创建窗口和上下文
在OpenGL中,我们需要先创建一个窗口和一个OpenGL上下文,以便进行图
形渲染。通过调用相关的OpenGL函数,我成功创建了一个窗口,并初始化了OpenGL的上下文。
3. 绘制基本图形
接下来,我开始尝试绘制一些基本的图形,比如点、线和三角形。通过设置顶
点坐标和颜色,我成功绘制出了这些基本图形,并在窗口中显示出来。
4. 添加纹理
为了使图形更加逼真和丰富,我学习了如何在OpenGL中添加纹理。通过加载图片并设置纹理坐标,我成功将纹理贴在了绘制的图形上,使其具有了更加真实的效果。
5. 光照和阴影效果
为了增加图形的立体感和真实感,我学习了如何在OpenGL中添加光照和阴影效果。通过设置光源的位置和属性,以及材质的属性,我成功实现了光照和阴影的效果,使图形看起来更加逼真。
Opengl实验报告及源代码实验七模型加载
Opengl实验报告及源代码实验七模型加载实验报告
学⽣姓名:学号:专业班级:
实验类型:□验证□综合□设计□创新实验⽇期:2018.11 实验成绩:⼀、实验名称
实验七模型加载
⼆、实验内容
1.设计并实现Mesh类,利⽤该类实现模型⽹格的解析、加载、管理与渲染。
2.设计并实现Model类,利⽤该类实现⼏何模型的解析、加载、管理与渲染。
3.基于Mesh类和Model类,利⽤Assimp模型加载库,加载并渲染三维⼏何模型。
三、实验⽬的
1.掌握3D模型⽹格数据的组织与渲染⽅法。
2.掌握3D模型数据的结构与组织,以及模型数据的解析与渲染⽅法。
3.了解Assimp库中管理3D模型的数据结构,掌握Assimp库的使⽤⽅法。
四、实验步骤
1.定义⽹格类结构,并初始化
class Mesh
{
Public:
vector vertices;
vector indices;
vector textures;
Mesh(vector vertices, vector indices, vector texture);
Void Draw(Shader shader);
private:
GLuint VAO, VBO, EBO;
void setupMesh();
}
void setupMesh()
{
glGenVertexArrays(1, &this->VAO);
glGenBuffers(1, &this->VBO);
glGenBuffers(1, &this->EBO);
glBindVertexArray(this->VAO);
01-实验:模型导入(github上有工程)。
计算机图形学课程实验:模型导入
目录
1.模型加载库Assimp (1)
1.1Assimp (1)
1.1.1Assimp 简介 (1)
1.1.2构建Assimp (2)
2.M esh && Model 类的创建 (3)
2.1Mesh (3)
2.1.1数据结构 (3)
2.1.2setupMesh()函数 (4)
2.1.3Draw()函数 (5)
2.2Model (7)
2.2.1数据结构 (7)
2.2.2loadModel ()函数 (7)
2.2.3processNode()和processMesh()函数 (8)
3.绘制模型 (9)
1.模型加载库Assimp
1.1Assimp
1.1.1Assimp 简介
Assimp 是一个非常流行的模型导入库,它支持多种格式的模型文件,如obj、3ds、c4e 等。Assimp 加载所有模型和场景数据到一个 Scene 类型的对象中,同
时为场景节点、模型节点生成具有对应关系的数据结构。数据结构图如下:
●Scene 对象:包括模型所有的场景数据,如 Material 质和Mesh。
同样,场景的根节点引用也包含在这个 Scene 对象中。
●Root node:可能也会包含很多子节点和一个指向保存模型点云
数据 mMeshes[]的索引集合。根节点上的 mMeshes[]里保存了实
际了 Mesh 对象,而每个子节点上的 mMesshes[]都只是指向根
节点中的 mMeshes[]的一个引用。
●Mesh:本身包含渲染所需的所有相关数据,比如顶点位置、法
线向量、纹理坐标、面片及物体的材质。
图形学实验报告 OpenGL中的实体模型与层次模型
《计算机图形学基础》
实验3
OpenGL中的实体模型与层次模型
一、实验目的及要求
1.掌握GLUT库中的多面体函数的绘制方法;
2.掌握GLUT库中的二、三次曲面的绘制方法;
3.掌握绘制实体或线框模型的绘制方法;
4.掌握显示列表的用法;
二、实验环境
主要是软件开发环境:VC 6.0
三、实验内容
1.利用OpenGL绘制简单多面体、二次及三次曲线的例子。
2.利用OpenGL绘制奥运五环标志。
四、实验结果
1、利用OpenGL绘制简单多面体、二次及三次曲线的例子。
2、利用OpenGL绘制奥运五环标志
五、程序代码
1、利用OpenGL绘制简单多面体、二次及三次曲线#include <gl/glut.h>
static GLsizei iMode = 1;
static GLfloat xRot = 0.0f; //x方向旋转参数
static GLfloat yRot = 0.0f; //y方向旋转参数GLUquadricObj *obj; //二次曲面对象
void Initial(void)
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glColor3f(0.0f, 0.0f, 0.0f);
obj = gluNewQuadric( );
gluQuadricDrawStyle(obj, GLU_LINE); //以线框方式绘制二次曲面对象
}
void ChangeSize(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
OpenGL实验预习报告
OpenGL绘图实验预习报告
一.实验
OpenGL的英文全称是“Open Graphics Library”即“开放的图形程序接口”,它是计算机工业标准应用程序接口,主要用于开发二维和三维图形应用程序。
OpenGL是一套底层三维图形API,之所以称之为底层API,是因为它没有提供几何实体图元,不能直接用以描述场景。但通过一些转换程序,可以很方便的将AutoCAD、3DS等图形设计软件制作的DFX和3DS模型文件转换成OpenGL的顶点数据。
OpenGL是与硬件无关的软件接口,使用它图形软件生产厂商再不用为各种不同的机型开发设计不同的软件,只要操作系统使用了OpenGL适配器就可以达到相同的效果,它是一个开放图形库,目前在Windows、MacOS、OS/2、Unix/X-Windows 等系统下均可使用,且仅在窗口相关部分(系统相关)略有差异,因此具有良好的可移植性,同时调用方法简洁明了,深受好评,应用广泛。OpenGL能在网络环境下以客户机/服务器模式工作,充分发挥集群运算的威力,是专业图形处理、科学计算等高端应用领域的标准图形库。
(一)OpenGL基础知识
OpenGL是一种开放式的图形软件开发包,它采用C语言风
格,提供大量的函数来进行图形方面的处理,一般编程使用的函数库包括:
OpenGL图形库-----函数以gl开头,可以实现比较简单的绘制功能,核心函数共115个。这些函数可以运行在现在任何主流操作系统中。
绘制基本几何图元的函数
如绘制图元的函数glBegain()、glEnd()、glNormal*()、
计算机图形学作业实验报告
计算机图形学作业实验报告
计算机图形学实验报告班级:学号:姓名:指导教师:完成日期:实验一:多边形填充1、实验目的了解多边形属性,熟悉相关函数的调用。
二、实验内容步骤和实现:首先进行初始化工作,进行显示模式(单缓冲区)和窗口等设定,主要实现根据两个函数,一个是指定场景绘制函数,glutDisplayFunc(Paint),paint函数中设置了两个三角形,一个填充,一个不填充。
用到了启用多边形点画模式glEnable(GL_POLYGON_STIPPLE)的函数,和指定多边形点画模式(填充)glPolygonStipple(fly)的函数。
另外一个就是循环执行OpenGl命令的glutMainLoop()函数。
三、实验结果四、源程序//POLY_STIPPLE.C#includevoidmakeObject()//定义一个三角形{glBegin(GL_TRIANGLES);//开始定义三角形//按逆时针方向指定三角形的顶点坐标glVertex2f(-0.95,-0.95);glVertex2f(0.95,-0.95);glVertex2f(0,0.95);glEnd() ;//三角形定义结束}voiddisplay(){GLsizeiw=glutGet(GLUT_WINDOW_WIDTH);//程序窗口宽度GLsizeih=glutGet(GLUT_WINDOW_HEIGHT);//程序窗口高度GLubytefly[]=//第二个三角形点画模式的mask值{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,//0X03,0X80,0X01,0X C0,0X06,0XC0,0X03,0X60,//0X04,0X60,0X06,0X20,0X04,0X30,0X0C,
计算机图形学 OpenGL 外部图形的的加载、旋转和平移
外部图形的加载、旋转和平移
1、实验目的和要求
外部图形的的加载、旋转和平移
2、实验内容
用MFC方法和OpengL知识来实现位图和.cur格式图形文件的的加载、旋转和平移。
3、实验步骤
1)程序设计
Camera.cpp 实现照相机模型与变换。
CoordinateAxis.cpp 实现图中的向量绘制和标注。
MFCGL.cpp 实现的功能相当于主函数调用的功能。
MFCGLView.cpp 主干文件,对图形的编辑的具体实现。
2)程序调试、测试与运行结果分析
(1)X视图
Y视图
Z视图
旋转功能
平移共能
功能选择键,依次为选择、旋转、平移和三种视图。
(2)功能上实现的感觉还可以,基本上已经达到要求,但由于图形文件是从网上下来的,不是自己编辑设计的,而且也不是cad文件,是没有达到题目要求,Win7不能安装CAD软件,这是我自己考虑不周,实验结果还是比较满意的。
4、实验总结
此次课程设计,对我的很有挑战。在课上对文件加载这部分知识没有过多的领会,导致我在网上找了很长时间的加载函数。后来网上有了个用MFC 加载图形的例子,根据它的截图和关键算法的代码实现,再加上以前对MFC 稍微有点了解,知道函数该添加在什么位置,花了将近一个下午的时间将在RES文件夹中的文件进行了加载、旋转和平移,代码看的不是特别懂,有点糊里糊涂,而且可能对MFC了解的也不是特别深,致使我在编译时错误不断,有时甚至达到了115个错误。后来原因只是因为一个符号错了,看来还得再细节上多多注意,还有头一次用MFC实现OpengL方法的编程,感觉还好,最起码有结果出来了。MFC的优点就是框架已经搭建好了,不用在费事去做过多与需求功能无关的事,很多文件都是直接生成的,只需加几个头文件就行了,还有就是添加功能函数。总体讲收获很大,对自己的编程能力又多了一点自信。
opengl实验报告
总评成绩:_________________________实验类型: 交互
实验名称: 实验2.3草拟
姓名: __肖祥炜____________
学号: ____201158501103______ 班级: ___计111-1_______
电子文档提交: 按时提交____延时提交____未提交____
格式正确____基本正确____ 不正确____
实验报告: 完整____合格____不合格____
实验成绩:____________________
验收记录:时间________________ 顺序________________
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
一、原创性声明
程序参考了drawFreeCurve.c程序自由画线部分,其余的都是自己原创的
二、实验要求
1.单击左键移动鼠标开始自由绘图。
2.单击鼠标右键绘制随机曲线:
(1)单击键盘a放大图形
(2)单击键盘b缩小图形
三、完成情况
●功能1 : 基本内容
✧功能描述:
✧完成情况: 基本完成实验要求,但是在绘制随机线条时,图案总是显示在左下角,如果图
案调到中间左键自由绘制的时候点不在鼠标点上,不知道怎么改!!
✧Bug:暂时没有找到
✧备注:图形放大会放大到窗口外面。
四、实现方案
1.用鼠标响应函数控制左右键,在左键条件下用一个参数记录鼠标单击几次,只有当参数为1 时才响应鼠标移动函数绘制点,所以只要鼠标移动速度比较慢就能自由绘制图形。
2.自由绘制随机曲线:绘制bezier曲线,把他的四个点用随机数代替就行,设置八个随机数分别控制4个点,单击右键,响应一次随机函数给4个点赋值。
计算机图形学实验报告
04
实验四:渲染复杂场景
实验目的
掌握渲染复杂场景的基本流程和方法 理解光线追踪和着色器在渲染过程中的作用
熟悉渲染引擎的实现原理和技巧 提高解决实际问题的能力
实验步骤
• 准备场景文件 • 使用3D建模软件(如Blender)创建或导入场景模型,导出为常用的3D格式(如.obj或.fbx)。 • 导入场景文件 • 在渲染引擎(如Unity或Unreal Engine)中导入准备好的场景文件。 • 构建场景图 • 根据场景的层次结构和光照需求,构建场景图(Scene Graph)。 • 设置光照和材质属性 • 为场景中的物体设置光照和材质属性(如漫反射、镜面反射、透明度等)。 • 编写渲染脚本 • 使用编程语言(如C或JavaScript)编写渲染脚本,控制场景中物体的渲染顺序和逻辑。 • 运行渲染程序 • 运行渲染程序,观察渲染结果。根据效果调整光照、材质和渲染逻辑。 • 导出渲染图像 • 将渲染结果导出为图像文件(如JPEG或PNG),进行后续分析和展示。
2. 通过属性设置和变换操作,实现了对图形的定 制和调整,加深了对图形属性的理解。
4. 实验的不足之处:由于时间限制,实验只涉及 了基本图形的绘制和变换,未涉及更复杂的图形 处理算法和技术,如光照、纹理映射等。需要在 后续实验中进一步学习和探索。
02
实验二:实现动画效果
实验目的
OpenGL实验一实验报告
计算机学院09计算机科学与技术专业 04 班学号:3109006029 姓名:冯沐强协作者:________ 教师评定: _________
一、实验目的
1 掌握OpenGL的三维图形绘制方法
2 掌握Visual C++环境下的OpenGL图形开发
二、实验要求
在Windows平台上用VC++结合GLUT做实验,要求掌握结合VC++和OpenGL的基本图形(四面体、六面体、圆柱、圆锥等)建模及编程技能,以及图形学的基本原理,实验完成后要求根据自己的成果撰写一份实验报告。
1 基本三维几何图形(四面体、六面体、圆柱、球等)的建模及基本的交互
2 人机交互(图形的基本变换,如旋转、平移、尺度缩放及橡皮筋技术等)
三、实验环境
操作系统:Windows xp
开发环境:VC以及GLUT
图形交互设备:鼠标和键盘
四、实验内容
1 GLUT在VC环境下的正确配置
下载GLUT包,解压后,文件夹中有dll,lib,h文件,将,复制到C:\WINDOWS\system32下,将glut32.lib, 放到C:\Program Files\Microsoft Visual Studio\VC98\Lib(即安装的目录),将复制到C:\ProgramFiles\Microsoft Visual Studio\VC98\Include\GL
2对基本图形(四面体,六面体,圆柱,球等)的建模及基本交互。
a 在上述四种图形的中选择两种及两种以上进行建模或者组合他们产生新
的对象。
b 基本的交互包括:利用鼠标、键盘实现图像的交互(主要实现物体的浏
OpenGL曲线、曲面的绘制与3D模型的装载与显示
实验7 OpenGL曲线、曲面的绘制与3D模型的装载与显示
实验目的:
1)理解Bezier曲线、曲面绘制的基本原理;理解OpenGL中一维、二维插值求值器的用法。
2)掌握OpenGL中曲线、曲面绘图的方法,对比不同参数下的绘图效果差异;
实验要求:
1)教师领读代码;
2)学生上机实验;
3)针对代码1,分别或同时去掉开关1和开关2的代码注释,查看并记录实验效果;用公式说明Bezier曲线、曲面的绘制计算过程;
4)针对代码2,分别或同时去掉各开关,观察并记录显示效果差异;用公式说明Bezier曲面插值点的计算过程;说明线框模型与曲面模型的区别;
5)针对代码3:实验和观察材质参数、光照参数、坐标参数对实验效果的影响;
6)理解均匀与非均匀样条有理曲线或曲面的差异;
7)针对代码4:掌握非均匀有理B样条曲面(NURBS曲面)的曲面绘制方法;
8)阅读https:///sweetdark/blog/184313代码,编写曲面裁剪和细分曲面的效果。
9)OpenGL如何装载并显示3D MAX导出的3D模型实验及代码,课外自行完成。
代码1:用四个控制点绘制一条三次Bezier曲线:
//Demo: 用四个控制顶点来画一条三次Bezier曲线
#include
#include
#include
//4个控制点的3D坐标——z坐标全为0
GLfloatctrlpoints[4][3] = {
{-4, -4, 0}, {-2, 4, 0}, {2, -4, 0}, {4, 4, 0}
};
voidinit(void)
{
//背景色
计算机图形学实验报告
计算机图形学实验报告
计算机图形学实验报告
引言
计算机图形学是研究计算机生成和处理图像的学科,它在现代科技和娱乐产业中扮演着重要的角色。本实验报告旨在总结和分享我在计算机图形学实验中的经验和收获。
一、实验背景
计算机图形学实验是计算机科学与技术专业的一门重要课程,通过实践操作和编程,学生可以深入了解图形学的基本原理和算法。本次实验主要涉及三维图形的建模、渲染和动画。
二、实验内容
1. 三维图形建模
在实验中,我们学习了三维图形的表示和建模方法。通过使用OpenGL或其他图形库,我们可以创建基本的几何体,如立方体、球体和圆柱体,并进行变换操作,如平移、旋转和缩放。这些基本操作为后续的图形处理和渲染打下了基础。
2. 光照和着色
光照和着色是图形学中重要的概念。我们学习了不同的光照模型,如环境光、漫反射和镜面反射,并了解了如何在三维场景中模拟光照效果。通过设置材质属性和光源参数,我们可以实现逼真的光照效果,使物体看起来更加真实。3. 纹理映射
纹理映射是一种将二维图像映射到三维物体表面的技术。通过将纹理图像与物
体的顶点坐标相对应,我们可以实现更加细致的渲染效果。在实验中,我们学
习了纹理坐标的计算和纹理映射的应用,使物体表面呈现出具有纹理和细节的
效果。
4. 动画和交互
动画和交互是计算机图形学的重要应用领域。在实验中,我们学习了基本的动
画原理和算法,如关键帧动画和插值技术。通过设置动画参数和交互控制,我
们可以实现物体的平滑移动和变形效果,提升用户体验。
三、实验过程
在实验过程中,我们首先熟悉了图形库的使用和基本的编程技巧。然后,我们
Opengl实验报告及源代码实验五 几何变换
实验报告
学生姓名:学号:专业班级:
实验类型:□验证□综合□设计□创新实验日期:2018.11 实验成绩:
一、实验名称
实验五几何变换
二、实验内容
1.编写程序绘制若干三维物体,将其放置在场景的不同位置,并让物体绕自身的某条
轴做旋转运动;
2.编写一个可在三维场景中自由移动和改变观察方向的摄像机,利用键盘和鼠标控制
摄像机实现三维场景的动态漫游。
三、实验目的
1.了解缩放、平移和旋转等模型变换的实现原理,掌握模型变换矩阵的使用方法,能
够利用模型变换建立三维场景;
2.了解视点变换的实现原理,掌握视点变换与摄像机功能的具体关系和利用视点变换
矩阵构造摄像机的具体方法。
3.了解投影变换和视口变换的实现原理,掌握投影变换与视口变换在场景缩放和显示
中的作用。
四、实验步骤
1.建立立方体几何模型。定义立方体顶点的位置坐标和纹理坐标,设置不同立方体在
世界坐标系中的位置。
// Set up vertex data and attribute pointers
GLfloat vertices[] = {
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
参考资料--opengl实验报告
贵州大学实验报告学院:计算计科学与信息学院专业:班级:
这次试验的主要任务是学会配置opengl的运行环境,并通过编写程序来测试能否正确的生成相应的图案,所以还算比较简单的,做实验时只要看一下老师发给我们的ppt,然后按照上面的步骤一步一步的操作就行,先是把下载好的压缩包解压然后找到安装目录,然后将相应的文件放到相
贵州大学实验报告
学院:计算计科学与信息学院专业:数字媒体技术班级:数媒091
贵州大学实验报告
学院:计算计科学与信息学院专业:数字媒体技术班级:数媒091
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
学生姓名:学号:专业班级:
实验类型:□验证□综合□设计□创新实验日期:2018.11 实验成绩:一、实验名称
实验七模型加载
二、实验内容
1.设计并实现Mesh类,利用该类实现模型网格的解析、加载、管理与渲染。
2.设计并实现Model类,利用该类实现几何模型的解析、加载、管理与渲染。
3.基于Mesh类和Model类,利用Assimp模型加载库,加载并渲染三维几何模型。
三、实验目的
1.掌握3D模型网格数据的组织与渲染方法。
2.掌握3D模型数据的结构与组织,以及模型数据的解析与渲染方法。
3.了解Assimp库中管理3D模型的数据结构,掌握Assimp库的使用方法。
四、实验步骤
1.定义网格类结构,并初始化
class Mesh
{
Public:
vector
vector
vector
Mesh(vector
Void Draw(Shader shader);
private:
GLuint VAO, VBO, EBO;
void setupMesh();
}
void setupMesh()
{
glGenVertexArrays(1, &this->VAO);
glGenBuffers(1, &this->VBO);
glGenBuffers(1, &this->EBO);
glBindVertexArray(this->VAO);
glBindBuffer(GL_ARRAY_BUFFER, this->VBO);
glBufferData(GL_ARRAY_BUFFER, this->vertices.size() * sizeof(Vertex),
&this->vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->indices.size() * sizeof(GLuint),
&this->indices[0], GL_STATIC_DRAW);
// 设置顶点坐标指针
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
(GLvoid*)0);
// 设置法线指针
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
(GLvoid*)offsetof(Vertex, Normal));
// 设置顶点的纹理坐标
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex),
(GLvoid*)offsetof(Vertex, TexCoords));
glBindVertexArray(0);
}
2.定义用于渲染的函数:
void Draw(Shader shader)
{
GLuint diffuseNr = 1;
GLuint specularNr = 1;
for(GLuint i = 0; i < this->textures.size(); i++)
{
glActiveTexture(GL_TEXTURE0 + i); // 在绑定纹理前需要激活适当的纹理单元
// 检索纹理序列号(N in diffuse_textureN)
stringstream ss;
string number;
string name = this->textures[i].type;
if(name == "texture_diffuse")
ss << diffuseNr++; // 将GLuin输入到string stream
else if(name == "texture_specular")
ss << specularNr++; // 将GLuin输入到string stream
number = ss.str();
glUniform1f(glGetUniformLocation(shader.Program, ("material." + name + number).c_str()), i);
glBindTexture(GL_TEXTURE_2D, this->textures[i].id);
}
glActiveTexture(GL_TEXTURE0);
// 绘制Mesh
glBindVertexArray(this->VAO);
glDrawElements(GL_TRIANGLES, this->indices.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);