基于openGL GLUT框架实现的3D模拟花园

Badgirl

发布日期: 2021-01-02 12:56:06 浏览量: 130
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1.项目概述

本项目使用OpenGL,VS2013实现了模拟花园,主要使用了glut,glaux两个库来简化代码实现,具体代码文件模块区分如下:

  • Backgroung.h/cpp:画面背景的绘制,包括草地,地形,围墙,天空

  • ChangeView.h/cpp:根据鼠标键盘操作更改用户视点

  • cout.h/cpp:控制台提示信息输出

  • Flower.h/cpp:花的数据类型,包括创建和绘制

  • Tree.h/cpp:树的数据类型,包括创建和绘制

  • Snow.h/cpp:雪的数据类型,包括创建和绘制

  • Snowground.h/cpp:雪在地面堆积的绘制

  • Mouse.h/cpp:鼠标操作

  • Keyboard.h/cpp:键盘操作

  • Save.h/cpp:存储和读取操作

  • GardenMain.cpp:主文件

2.功能概述

由于在配环境时,没有成功把GLUI配置进来,所以基本所有操作都通过键盘控制,在项目运行时会在控制台做操作提示。

  • 地形建模:地板上贴上草皮纹理,地形可通过鼠标左键单击进行编辑

  • 地形漫游:可以使用鼠标切换视角,键盘控制视角的旋转和移动,实现三维的视角移动

  • 花朵建模:可以创建花朵,修改花朵的参数,鼠标控制其位置

  • 树建模:可以创建树,修改树的参数,鼠标控制其位置

  • 存储:可以存储整个花园的状态并读取

  • 雪花特效:实现下雪特效,重力场和风场效果,雪的起停,积雪和融化,与树和花的碰撞检测及崩塌等

3.具体实现

3.1 地形存储和修改

通过高度图文件获取地形高度,鼠标单击时获取鼠标所指向的点,计算鼠标的位移程度对高度进行修改。

3.2 花与树的数据类型

花的数据类型采用了参数存储的方式,通过存储花的坐标位置,花的颜色,花茎长度,花瓣大小和数量等参数,在绘制时根据这些参数计算出花的模型并绘制。

树的数据类型也采用了参数存储的方式,存储了树的位置,高度,层数,半径等数据,绘制时利用参数计算得到树的模型。

花和树在创建时会呈现为半透明,同时在控制台中显示当前创建的花和树的状态信息,通过相应按键可以对其进行修改。鼠标控制创建的位置,单击后在鼠标位置绘制花或者树,同时半透明效果消失。

3.3 存储

文件存储功能为指定文件存储,即每次固定存储在一个文件。

在存储时,会使用二进制文件依次存储地形,花的数量,树的数量,每个花的参数,每个树的参数。读取时依次将相关资料读取出来。

3.4 雪花数据

雪花数据主要用三维坐标,三个方向的速度以及三个方向的加速度,雪花大小组成。在创建雪花时,雪花会随机在花园范围内的最高点产生,随机产生纵向速度及雪花大小。由于需要实现重力场,因此在初始时纵向有加速度,其他方向加速度为0。

在雪花绘制方面,原本想使用贴图显示,但是贴图后效果不佳。而后想用圆球代替,但是在使用圆球后整个绘制效率大大降低,画面出现严重的卡顿现象。因此最后采用绘制小方块的方式。

在雪花风场上,在开启风场后,会修改每个雪花在x和z轴的加速度值,从而修改雪花的横向速度。在风场关闭后,雪花x与z轴的速度会逐渐减小。

3.5 积雪的堆积和融化

积雪的显示我使用了在地面纹理上再绘制一层雪层的方式,雪层根据落到该点的雪花个数会有透明度的变化。

当一个雪花位置低于地面高度时,会把该点的雪花累积数+1,在绘制时其透明度会降低,从而变得更白。当雪花在某个点积累到一定数值后,会使用绘制立方体的方式是该点的雪花高度增大,表现出积雪效果。

在下雪停止后,雪地进入到融化状态,雪花累积数会逐渐减小,直至变为0。  

3.6 雪与树、花的碰撞检测

在碰撞检测上,由于临近考试没有过多的时间在细致实现,因此在碰撞检测上粗略地使用了2层检测的方式。

对于每个雪花来说,根据其坐标首先会与每棵树所组成的立方体范围(即包含整个树的最小立方体)进行比较,如果在立方体范围内,再将其与树的每一层做碰撞判断,如果发生碰撞则雪花停留在碰撞位置。对于花来说类似。

在雪花崩塌时,雪花会从原来的碰撞点落下,直至下一个碰撞点或落到地面为止。

4.程序展示

初始界面

旋转移动

旋转移动

旋转移动

5.总结

这学期是第一次接触OpenGL,应该说整个作业过程还是比较有趣的。在第一次迭代时,对OpenGL还不是很熟悉,因此第一次迭代中大量参考了网上的代码。而在第二次迭代中,由于对OpenGL更加熟悉,所以在第二次迭代中没有复用网上的代码,全部自己设计实现。

上传的附件 cloud_download 基于openGL GLUT框架实现的3D模拟花园.7z ( 6.46mb, 2次下载 )
error_outline 下载需要10点积分

发送私信

大概没去过的地方都叫远方

13
文章数
15
评论数
最近文章
eject