计算机图形学期末大作业 虚拟场景搭建+层次建模移动

肝了两个星期,天空盒还是挺难实现的,还有各自奇奇怪怪的bug,以及层次建模需要的obj...

这个期末大作业主要是结合了以往的实验和参考了LearnOpenGl 和一些大佬的优秀作品:

计算机图形学 使用OpenGL的场景建模_opengl建模_晴夏。的博客-CSDN博客

南邮 | 计算机图形学大作业:Skybox + Shadow volume_Wonz的博客-CSDN博客

深大计算机图形学大作业之虚拟场景建模_AkagiSenpai的博客-CSDN博客

深圳大学计算机图形学期末大作业——OpenGL glfw库实现简单的Minecraft游戏_Anakin Skywalker RM 00的博客-CSDN博客(如要侵删联系)

演示视频:链接:https://pan.baidu.com/s/1mqT3yrhY31AeCXD-c81iUQ?pwd=1234 
提取码:1234 

  • 具体实验内容和要求

参考实验2.3,实现物体的变换,允许用户通过键盘或者鼠标实现场景中至少两个物体的控制(移动,旋转,缩放等等)。

参考实验3.1,完成相机变换。

通过交互控制物体

参考实验3.3和实验3.4,实现光照效果、材质、阴影等。

用户交互实现视角切换完成对场景的任意角度浏览

参考实验4.1,为场景中至少两个主要物体添加纹理贴图 。

添加光照、材质、阴影效果

学生可以通过层级建模( 实验补充1和2)的方式建立多个虚拟物体,由多个虚拟物体组成一个虚拟场景,要求在程序中显示该虚拟场景,场景可以是室内或者室外场景;场景应包含地面。

添加纹理 方块/棋盘格的渲染和方块向下移动

虚拟场景:

  1. 立方体贴图-天空盒实现

