第064封“情书”:荆棘岭Kitbash Vein Growth Part 2<Entagma>Houdini 2018

2023-10-10 23:50

本文主要是介绍第064封“情书”:荆棘岭Kitbash Vein Growth Part 2<Entagma>Houdini 2018,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

█ 这就是我的人间。荆棘遍地!陷阱重重。

— 每天翻译一篇教程,这就是我写给houdini的情书。


Crown of Thorns

█世界荣誉的桂冠,都用荆棘编织而成。


前言不搭后语:   

      漫漫人生路永远充满挑战,棘手的问题层出不穷,

只有信念和坚忍才能逼退人生路上布满的荆棘,走出康庄大道。

今天这节内容:

    光秃秃的线上如何分叉,发芽长出荆棘。


这一节要实现的效果
.....

20180618 Kitbash Vein Growth Part 21.png


▉今天是42岁第038天周日

这是写给houdini的

第064封“情书”

我是geo流程图

image.png


我是poinvop流程图

设置分支由粗变细:   image.png为每个点建立随机值myrnd(后面根据这个值取值范围,创建“ 随机选择点”的组) image.png
我是vex代码

设置“主干”粗细:  
@pscale = 1; 
重映射“主干”的curveu

//----均匀的分布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 选择分支放置在prim的随机点

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个

image.png

-------选择分支--------

2-3)接下来,以上面选出的点作为拷贝点,copytopoint指定目标点:clone。拷贝小球看一下效果; 

image.png


4)接下来。从orient之后的“曲线库”,使用blast分离线条库,用来作为分支,

    a)保留group:0的线条“线0”。b)group:1“线1”;c)group:2“线2”


    4a)线0连接到copy节点,

image.png

测试


接下来)随机的选择分支;

可以使用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;

image.png

    b)每个id,对应0~1之间不同的myrnd数值;

image.png


------接下来,利用此属性数值将clone组分成3组------


6)a组;a)类型:点;b)命名a;c)选择@myrnd<0.333值的点; 

image.png

7)b组;命名:b;在0.333=<myrdn <0.666范围内取值;

8)c组;命名:c;myrdn >0.666;

9)合并组1: a组与clone组交叉:

image.png

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之后

image.png

(注:现在拷贝的物体都是“线0”)

image.png

copytopoints_a                 copytopoints_b                 copytopoints_c


------3份copytopoint再次分配不同的prm------

14)合并:重新把copy节点 对应 或 随意 换成“线1”“线2”

image.png

15)最后把“总线”和“分支线”合并;现在就有了不同的prim分支;



接下来放样样条线

B 样条几何体化


1 放样所有线条

16)  sweep 

17)  circle 

18)  transform:缩小圆 0.02

19)  normal:


16)增加点大小pscale属性设置=1

17)放样节点sweep:选择“蒙皮”

image.png

18)放样横截面circle:polygon类型

19)缩小一些:

20)法线到顶点

image.png




问题)分支并未正确的放样

image.png

原因)“复制节点”继承了“接口2”的orient属性,并放在整个分支上

解决方案)去掉“继承点的orient”。

image.png


2: 分支“由粗到细”


解决方案)

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属性

image.png

20a)反向一下ramp。id=0处最粗!

image.png








20)   pointwrangle://   @pscale = 1;

问题1)如果没有出现“由粗到细的效果”

image.png

1)是因为curveu的变化范围,并没有在0~1之间。

2)因为在前面调节curve时,第一次采样是在0~1之间。第二次采样细分后,范围可能在0~0.2之间了。

image.png

解决方案)取消两个分支的第二次resample的curveu选项

image.png

问题2)主干消失

1)是因为线段没有pscale属性;默认值=0。

解决方案1)在merge前,在主干上加入pscale属性:

image.png

image.png

方案2)在分离三条线之前加入,三条线的粗细变化也消失。

在copy节点,取消pscale继承即可。



C条生长动画

接下来)制作生长效果!

使用carve节点:产生生长效果


1: 曲线的“生长效果”

21)  carve//


21)carve:调节First U 或者scecond U的值产生生长效果”

image.png



   

2:设置 分叉前准备工作


问题)分叉并没有生长动画。

原因)观察;合并节点,可以看到当分支附着点出现是,它们马上就被克隆出来。所以我们无法在“分叉”上使用carve节点。

