本文主要是介绍第064封“情书”:荆棘岭Kitbash Vein Growth Part 2<Entagma>Houdini 2018,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
█ 这就是我的人间。荆棘遍地!陷阱重重。
— 每天翻译一篇教程,这就是我写给houdini的情书。
█世界荣誉的桂冠,都用荆棘编织而成。
前言不搭后语:
漫漫人生路永远充满挑战,棘手的问题层出不穷,
只有信念和坚忍才能逼退人生路上布满的荆棘,走出康庄大道。
今天这节内容:
光秃秃的线上如何分叉,发芽长出荆棘。
▉今天是42岁第038天周日
这是写给houdini的
第064封“情书”
我是geo流程图
@pscale = 1; |
//----均匀的分布curveu---- //-- 1 所有点 int pntcnt = npoints(0); //-- 2 因子 float frac = 1.0/float(pntcnt-1); //-- 3 新curveu @curveu = @ptnum*frac; |
#include <groom.h> //-- 1 growth:主干的生长,复制关联second U float growth = ch("growth"); //-- 2 长度:主干 float masterlength = prim(1, "perimeter", 0); //-- 3 百分比因子 float frac = 1.0/masterlength; //-- 4 分叉的生长动画 ,通过映射主干的动画,通过frac把主干与分支联系起来 growth = fit(growth, @curveu, @curveu+(@perimeter*frac), 0.0, 1.0); // @curveu=分叉的,在它变化之前不生长;"@curveu+自身的长度=主干增长到分叉时,分叉开始生长,知道它的长度结束; //乘百分比因子,同主干放在同一个范围; //-- 5 调用函数 @primnum当前分支primid,当前的长度;把长度参数乘新计算的growth adjustPrimLength(0, @primnum, @perimeter, @perimeter*growth); |
创建枝杈生长
A 随机点生长&分配随机分支
1)选择分支放置在prim的随机点上
2)“选择点”随机分组&随机分叉。
B 样条几何体化
1)放样所有线条
2)让分支“由粗到细”
3)主干与分支分支
开始正式制作
使用软件houdini16.5
A 随机点生长&分配随机分叉
1) grouprange // a)name:clone;b)group type:points,c)select:1 of 25;
2 )copytopoint // Target Points:clone。
3 ) sphere和transform // 缩小一点;
4) blast5,6,7 // group分别输入:0,1,2 ;连接copytopoint ;
--------选择点--------
1)在所有prim上隔25个选择1个点:通过这些点来分叉
所有点都移入一个组:clone;选组类型:点。在使用“范围滤波器”25个点中选择1个
-------选择分支--------
2-3)接下来,以上面选出的点作为拷贝点,copytopoint指定目标点:clone。拷贝小球看一下效果;
4)接下来。从orient之后的“曲线库”,使用blast分离线条库,用来作为分支,
a)保留group:0的线条“线0”。b)group:1“线1”;c)group:2“线2”
4a)线0连接到copy节点,
测试
接下来)随机的选择分支;
可以使用copy stamping,但是速度慢不推荐使用;
方案)使用3个group 和 三个copytopoints
==随机分组==
5)pointvop命名create_myrnd// xx 。
5-1)random //5-2)bind export //name:myrnd
6)groupexpression1 // Type:Points;group:a;@myrnd<0.333
<0.3
7)groupexpression2 // 命名b;@myrnd>=0.333 && @myrnd<0.666
8)groupexpression3 // 命名c;@myrnd>=0.666
9)groupcombine1 // A)group:a; Equals:a B)与clone Intersect(And):
10)groupcombine2 // 同上,换乘b组
11)groupcombine3 // 同上,换乘c组
12)copytopoints_b;
13)copytopoints_c :
14) merge4;合并11,12,13
15) merge5 :合并repeat_end1和merge4
当前的group是:隔25个点选择1个点;
再把此组,随机分成3份!
5)首先,为每个点创建随机值;
a)ptnum连接rand随机节点;输出一个新属性命名myrnd;
b)每个id,对应0~1之间不同的myrnd数值;
------接下来,利用此属性数值将clone组分成3组------
6)a组;a)类型:点;b)命名a;c)选择@myrnd<0.333值的点;
7)b组;命名:b;在0.333=<myrdn <0.666范围内取值;
8)c组;命名:c;myrdn >0.666;
9)合并组1: a组与clone组交叉:
10)合并组2:b组与clone组交叉:同上,换成b组;
11)合并组3:c组与clone组交叉
==随机分支==
------选择的合并组的点分3份copytopoint------
12-13)复制两个copytopoints,
a)三个节点命名_a;_b;_c;
b)分别改变Target Points目标点对饮的a,b,c:
c)三个节点连接到groupcombin3之后
(注:现在拷贝的物体都是“线0”)
copytopoints_a copytopoints_b copytopoints_c
------3份copytopoint再次分配不同的prm------
14)合并:重新把copy节点 对应 或 随意 换成“线1”“线2”
15)最后把“总线”和“分支线”合并;现在就有了不同的prim分支;
接下来放样样条线
B 样条几何体化
16) sweep :
17) circle :
18) transform:缩小圆 0.02
19) normal:
16)增加点大小pscale属性设置=1
17)放样节点sweep:选择“蒙皮”
18)放样横截面circle:polygon类型
19)缩小一些:
20)法线到顶点
问题)分支并未正确的放样
原因)“复制节点”继承了“接口2”的orient属性,并放在整个分支上
解决方案)去掉“继承点的orient”。
解决方案)
1)在前面的resample创建curveu属性。
2)它定义了在曲线上从起点到终点在0~1之间。
3)利用这个属性,创建pscale随曲线变化。
20) pointvop:// 。。。。此处省略。。。。
---在“orient的样条库”后设置pscale---
20)使用pointvop节点
20-1)bind:引入curveu;
20-2)ramp坡度;
20-3)fit映射分为;外置“输出最小&最大值”
20-4)输出pscale属性
20a)反向一下ramp。id=0处最粗!
20) pointwrangle:// @pscale = 1;
问题1)如果没有出现“由粗到细的效果”
1)是因为curveu的变化范围,并没有在0~1之间。
2)因为在前面调节curve时,第一次采样是在0~1之间。第二次采样细分后,范围可能在0~0.2之间了。
解决方案)取消两个分支的第二次resample的curveu选项!
问题2)主干消失
1)是因为线段没有pscale属性;默认值=0。
解决方案1)在merge前,在主干上加入pscale属性:
方案2):在分离三条线之前加入,三条线的粗细变化也消失。
在copy节点,取消pscale继承即可。
C样条生长动画
接下来)制作生长效果!
使用carve节点:产生生长效果
21) carve//
21)carve:调节First U 或者scecond U的值产生生长效果”
问题)分叉并没有生长动画。
原因)观察;合并节点,可以看到当分支附着点出现是,它们马上就被克隆出来。所以我们无法在“分叉”上使用carve节点。
方案)
1。需要把单独的值放到carve节点的second U值上,为所有的分叉;这样就是从原点开始生长;分叉要滞后一点长出来;每个分叉需要一个second U的单独的数值。
2. Houdini的Include文件中,有一个函数adjustPrimLength 实现了生长的功能
-----------准备工作-----------
22)pointwrangle命名grow_branches
23)measure1节点 :
24)measure2节点
//--准备1: 测量参数perimeter(周长)
//--准备2: 需要“主干”的长度;因为主干的生长速度,来决定分叉生长速度。
//--准备3: 分叉的初始曲线。把这些信息编码在初始曲线的属性上;
22) merge之后加入wrangle,
23)在wrangle之前加入measure测量参数;
24) 在carve之间加入measure节点,测量周长。
25)color节点 :attribute:curveu;
26)pointwrangle2命名cal_curveu :
准备2: 需要“主干”的长度
要获得主干长度,需要通过curveu参数:
25)color节点视觉化:属性curveu:变个渐变色。
2a)curveu问题
整条线段的curveu并没有起点到终点0~1,它只是被拷贝过来。
解决方案)
26)在measure之前pointwangle改变;
a)代码
//----均匀的分布curveu---- //-- 1 所有点 int pntcnt = npoints(0); //-- 2 因子 float frac = 1.0/float(pntcnt-1); //-- 3 新curveu @curveu = @ptnum*frac; |
b)连接color观察结果:
解决
c)连接grow_branch的“槽2”-引入“主干”曲线
准备3: 分叉的初始曲线
观察)color可视化一下branch;
分析)这些分叉继承了“主干”的属性。
方案)把这些信息转换成primitive类。
27)attribpromote :
22)grow_branches
27)放到grow_branches节点之前
22)接口连接“主干”线
#include <groom.h> //-- 1 growth:主干的生长,复制关联second U float growth = ch("growth"); //-- 2 长度:主干 float masterlength = prim(1, "perimeter", 0); //-- 3 百分比因子 float frac = 1.0/masterlength; //-- 4 分叉的生长动画 ,通过映射主干的动画,通过frac把主干与分支联系起来 growth = fit(growth, @curveu, @curveu+(@perimeter*frac), 0.0, 1.0); // @curveu=分叉的,在它变化之前不生长;"@curveu+自身的长度=主干增长到分叉时,分叉开始生长,知道它的长度结束; //乘百分比因子,同主干放在同一个范围; //-- 5 调用函数 @primnum当前分支primid,当前的长度;把长度参数乘新计算的growth adjustPrimLength(0, @primnum, @perimeter, @perimeter*growth); |
最后给second U:增加关键帧,制作一段生长动画。
今天就到这儿了,收功
教程翻译自entagma的网络教程
下一节:20180702A Tribute To Numberphile- Visualizing Recamán's Sequence in VEX
本文图片全部原创,版权归原作者所有
▉ <引子:>。— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】
这篇关于第064封“情书”:荆棘岭Kitbash Vein Growth Part 2<Entagma>Houdini 2018的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!