emmm,一不小心就半年没更了,最近翻到了本科毕设,挺有感触的,就拿出来写写。

Tip0: 代码写的时间过长,本文很少很少的细节地方与代码对不上,见谅。

Tip1: 要是拿了我的代码,留下个评论,点个赞可好。

程序源代码链接:https://pan.baidu.com/s/1hxCGDYFz0ubAEhPCj_3xuA 提取码:zv9o 

编译环境:Qt5.9.4

编译器:Desktop Qt5.9.4 MSVC2017 64bit

IDE:QtCreator

显卡:Nvida

一. 程序简介

    可对常见的单子叶类盆栽植物,如吊兰,君子兰等进行三维建模,利用手绘系统简单对单支枝叶的曲线造型做近似的模拟。同时建立简单的天气系统,创造盆栽在刮风,下雨天气下的形态变化动画。

图1 (a)吊兰

图1 (c)虎皮兰

图1 (b)君子兰

图2 (a)风动动画

图2 (b)雨天

二. 模块分解

2.1 渲染

    渲染模块使用之前教程提供的技术,都是很基础的技术:

  1.  Blinn- Phong 光照模型
  2.  法线贴图 Normal Mapping 
  3. 阴影映射 shadow Mapping (使用GLSL 原生函数)

2.2 枝叶建模

     使用在矩形网格上附加透明纹理的方式生成枝叶,如图3所示,通过依次弯曲小矩形的形式可以构造枝叶的弯曲造型。

图3 三角剖分化的矩形网格

    吊兰所用透明纹理与法线贴图如下所示,图4(c)为应用法线贴图之后的效果。

图4 (a)吊兰纹理

图4 (b)吊兰法线贴图

图4 (c)应用法线贴图

2.3 花盆建模

用之前教程提过的,导入一个obj花盆模型

图5 花盆

2.4 手绘系统

  枝叶的弯曲主要由网格的弯曲实现,利用矩阵与网格坐标相乘,可以在局部坐标系种改变顶点的位置。如图6,使用矩阵Model0与v0,v1相乘,改变两个顶点位置。可以简单定义Model0是绕x轴正向旋转5度的旋转矩阵,则相乘后v0与v1两顶点的空间坐标同样绕x轴正向旋转5度。为保证网格弯曲的平滑性,Model1与Model2等其余旋转矩阵可由上一个矩阵迭代生成。如在Model0矩阵的基础上,再绕x轴旋转5度,生成Model1矩阵。

图6 迭代矩阵与坐标相乘

    手绘系统基于此思想,通过绘出的轮廓线条,计算所需迭代旋转矩阵数组中所有矩阵的旋转角度。为生成的枝叶弯曲的更加平滑,使用六次贝塞尔曲线对手绘线条进行曲线拟合,贝塞尔曲线控制点从手绘的线条种按点的密集程度进行筛选。如图7,黑色为手绘线条,红色为六次贝塞尔曲线控制点,蓝色为拟合后的曲线。将蓝色曲线均分为30个点,通过这些点计算旋转矩阵所需的角度,使用相邻两点在x与y坐标上的差值计算角的大小,则为一个旋转角度,图7 (b)为应用旋转矩阵之后的弯曲网格造型。

图7 (a)贝塞尔曲线拟合

图7 (b)弯曲网格

   简单绘制两线条,生成枝叶模型如下图所示。

   Tip2: 这里在应用法线贴图时有一个错误,因为法线贴图里的法线针对的是平面不弯曲网格。这里我将网格弯曲后,原则上应对法线贴图的相应部分做同样的弯曲,我当初试了几次,应该算错了,一直没改。

图8 手绘枝叶

2.5 其余功能

  2.5.1 均匀分配枝叶

我每使用鼠标左键,以根部为起始方向,向左或向右绘出一条线条,在场景的YOZ平面,会进行相同方向的建模。如图9(b)所示。在绘出所有枝叶后,点击“移动”按钮,会将枝叶平均分配到花盆的四周,原理很简单,用360度除以枝叶的数量,得到枝叶的平均旋转角度,在此基础上,增加一些随机角度,则得到每枝枝叶的最终旋转角度。

图9 (a)手绘系统与场景的联系 

图9 (b)枝叶平行于一个平面

图9 (c)枝叶分配到四周

 2.5.2 增添枝叶

    如果要设计一盆有几百枝枝叶的盆栽,将其全画出来,是一件很愚蠢的事,手动狗头。

   如图10,简单画6个线条,设置“增补数量“为24,点击“计算”,则枝叶数量会扩充至24枝。原理是记录手绘线条的每组贝塞尔控制点,在这些控制点的坐标参数上增添微小随机量,得到一组新的控制点,生成新的贝塞尔曲线,从而得到一条新的枝叶模型。

图10 (a)简单绘图

图10 (b)扩充枝条

图10 (c)移动枝条