方案)

    1。需要把单独的值放到carve节点的second U值上,为所有的分叉;这样就是从原点开始生长;分叉要滞后一点长出来;每个分叉需要一个second U的单独的数值。

    2.  Houdini的Include文件中,有一个函数adjustPrimLength 实现了生长的功能    

image.png

-----------准备工作-----------


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:变个渐变色。

image.png

image.png

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观察结果:

image.png

解决 

c)连接grow_branch的“槽2”-引入“主干”曲线   


准备3: 分叉的初始曲线

观察)color可视化一下branch;

image.png

分析)这些分叉继承了“主干”的属性。

方案)把这些信息转换成primitive类。




3:开始 分叉属性设置


27)attribpromote :

22)grow_branches   


27)放到grow_branches节点之前

image.png

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

微信图片_20190607085947.jpg

     本文图片全部原创,版权归原作者所有


▉ <引子:>。— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】

这篇关于第064封“情书”:荆棘岭Kitbash Vein Growth Part 2<Entagma>Houdini 2018的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/183995

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

Level3 — PART 3 — 自然语言处理与文本分析

目录 自然语言处理概要 分词与词性标注 N-Gram 分词 分词及词性标注的难点 法则式分词法 全切分 FMM和BMM Bi-direction MM 优缺点 统计式分词法 N-Gram概率模型 HMM概率模型 词性标注(Part-of-Speech Tagging) HMM 文本挖掘概要 信息检索(Information Retrieval) 全文扫描 关键词

MySQL record 02 part

查看已建数据库的基本信息: show CREATE DATABASE mydb; 注意,是DATABASE 不是 DATABASEs, 命令成功执行后,回显的信息有: CREATE DATABASE mydb /*!40100 DEFAULT CHARACTER SET utf8mb3 / /!80016 DEFAULT ENCRYPTION=‘N’ / CREATE DATABASE myd

2018秋招C/C++面试题总结

博主从8月中旬开始大大小小面试了十几家公司,至今也许是告一段落吧,希望后面会有好结果,因此总结记录一些C/C++方向常见的问题。和大家一起学习! 参考了互联网的各种资源,自己尝试归类整理,谢谢~ 一、C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。 C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

Vue3图片上传报错:Required part ‘file‘ is not present.

错误 "Required part 'file' is not present" 通常表明服务器期望在接收到的 multipart/form-data 请求中找到一个名为 file 的部分(即文件字段),但实际上没有找到。这可能是因为以下几个原因: 请求体构建不正确:在发送请求时,可能没有正确地将文件添加到 FormData 对象中,或者使用了错误的字段名。 前端代码错误:在前端代码中,可能

vulhub GhostScript 沙箱绕过(CVE-2018-16509)

1.执行以下命令启动靶场环境并在浏览器访问 cd vulhub/ghostscript/CVE-2018-16509 #进入漏洞环境所在目录   docker-compose up -d #启动靶场   docker ps #查看容器信息 2.访问网页 3.下载包含payload的png文件 vulhub/ghostscript/CVE-2018-16509/poc.png at

Python JAVA接口UTC 时间 '2018-08-06T10:00:00.000Z' 格式转化为本地时间

Python JAVA接口UTC 时间 '2018-08-06T10:00:00.000Z' 格式转化为本地时间 方法1 import datetimeorigin_date_str= "2019-07-26T08:20:54Z"utc_date = datetime.datetime.strptime(origin_date_str, "%Y-%m-%dT%H:%M:%SZ")loca

C++入门(part 2)

前言 在前文我们讲解了C++的诞生与历史,顺便讲解一些C++的小语法,本文会继续讲解C++的基础语法知识。 1. 缺省参数 1.1缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使用指定的实参。(有些地⽅把缺省参数也叫默认参数) 1.2 缺省参数的分类 缺省参数分为全缺省和半缺省参数,全缺省就是全部形参给

简单梳理UE4的Houdini官方插件代码

前言 Houdini官方插件名字叫 “Houdini Engine”,它搭建了Houdini数据与UE4数据间的桥梁。我接触这个插件已经有段时间了,我想是时候梳理一下插件的结构了。(当前我用的UE4版本是4.24.2,Houdini版本18.0.348) 需要说明的是,这篇博客主要是从代码出发的。我准备先分析插件整体的代码结构,再逐个翻阅每个文件试图搞明白他角色。但如果不准备研究代码结构和实现