# 1 论述
(1)你选修计算机图形学课程,想得到的是什么知识?现在课程结束,对于所得的知识是否满意?如果不满意,你准备如何寻找自己需要的知识。
答:
① 我希望通过选修计算机图形学课程,学习计算机如何对图形进行处理、生成和显示的,了解在计算机系统中是怎么通过CPU和GPU处理得到图形并最终展现在显示器上的。
② 我对于图形从几何阶段到光栅化阶段再最终展现在显示器上的过程有了一定的了解,同时学习了OpenGL的编程技术来绘制自己的图形,对所学的知识较为满意。
③ 这门课作为我在计算机图形学领域的入门启蒙课,使我学到了很多图形学相关的底层和应用层知识,今后如果需要继续涉及图形学项目的话,应该会通过诸如LearnOpenGL-CN这样的网站进行高级图形处理技术的学习。
(2)你对计算机图形学课程中的哪一个部分的内容最感兴趣,请叙述一下,并谈谈你现在的认识。
答:我对图形的变换这部分内容最感兴趣。图形的平移、旋转、缩放、错切等操作要对图形的所有顶点计算它们变换后的新坐标,如果逐个通过模拟的方法去计算显然是不实际的,而且多个变换的叠加也非常复杂。在计算机图形学的课程中巧妙地使用线性代数中的矩阵来做变换,平移、旋转、缩放、错切这些基本操作都可以抽象成一个矩阵,通过矩阵的乘法来叠加多个变换,最后只需要计算矩阵乘法就可以将多个变换转换为一个变换矩阵。我还学习到矩阵乘法的运算顺序和变换作用到图形的顺序是相反的,在做图形变换的时候需要考虑到变换施加的顺序,以及变换前后参数的取值范围的变化。在实际的OpenGL程序中,引用一些数学库来方便矩阵运算(课程实验用的是vmath.h),虽然把一些基本变换做了抽象,但还是需要线性代数的一些底层知识和对矩阵的认识才能正确使用。
(3)你对计算机图形学课程的内容,教学方法有什么看法和建议。
答:希望除了最后的大作业之外还可以增加一些去机房的实验课,在课上提出问题和解决问题的效率或许会高一些,因为很多人(比如我)在截止日期之前都不太有动力做实验。
# 2 实验(OpenGL)
## **2.1** **实验内容**
利用OpenGL框架,设计一个日地月运动模型动画。
(1)运动关系正确,相对速度合理,且地球绕太阳,月亮绕地球的轨道不能在一个平面内。
(2)地球绕太阳,月亮绕地球可以使用简单圆或者椭圆轨道。
(3)对球体纹理的处理,至少地球应该有纹理贴图。
(4)增加光照处理,光源设在太阳上面。
(5)为了提高太阳的显示效果,可以在侧后增加一个专门照射太阳的灯。
## **2.2** **实验方法和过程**
(1)实验平台搭建
实验中引用与OpenGL相关的库有glfw、glad、vmath和stb_image,其中glfw库需要从官网下载源代码后使用CMake工具编译,glad库可在官网进行在线配置后下载得到,vmath库和stb_image库使用的是老师提供的版本。
搭建过程按照老师提供的详细手册逐步进行,不同的是使用了Visual Studio 2019版本,需要在项目设置中将x86和x64生成方式的引用项目统一按照手册中内容进行修改,否则会报“无法解析的外部符号”错误。
![](https://www.writebug.com/myres/static/uploads/2021/10/31/a6559c243c47302195c59874eb058a97.writebug)
图1 工程目录结构
(2)总体思路
要实现日地月系统,首先要绘制球体。因为太阳、地球和月亮都是球体,所以可以复用一套顶点,之后只需要使用缩放变换来调整大小即可。
然后可以使用旋转变换矩阵、平移变换矩阵的叠加变换来实现自转、公转。
轨道交角的调节可以修改旋转变换矩阵的参数来修改旋转轴的方向。
椭圆轨道可以通过数学公式计算出随角度变化的顶点位置信息,然后直接使用平移变换将球体平移到相应位置即可。
纹理可以将球体的经纬度映射到2D纹理顶点,然后创建纹理对象并使用stb_image库加载图片纹理文件,再修改着色器代码进行渲染即可。
(3)代码框架
整个框架在之前的课程作业基础上修改而来。先是搭建了一个显示黑框的框架,然后在此基础上绘制了一个三个顶点分别为三原色的三角形,且可以读取键盘按键进行控制。
最后的实验保持main函数流程基本不变,主要修改initial函数和Draw函数来完成实验。
(4)绘制球体
这部分参考老师给的参考代码中的Sphere.cpp,先将球分为x、y坐标上的X_SEGMENTS、Y_SEGMENTS段,然后通过纬度角和经度角来计算得到球面上每一点的x,y,z三维坐标,将坐标点数值压入vector容器中。
我把这部分代码封装为generateBallVerticles函数如下:
```cpp
void generateBallVerticles(std::vector<float>& sphereVertices) {
for (int y = 0; y <= Y_SEGMENTS; y++)
{
for (int x = 0; x <= X_SEGMENTS; x++)
{
float xSegment = (float)x / (float)X_SEGMENTS;
float ySegment = (float)y / (float)Y_SEGMENTS;
float xPos = std::cos(xSegment * Radio * PI) * std::sin(ySegment * PI);
float yPos = std::cos(ySegment * PI);
float zPos = std::sin(xSegment * Radio * PI) * std::sin(ySegment * PI);
// 球的顶点
sphereVertices.push_back(xPos);
sphereVertices.push_back(yPos);
sphereVertices.push_back(zPos);
}
}
}
```
得到球的顶点坐标后,再生成球的顶点索引,用来将数据绑定至缓冲。我把这部分代码封装为generateBallVerticles函数如下:
```cpp
void generateBallIndices(std::vector<int>& sphereIndices) {
for (int i = 0; i < Y_SEGMENTS; i++)
{
for (int j = 0; j < X_SEGMENTS; j++)
{
sphereIndices.push_back(i * (X_SEGMENTS + 1) + j);
sphereIndices.push_back((i + 1) * (X_SEGMENTS + 1) + j);
sphereIndices.push_back((i + 1) * (X_SEGMENTS + 1) + j + 1);
sphereIndices.push_back(i * (X_SEGMENTS + 1) + j);
sphereIndices.push_back((i + 1) * (X_SEGMENTS + 1) + j + 1);
sphereIndices.push_back(i * (X_SEGMENTS + 1) + j + 1);
}
}
}
```
调用glGenVertexArrays、glGenBuffers、glBindVertexArray、glBindBuffer等函数生成并绑定球体的VAO、VBO、EBO,对于VBO和EBO再调用glBufferData函数将顶点数据分别绑定至GL_ARRAY_BUFFER和GL_ELEMENT_ARRAY_BUFFER缓冲中。
然后使用glVertexAttribPointer和glEnableVertexAttribArray函数设置顶点属性指针。这里需要注意glVertexAttribPointer函数的6个参数,第一个是属性位置值location(这里会在着色器代码中用到),第二个是每个顶点需要读取的数值个数,第三个默认填GL_FLOAT,第四个默认填GL_FALSE,第五个是两个顶点数据之间的偏移量offset,第六个是从数组中读取顶点数据的开始位置。最后glEnableVertexAttribArray的参数注意和上面的属性位置值location保持一致。
着色器程序暂时复用示例代码,其他框架代码保持不变。
(5)处理变换
这里通过变换来绘制太阳、地球和月亮,实现他们的自转和公转。
① 创建观察矩阵、投影矩阵
观察矩阵可以使用vmath库中的vmath::lookat函数来实现:
```cpp
view = vmath::lookat(vmath::vec3(0.0, 3.0, 0.0), vmath::vec3(0.0, 0.0, -10.0), vmath::vec3(0.0, 1.0, 0.0));
```
有三个参数,其中的第一个参数是观察者(镜头)的坐标位置;第二个参数是被观察者(日地月系统)的坐标位置;第三个参数是观察者头顶的朝向方向。我这里设置为观察者头顶向上,在(0,0,3)的位置俯视位于(0,0,-10)的日地月系统。
投影矩阵可以使用vmath库中的
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
利用OpenGL框架,设计一个日地月运动模型动画。 (1)运动关系正确,相对速度合理,且地球绕太阳,月亮绕地球的轨道不能在一个平面内。 (2)地球绕太阳,月亮绕地球可以使用简单圆或者椭圆轨道。 (3)对球体纹理的处理,至少地球应该有纹理贴图。 (4)增加光照处理,光源设在太阳上面。 (5)为了提高太阳的显示效果,可以在侧后增加一个专门照射太阳的灯。
资源推荐
资源详情
资源评论
收起资源包目录
100013047-基于OpenGL框架实现的日地月运动模型动画.zip (81个子文件)
hustmaster
include
vmath.h 28KB
glad
glad.h 106KB
GLFW
glfw3native.h 16KB
glfw3.h 209KB
stb_image.h 245KB
KHR
khrplatform.h 10KB
HUST-ComputerGraphics-Lab.vcxproj 7KB
src
glad.c 58KB
main.cpp 13KB
HUST-ComputerGraphics-Lab.sln 1KB
LICENSE 1KB
references
14_shader
colors.fs 5KB
colors.vs 466B
light_cube.vs 195B
light_cube.fs 128B
11_Lighting_Materia.cpp 8KB
09_Multi_Texture.cpp 9KB
10_11_shader.h 6KB
tempbackup.cpp 10KB
05_Transformation.cpp 9KB
03_Multi_Draw.cpp 10KB
11_shader
colors.fs 1KB
colors.vs 376B
light_cube.vs 195B
light_cube.fs 128B
res
wall.jpg 251KB
face2.jpg 14KB
htmdb.png 2.82MB
container.jpg 181KB
container2.png 457KB
face.jpg 10KB
14_Lighting_Multi.cpp 14KB
10_Lighting_Base.cpp 8KB
12_Lighting_Pall.cpp 11KB
04_Sphere.cpp 9KB
13_shader
colors.fs 2KB
colors.vs 466B
light_cube.vs 195B
light_cube.fs 128B
13_Lighting_Point.cpp 12KB
10_11_camera.h 4KB
06_Texture_Square.cpp 8KB
02_Triangle.cpp 8KB
07_Texture_Image.cpp 8KB
12_shader
colors.fs 1KB
colors.vs 466B
light_cube.vs 195B
light_cube.fs 128B
01_First_Graphics.cpp 5KB
10_shader
colors.fs 880B
colors.vs 376B
light_cube.vs 195B
light_cube.fs 128B
08_Texture_Color.cpp 8KB
libs
glfw3.lib 904KB
res
rock.jpg 46KB
docs
10曲线曲面基础.pdf 1.66MB
09OpenGL初步01.pdf 746KB
2020计算机图形学报告模板.doc 38KB
07消隐.pdf 444KB
05图形变换.pdf 1.17MB
openGL实验环境配置.pdf 733KB
08光照处理.pdf 1.51MB
04基本图形生成.pdf 1.13MB
U201714501_CS1701_熊逸钦_图形学课程报告.docx 2.16MB
U201714501_CS1701_熊逸钦_图形学课程报告.pdf 726KB
09OpenGL变换和纹理.pdf 832KB
06观察变换.pdf 1007KB
03造型技术.pdf 2.02MB
02图形系统.pdf 857KB
01绪论.pdf 1.45MB
HUST-ComputerGraphics-Lab.vcxproj.filters 1019B
README.assets
wps1327.tmp.jpg 136KB
wps1329.tmp.jpg 27KB
wps133A.tmp.jpg 25KB
wps1328.tmp.jpg 137KB
wps133D.tmp.png 1.03MB
wps133B.tmp.jpg 22KB
wps133C.tmp.jpg 31KB
.gitignore 6KB
README.md 32KB
共 81 条
- 1
资源评论
- 一盏志野陶2023-11-17资源有很好的参考价值,总算找到了自己需要的资源啦。
- users100012023-11-09这个资源总结的也太全面了吧,内容详实,对我帮助很大。
- ฅ玖ฅ2023-12-17终于找到了超赞的宝藏资源,果断冲冲冲,支持!
- nivag99882023-11-09终于找到了超赞的宝藏资源,果断冲冲冲,支持!
- 2301_772167752023-11-22这个资源总结的也太全面了吧,内容详实,对我帮助很大。
神仙别闹
- 粉丝: 2667
- 资源: 7640
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功