2.6 天气系统

    Tip3: 天气系统,当初写这个就是个噱头,忽悠老师的,没用物理参数,较真的哥们可以跳过。

    天气系统分为两个,风动与下雨。下雨很简单,粒子系统做雨滴就完事了,没有参考价值。

    风动是在做“平均分配枝叶位置”那得到的灵感,在移动的基础上,再增加一个绕x轴旋转的角度,将这个角度做成连续的,则动画就做出来了。这里我用组成贝塞尔曲线的30个绿色小点,点点之间在y值之上的差值,作为变换角度的参考。制作30个角度,作为动画演示之用。

图11 (a)风动

图11 (b)下雨

基于OpenGL与手绘系统的盆栽植物生成及其风动动画相关推荐

  1. 基于mAppWidget实现手绘地图(八)–获取用户地理位置

    你有两种方式确定用户的当前位置: 使用安卓标准方式 使用MapWidget的监听器 标准方式: 使用以下代码: LocationManager locManager = (LocationManage ...

  2. 基于mAppWidget实现手绘地图(十五)–如何控制放大缩小

    一般来说,可以使用以下几种方式来控制地图的放大/缩小 : 使用控件底部的缩放按钮 双击控件 pinch手势 物理按键 :I键标识缩小 :O键表示放大.(只有设备具有物理按键才行) 当然,你也可以使用自 ...

  3. opengl碗状_一种基于OPENGL的车载环视多视角全景生成方法专利_专利查询 - 天眼查...

    1. 一种基于OPENGL的车载环视多视角全景生成方法,其特征在于,所述方法包括: (1) 铺设标定布于车辆四周,测量并记录标定布上各特征点在世界坐标系中的三维坐 标: (2) 手动选取或自动检测图像 ...

  4. Android基于mAppWidget实现手绘地图(一)--简介

    http://lemberg.github.io/mappwidget/user_guide.html 最近在看一些导游类应用,发现一些景区的导览图使用的完全是自定义地图,也就是手绘地图.这种小范围使 ...

  5. 基于mappwidget的手绘地图

    前段时间由于公司项目需要使用地图功能,刚开始看到功能需求的时候,以为只是简单简单的定位和基础地图的展示,于是就决定使用比较常用的百度地图,或者高德地图.项目启动之后,就开始接入百度地图的SDK开始做开 ...

  6. 深度学习数据驱动_利用深度学习实现手绘数据可视化的生成

    前一段时间,我开发了Sketchify, 该工具可以把任何以SVG为渲染技术的可视化转化为手绘风格.(参考手绘风格的数据可视化实现 Sketchify) 那么问题来了,很多的chart是以Canvas ...

  7. 利用深度学习实现手绘数据可视化的生成

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 前一段时间,我开发了Sketchify, 该工具可以把任何以SVG为渲染技术的可视化转化为手绘风格.(参考手绘风格的数据可视化实现 ...

  8. 实战技术:利用深度学习实现手绘数据可视化的生成

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 前一段时间,我开发了Sketchify, 该工具可以把任何以SVG为渲染技术的可视化转化为手绘风格.(参考手绘风格的数据可视化实现 ...

  9. Android基于mAppWidget实现手绘地图(四)--如何附加javadoc

    如何把javadoc添加到代码库中? How to attach javadoc to the library? 项目属性-->Java Build Path-->Libraries.选择 ...

最新文章

  1. 一文搞定深度学习建模预测全流程(Python)
  2. shell脚本中获取当前所在目录地址
  3. perl数组硬引用_perl引用和数组 - SibylY的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. java计算圆锥体积_六年级:美妙数学之“球的体积计算”(0430六)
  5. bzoj2957 奥妙重重的线段树
  6. C#集合类型——Array、ArrayList、List 之浅谈
  7. 算法设计与分析———动态规划———最大子段和
  8. python如何在所有线程结束后执行最后操作_Python线程的生命周期
  9. 实时计算框架:Spark集群搭建与入门案例
  10. ros melodic学习之plugin
  11. 计算机考试PPT2003好考吗,2014年职称计算机考试PowerPoint2003基本操作试题
  12. python 清华教程_清华推出 1564集Java Python视频教程,别再说找不到适合的教程了...
  13. 1.3《数据库系统概论》之数据库系统结构和组成(内模式、模式、外模式、人员……)
  14. 大白菜备份还原linux,大白菜pe手动gho镜像还原,大白菜制作ghost镜像
  15. 机器人彩铅画_儿童画教程:教你画机器人
  16. 支持度、置信度和提升度
  17. 【C#】KPM算法解决字符串匹配问题
  18. SPA 的 SEO 方案对比、最终实践
  19. Android图片格式转换为JPG
  20. 用audition让声音更加好听

热门文章

  1. 荣耀鸿蒙系统手机更新名单,华为鸿蒙系统开放升级,荣耀手机公布名单,18款领衔更新...
  2. 通用triggerEvent方法
  3. 一秒学完团课教程(PC端和IOS端)
  4. word2003应用基础
  5. Homebrew 安装使用说明
  6. Chinajoy现场看点直播 猪厂的厂花逗比范 第五人格手办辣眼睛还想带回家
  7. 使用libjpeg-turbo库中的TurboJPEG API实现图片解压,缩放及压缩功能
  8. Laravel 预防 SQL 注入
  9. 华为OD机试题 - 单核CPU任务调度、任务调度本(JavaScript)| 含思路
  10. 使用POI读写微软文件