基于OpenGL与手绘系统的盆栽植物生成及其风动动画
emmm,一不小心就半年没更了,最近翻到了本科毕设,挺有感触的,就拿出来写写。
Tip0: 代码写的时间过长,本文很少很少的细节地方与代码对不上,见谅。
Tip1: 要是拿了我的代码,留下个评论,点个赞可好。
程序源代码链接:https://pan.baidu.com/s/1hxCGDYFz0ubAEhPCj_3xuA 提取码:zv9o
编译环境:Qt5.9.4
编译器:Desktop Qt5.9.4 MSVC2017 64bit
IDE:QtCreator
显卡:Nvida
一. 程序简介
可对常见的单子叶类盆栽植物,如吊兰,君子兰等进行三维建模,利用手绘系统简单对单支枝叶的曲线造型做近似的模拟。同时建立简单的天气系统,创造盆栽在刮风,下雨天气下的形态变化动画。
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
二. 模块分解
2.1 渲染
渲染模块使用之前教程提供的技术,都是很基础的技术:
- Blinn- Phong 光照模型
- 法线贴图 Normal Mapping
- 阴影映射 shadow Mapping (使用GLSL 原生函数)
2.2 枝叶建模
使用在矩形网格上附加透明纹理的方式生成枝叶,如图3所示,通过依次弯曲小矩形的形式可以构造枝叶的弯曲造型。
![](/assets/blank.gif)
吊兰所用透明纹理与法线贴图如下所示,图4(c)为应用法线贴图之后的效果。
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
2.3 花盆建模
用之前教程提过的,导入一个obj花盆模型
![](/assets/blank.gif)
2.4 手绘系统
枝叶的弯曲主要由网格的弯曲实现,利用矩阵与网格坐标相乘,可以在局部坐标系种改变顶点的位置。如图6,使用矩阵Model0与v0,v1相乘,改变两个顶点位置。可以简单定义Model0是绕x轴正向旋转5度的旋转矩阵,则相乘后v0与v1两顶点的空间坐标同样绕x轴正向旋转5度。为保证网格弯曲的平滑性,Model1与Model2等其余旋转矩阵可由上一个矩阵迭代生成。如在Model0矩阵的基础上,再绕x轴旋转5度,生成Model1矩阵。
![](/assets/blank.gif)
手绘系统基于此思想,通过绘出的轮廓线条,计算所需迭代旋转矩阵数组中所有矩阵的旋转角度。为生成的枝叶弯曲的更加平滑,使用六次贝塞尔曲线对手绘线条进行曲线拟合,贝塞尔曲线控制点从手绘的线条种按点的密集程度进行筛选。如图7,黑色为手绘线条,红色为六次贝塞尔曲线控制点,蓝色为拟合后的曲线。将蓝色曲线均分为30个点,通过这些点计算旋转矩阵所需的角度,使用相邻两点在x与y坐标上的差值计算角的大小,
,
则为一个旋转角度,图7 (b)为应用旋转矩阵之后的弯曲网格造型。
![](/assets/blank.gif)
![](/assets/blank.gif)
简单绘制两线条,生成枝叶模型如下图所示。
Tip2: 这里在应用法线贴图时有一个错误,因为法线贴图里的法线针对的是平面不弯曲网格。这里我将网格弯曲后,原则上应对法线贴图的相应部分做同样的弯曲,我当初试了几次,应该算错了,一直没改。
![](/assets/blank.gif)
2.5 其余功能
2.5.1 均匀分配枝叶
我每使用鼠标左键,以根部为起始方向,向左或向右绘出一条线条,在场景的YOZ平面,会进行相同方向的建模。如图9(b)所示。在绘出所有枝叶后,点击“移动”按钮,会将枝叶平均分配到花盆的四周,原理很简单,用360度除以枝叶的数量,得到枝叶的平均旋转角度,在此基础上,增加一些随机角度,则得到每枝枝叶的最终旋转角度。
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
2.5.2 增添枝叶
如果要设计一盆有几百枝枝叶的盆栽,将其全画出来,是一件很愚蠢的事,手动狗头。
如图10,简单画6个线条,设置“增补数量“为24,点击“计算”,则枝叶数量会扩充至24枝。原理是记录手绘线条的每组贝塞尔控制点,在这些控制点的坐标参数上增添微小随机量,得到一组新的控制点,生成新的贝塞尔曲线,从而得到一条新的枝叶模型。
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
2.6 天气系统
Tip3: 天气系统,当初写这个就是个噱头,忽悠老师的,没用物理参数,较真的哥们可以跳过。
天气系统分为两个,风动与下雨。下雨很简单,粒子系统做雨滴就完事了,没有参考价值。
风动是在做“平均分配枝叶位置”那得到的灵感,在移动的基础上,再增加一个绕x轴旋转的角度,将这个角度做成连续的,则动画就做出来了。这里我用组成贝塞尔曲线的30个绿色小点,点点之间在y值之上的差值,作为变换角度的参考。制作30个角度,作为动画演示之用。
![](/assets/blank.gif)
![](/assets/blank.gif)
基于OpenGL与手绘系统的盆栽植物生成及其风动动画相关推荐
- 基于mAppWidget实现手绘地图(八)–获取用户地理位置
你有两种方式确定用户的当前位置: 使用安卓标准方式 使用MapWidget的监听器 标准方式: 使用以下代码: LocationManager locManager = (LocationManage ...
- 基于mAppWidget实现手绘地图(十五)–如何控制放大缩小
一般来说,可以使用以下几种方式来控制地图的放大/缩小 : 使用控件底部的缩放按钮 双击控件 pinch手势 物理按键 :I键标识缩小 :O键表示放大.(只有设备具有物理按键才行) 当然,你也可以使用自 ...
- opengl碗状_一种基于OPENGL的车载环视多视角全景生成方法专利_专利查询 - 天眼查...
1. 一种基于OPENGL的车载环视多视角全景生成方法,其特征在于,所述方法包括: (1) 铺设标定布于车辆四周,测量并记录标定布上各特征点在世界坐标系中的三维坐 标: (2) 手动选取或自动检测图像 ...
- Android基于mAppWidget实现手绘地图(一)--简介
http://lemberg.github.io/mappwidget/user_guide.html 最近在看一些导游类应用,发现一些景区的导览图使用的完全是自定义地图,也就是手绘地图.这种小范围使 ...
- 基于mappwidget的手绘地图
前段时间由于公司项目需要使用地图功能,刚开始看到功能需求的时候,以为只是简单简单的定位和基础地图的展示,于是就决定使用比较常用的百度地图,或者高德地图.项目启动之后,就开始接入百度地图的SDK开始做开 ...
- 深度学习数据驱动_利用深度学习实现手绘数据可视化的生成
前一段时间,我开发了Sketchify, 该工具可以把任何以SVG为渲染技术的可视化转化为手绘风格.(参考手绘风格的数据可视化实现 Sketchify) 那么问题来了,很多的chart是以Canvas ...
- 利用深度学习实现手绘数据可视化的生成
个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 前一段时间,我开发了Sketchify, 该工具可以把任何以SVG为渲染技术的可视化转化为手绘风格.(参考手绘风格的数据可视化实现 ...
- 实战技术:利用深度学习实现手绘数据可视化的生成
个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 前一段时间,我开发了Sketchify, 该工具可以把任何以SVG为渲染技术的可视化转化为手绘风格.(参考手绘风格的数据可视化实现 ...
- Android基于mAppWidget实现手绘地图(四)--如何附加javadoc
如何把javadoc添加到代码库中? How to attach javadoc to the library? 项目属性-->Java Build Path-->Libraries.选择 ...
最新文章
- 一文搞定深度学习建模预测全流程(Python)
- shell脚本中获取当前所在目录地址
- perl数组硬引用_perl引用和数组 - SibylY的个人空间 - OSCHINA - 中文开源技术交流社区...
- java计算圆锥体积_六年级:美妙数学之“球的体积计算”(0430六)
- bzoj2957 奥妙重重的线段树
- C#集合类型——Array、ArrayList、List 之浅谈
- 算法设计与分析———动态规划———最大子段和
- python如何在所有线程结束后执行最后操作_Python线程的生命周期
- 实时计算框架:Spark集群搭建与入门案例
- ros melodic学习之plugin
- 计算机考试PPT2003好考吗,2014年职称计算机考试PowerPoint2003基本操作试题
- python 清华教程_清华推出 1564集Java Python视频教程,别再说找不到适合的教程了...
- 1.3《数据库系统概论》之数据库系统结构和组成(内模式、模式、外模式、人员……)
- 大白菜备份还原linux,大白菜pe手动gho镜像还原,大白菜制作ghost镜像
- 机器人彩铅画_儿童画教程:教你画机器人
- 支持度、置信度和提升度
- 【C#】KPM算法解决字符串匹配问题
- SPA 的 SEO 方案对比、最终实践
- Android图片格式转换为JPG
- 用audition让声音更加好听