[Graphics]自组织植物建模方法(Continous&Lasso&Brush)

最近做了一个小程序,顺便用在了国科大“智能人机交互”课程(2018秋学期)的作业里。主要就是用self-organizing tree modeling和sketch的手段合起来做的程序。

用来实现自组织的植物建模。所谓的自组织,主要是指芽Bud对空间Space、资源Resource的争夺,前者实现了Branch在空间中进行自发生长,后者则用以模拟植物的顶端优势。在正文开始之前,还是惯例介绍一下这次做的结果~

一、相关资源和信息:

开发环境:C++/OpenGL

B站视频:https://www.bilibili.com/video/av42213837/

演示程序:https://pan.baidu.com/s/1swjQqXv

二、程序的部分效果截图:

本程序基于自组织的植物建模方法,开发了三种创建模式,分别是:套索、自生长、刷子。其效果分别如下所示:

1. 使用套索Lasso

2. 自组织生长的植物

自组织生成的不同形态的植物模型
自组织生成的不同形态的植物模型

 

不同形态的植物模型
自组织生成的植物模型

 

3. 使用刷子创建植物模型

刷子对植物进行形状编辑

三、算法流程

接下来的部分将对本程序的核心思路进行描述。假设读者已经具备一定的图形学知识,这里就简单介绍一下self-organizing modeling的部分,其他sketch部分就不介绍了。

1. 基本数据结构的定义:

InterNode:树木的一段枝干,由两个坐标点描述,位于两点之间的线段即一小段枝干,是植物模型的最小分割单元。

芽Bud:每个Bud可生长出一个Metamer,每个Metamer由若干InterNode组成。Bud分为顶芽Terminal Bud侧芽Lateral Bud

2. Space Colonization空间殖民方法指导的自组织生长

为了表示可供植物生长的空间,我们用一个点集表示。这些点均匀的分布在三维空间中,我们可称之为Marker Points

每次迭代过程中,需分析现存的每个芽Bud。对于每个Bud,使用如下图所示的探测锥来对空间进行探索,其中半径为r的球形空间是bud的独有空间;半径为d+r的锥形空间为探测区域,落于其中的Marker Points描述了Bud的生长方向。在每轮迭代过程中,首先将每个Bud的独有球形空间内的Marker Points删除,接着计算Bud到位于锥形空间内的所有Marker Points的平均方向v(描述新生的Metamer的生长方向),生长结束后,删除位于锥形空间内的Marker Points。

Bud的探测椎

3. 顶端优势

顶端优势在整个建模过程中,并非是必须的步骤,但是使用顶端优势能够丰富植物模型的种类。本程序采用的顶端优势过程分为两个过程:自顶向下的积累资源、自下向上的分配资源。

(1)自顶向下的积累资源:

假设每个芽Bud接收的光照均为1.0,然后我们从上往下逐层积累光照资源,如上图左所示,每个InterNode中积累的资源是其子InterNode资源的总和,不断向下计算直到根节点位置。此时,假设根节点积累的光量资源为Q。

(2)自下向上的分配资源:

这里对根节点的资源翻倍,即根节点的待分配资源v为根节点积累的资源Q的2倍:v = 2Q。然后从下向上分配资源,因此为了描述顶端优势,我们引入参数λ(λ介于0~1之间):其中λv表示分配到顶芽的资源,(1-λ)v表示分配到侧芽的资源。因此若λ<0.5,则侧芽生长旺盛,顶芽受到抑制;若λ>0.5,则顶芽生长旺盛,侧芽受到抑制。我们可以让每个InterNode获得的资源表示该枝段的长度,以表达其顶端优势控制的效果。

使用顶端优势的几种不同结果如下图所示:

 

©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页