(天空盒是参考:LearnOpenGL - Cubemaps

首先讲一下天空盒的原理,立方体贴图是一种纹理,包含6个单独的2D纹理,每个纹理形成立方体的一侧:纹理立方体,假设我们有一个1x1x1单位立方体,方向向量的原点位于其中心。使用橙色方向向量从立方体贴图中采样纹理值看起来有点像这样:

因为立方体贴图包含6个纹理,每个面一个纹理,所以我们必须调用 glTex图像2D六次,具体如下图展示:

归根结底可以理解天空盒就是一将一个立方体的 6 个面贴上对应的纹理,然后用这个立方体将相机包裹住,如果你将这六个面折叠成一个立方体,你会得到一个完全有纹理的立方体来模拟一个巨大的空间世界,示例图如下:

下面给出创建立方体贴图的具体实现函数loadCubemap(vector<std::string> faces)

然后我们将按照枚举的顺序在向量中加载适当的纹理路径: (下面是三种不同的贴图) 我们把天空盒作为立方体地图加载CubeMapTexture我们现在终于可以将它绑定到一个立方体上:

立方体顶点着色器

因为天盒是在立方体上绘制的,所以我们需要另一个VAO、VBO和一组新的顶点,用于纹理3D立方体的立方体贴图可以使用立方体局部位置作为其纹理坐标进行采样。当立方体以原点(0,0,0)为中心时,其每个位置向量也是来自原点的方向向量。这个方向向量正是我们在特定立方体位置获得相应纹理值所需要的。因此,我们只需要提供位置向量,而不需要纹理坐标,所以顶点着色器:

立方体贴图着色器

因为立方体贴图直接利用立方体的坐标作为方向向量进行纹理采样,而无需纹理坐标,于是我们的着色器发生了一些变换。我们最好利用一组新的着色器来管理这些特殊情况。我们创建 skybox 系列着色器。其中顶点着色器仍然负责完成 mvp 变换,值得注意的是,我们直接将变换后的坐标作为采样的方向向量,传递到片元着色器中:

         

除此之外,我们需要另外绘制出立方体的各个顶点:

然后再创建并编译shader,和调用天空盒所存储的VAO数据:

着色器的配置:

就像被一个真实的世界包围一样,随着鼠标的移动,视线也随着移动,最后效果如下:

然后为了实现更好的动态背景,简单意思就是让天空盒动起来,仿佛世界是在运动的,我在这里通过TIME和特定的转动角度,从而使天空盒看起来是在运动的;

代码实现原理是在渲染的同时,也让天空盒以不同的角度移动;

下面先提前构建了物体和地面来查看移动的差别:

可以看到在大概同样的位置,天空盒是在相对移动的

(前提是天空盒贴图纹理是那种纯天空的,否则效果看起来就像单纯把图片放大缩小一样)

 

层次建模

这是最常见的建模模型构图:

这里我构建了以下的模型大致框架:

大概代码实现参照了实验4.2机械臂和4.3机器人,如下面展示:

然后这里再参照实验3和实验4.3,构建了一个矩阵栈

接下来,使用TriMesh数组,对层级建模的每一个物体进行绑定,并且在此定义object准备绑定。

在init函数当中,对所有的层级建模物体进行初始化。

首先是定义Man中的TriMesh,对其进行初始化,然后进行对文件的读取,最后将文件与物体进行一个绑定。

在display函数中,是对物体进行拼接的地方,在此我写了一个drawMulMesh函数,将物体进行拼接。

首先渲染身体,这是机器人的中心部分。

首先,modelMatrix代表了这个身体物体的变换矩阵,可以通过这个改变ModelMatrix来改变身体部件。

接下来的body函数是在原本modelMatrix的基础上,对身体进行一个变换。然后将物体调用painter的drawMesh进行渲染。

再将本身身体的modelMatrix放入栈中,方便返回。然后对头部进行设计。

在此是设置头部与身体处的连接位置,也就是若要进行旋转,则在该位置进行旋转,并且通过rorate函数进行旋转。然后再到head函数当中,设置关节节点与物体的位置,使得完美的契合。

设置完毕头部后,因为头部下面没有任何的部位了,所以此时将modelMatrix恢复成身体的样式,再进行接下来操作。

接下来的操作与上述大体相同,当某个部位下方没有任何部位后,则将栈中的变换矩阵返回,再进行后续操作。这样子通过栈可以实现层级建模。最终效果如下:

嘎嘎因为不会建模,随便在网上搜刮了的obj,最后勉强a+

最终效果如下: 

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机图形学作业题 1. 计算机中由图形的形状参数(方程或分析表达式的系数,线段的端点坐标等)加属性参数 (颜色、线型等)来表示图形图形的参数表示;枚举出图形中所有的点称图形的点阵 表示,简称为图像(数字图像) 2. 什么是计算机图形学计算机图形学有哪些研究内容? 3. 计算机图形学有哪些应用领域? 4. 计算机图形学有哪些相关学科分支?它们的相互关系是怎样的? 5. 图形系统的软件系统由哪些软件组成?举例说明。 6. 了解计算机图形系统的硬件。 7. 什么是显示器的分辨率、纵横比、刷新率? 8. 什么是像素、分辨率、颜色数?分辨率、颜色数与显存的关系? 分辨率M(N、颜色个数K与显存大小V的关系: 例:分辨率为1024像素/行(768行/帧,每像素24位(bit)颜色(224种颜色)的显示 器,所需的显存为:1024(768(24位(bit)=1024(768(24/8=2359296字节(byte)。 或:每像素16777216种颜色(24位真彩色),1024(768的分辨率,所需显存为:102 4(768(log216777216位显存=2359296字节显存。 9. 什么是图元的生成?分别列举两种直线和圆扫描转换算法。 10. OpenGL由核心库GL(Graphics Library)和实用函数库GLU(Graphics Library Utilities)两个库组成。 11. 区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩 展到区域内的其它点。 区域可分为 向连通区域和 向连通区域。区域填充算法有 填充算法和 填充算法。 12. 字符生成有哪两种方式? 点阵式(bitmap fonts点阵字——raster光栅方法):采用逐位映射的方式得到字符的点阵和编码——字模位 点阵。 笔画式(outline fonts笔画字——stroke方法):将字符笔画分解为线段,以线段端点坐标为字符字模的编 码。 13. 图形信息包含图形的 和 。 14. 什么是图形变换?图形变换只改变图形的 不改变图形的 。图形变换包括 和 ( )。 15. 熟练掌握二维图形的齐次坐标表示、平移、比例、旋转、对称变换以及复合变换的方 法和原则。 16. 图形的几何变换包括 、 、 、 、 ;图形连续作一次以上的几何变换称 变换。 17. 试写出图示多边形绕点A(xo,yo)旋转的变换矩阵。要求写出求解过程及结果。 18. 试写出针对固定参考点、任意方向的比例变换矩阵。 19. 试写出对任意直线y=mx+b的对称变换矩阵。 20. 什么是窗口?什么是视区?什么是观察变换? 21. 简述二维观察变换的流程。 22. 试述窗口到视区的变换步骤,并推出变换矩阵。 23. 已知w1=10,w2=20,w3=40,w4=80, v1=80,v2=110,v3=10,v4=130, 窗口中一点P(15,60),求视区中的映射点P'? 24. 在观察变换前必须确定图形的哪部分在窗口内,那些部分在窗口外,这个选择处理过 程称为 。 25. 使用Open GL的变换函数,若程序中先后调用的几个变换函数所定义的矩阵及顺序为L, M, N,其作用顺序为: 。 26. 试列举你所知的直线和多边形裁剪算法。 27. 简述Cohen-Sutherland(代码)线段裁剪算法。 28. 窗口和多边形如下图,应用Sutherland- Hodgman算法(逐边裁剪算法),对多边形进行裁剪。请以左、上、右、下的顺序列出 窗口各边裁剪多边形后所得的多边形顶点表。 29. 任何满足欧拉公式的形体称为 形体。 30. 超二次曲面通过将额外的参数插入 曲面方程而形成。 31. 在曲线、曲面的表示上,参数方程有何优点? 32. 要变换参数曲线曲面可以直接变换它的 ,而对于非参数形式则必须变换 。 33. 欧几里得曲线是 物体,沿三维曲线路径的位置可用 参数描述。 34. 规格化参变量 t [0, 1] 使得曲线曲面的 容易确定。 35. 什么是插值?什么是逼近?什么是拟合? 36. 给定一组有序的数据点 Pi ,i =0, 1, …, n,称为控制点,构造一条曲线顺序通过每个控制点,称为对这组控制点进行 ,所构造的曲线称为 。 37. 构造一条曲线使之在某种意义下最接近给定的数据点,而不要求通过其中任何一个点 ,称为对这些数据点进行 ,所构造的曲线为 曲线。 38. 拟合(Fitting)是 和 的统称。 39. 对于一组有序的型值点,确定一种参数分割,称之对这组型值点 。确定某个单参数矢函数,即确定参数曲线方程,称为曲线的 。 40. 参数域中所有节点构成的序列称为 矢量。 41. 什么是参数化?什么是参数区间的规格化? 42. 什么是参数连续性? 二条曲线P
实验一 OpenGL+GLUT开发平台搭建 5 小实验1: 开发环境设置 5 小实验2: 控制窗口位置和大小 6 小实验3:默认的可视化范围 6 小实验4:自定义可视化范围 7 小实验5: 几何对象变形的原因 8 小实验6: 视口坐标系及视口定义 8 小实验7:动态调整长宽比例,保证几何对象不变形 9 实验二 动画和交互 10 小实验1: 单缓冲动画技术 10 小实验2: 双缓冲动画技术 11 小实验3:键盘控制 13 小实验4:鼠标控制【试着单击鼠标左键或者右键,试着按下鼠标左键后再移动】 14 实验三 几何变换、观察变换、三维对象 16 小实验1:二维几何变换 16 小实验2:建模观察(MODELVIEW)矩阵堆栈 17 小实验3:正平行投影1 19 小实验4:正平行投影2 19 小实验5:正平行投影3 20 小实验6:透射投影1 21 小实验6:透射投影2 22 小实验7:三维对象 24 实验四 光照模型和纹理映射 26 小实验1:光照模型1----OpenGL简单光照效果的关键步骤。 26 小实验2:光照模型2----光源位置的问题 28 小实验3:光照模型3----光源位置的问题 31 小实验4:光照模型4----光源位置的问题 33 小实验5:光照模型5----光源位置的问题 35 小实验6:光照模型6----光源位置的问题 38 小实验7:光照模型7----光源位置的动态变化 40 小实验8:光照模型8----光源位置的动态变化 43 小实验9:光照模型9---光源位置的动态变化 45 小实验10:光照模型10---聚光灯效果模拟 48 小实验11:光照模型11---多光源效果模拟 50 小实验12:光照效果和雾效果的结合 53 小实验13:纹理映射初步—掌握OpenGL纹理映射的一般步骤 56 小实验13:纹理映射—纹理坐标的自动生成(基于参数的曲面映射) 59 小实验14:纹理映射—纹理坐标的自动生成(基于参考面距离) 61

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值