第063封“情书”:路弯弯Kitbash Vein Growth Part 1

北京西直门地铁站:路漫漫其修远兮-吾将上下而求索,

前言不搭后语:

人的一生要走多少弯路,林林总总,数也数不清;上班途中的弯路,工作中的弯路。生活中的弯路。感情中的弯路。

  制作了好久东西,忘记保存,突然死机,突然断电,硬盘磁头坏掉,制作的文件,保存的东西荡然无存。数不胜数。咬牙切齿,却又无可奈何。

今天这节内容:

    如何利用从线条的library中生成复杂的过程曲线

这一节要实现的效果

.....

▉今天是42岁第037天周六

这是写给houdini的

第063封“情书”

我是geo流程图

我是poinvop流程图

transform_branch

本节需要注意的知识点:

从线条library中生成复杂过程曲线步骤

A 准备线条

1)从一个线条library手动分离三条线

2)创建三条线的orient属性

B选择其中两条线合并

1)线2末端上定位&定向“线1”

2)合并“线1”与“线2”

3)合并线创建曲线坐标系

C 随机选择线条合并

1)for循环合并线条

2)"线1"随机选择prim合并

3)增加合并线的变化

接下来

开始正式制作

使用软件houdini16.5

A 准备线条

手动分离三条线

1)为了结果,这些线需要从原点出发

2)还需要沿着z轴方向运动。z轴是一个特殊的轴向,以后用矩阵来变换,z轴就是物体所指的方向。

线的第一段正切线需沿着z轴;

3)现在三条线完全处于一个平面,我们在三维空间要制作,需要至少一段在三维空间。使用blast分成两部分。

1)transform1  // 转移到原点,旋转90度指向z轴,

2 )transform2,3,4  // 分别旋转group:0,1,2,旋转每条prim的第一段正切于z轴。  

3) blast2,3  // 分成‘ group0’和‘非group0’两部分;

4) resample1 //为了容易编辑点,减少点,

5) edit // 在空间随机移动点 。

6) resample2 // 增加采样点 。

√allow primi...

Treat polygon as:细分曲线subdivision curves。

7)resample5   // 增加采样点

8)merge  // 合并

现在有三条线,其中一条是有三维空间感的 。

2创建三条线的orient属性

9)首先在线上建立;指向x轴的normal

10)复制之前的并行移动教程设置曲线坐标系的节点;这会为prim的每个点创建三个正交向量,从而为曲线建立了坐标系。这三个向量:PT_tangent;PT_normal;PT_bitangent;

11)通过这三个向量创建四元数

9)pointwrangle1命名create normal  // 

@N = {0,1,0};

10)paralletransport   // 参考<第57封情书>内容

11)pointvop命名create_orient  // 

    a)三个bind引入曲线坐标系的三个向量;

b)连接向量转矩阵;

c)矩阵转四元数;

d)bindexport输出orient属性。

1)显示orient:

2)orient属性跟三个向量显示完全相同;因为它是由这三个向量组成;


现在有了漂亮的曲线方向。使用其中的一条曲线,增加end of she spline;一遍又一遍的做,形成一个长长的wine穿过三维空间;

B 选择其中两条线合并

1线2末端上定位&定向“线1”

线1的定位

12)保留group2的spline2“线2”;

13)创建辅助点在这条spline上再加一条pline;保留group1的spline1“线1”。

14)创建分支:pointvopgroup1连接‘槽1’,group2接“槽2”

需求) “group2曲线的最后一个点”和“最后一点的orientation方向”

    14-1a)通过使用primitive attribute1。你可以在曲线上指定u轴向,调取一个属性 // 从“槽2”引入group2的曲线,连接file. 

14-2)一个常量;矢量,连接UV,第一个值是u值;=1表示这个prim的终点位置;

14-1b)从默认的Cd属性改成位置属性:Attribute:P;这就给了我们这个prim的位置,并且移动到了group2的spline的末端;

14-3)通过add,将这个spline1与spline2的末端结合;group1的spline就跳到了group2的spline的末端。

12)blast1  // 保留group:2---线2

13)blast4    // 保留group:1--线1

14)pointvop命名transform_branches   // 

14-1a)primitive attribute1// 调取group2曲线的属性

14-2)constaint// 类型:vector(vector)

14-1b)primitiveattribute1  

        // Attribute:P;调用位置属性

14-3)add// 结合两条spline。


线1的定向 

---使用矩阵旋转线1的所有点---

14-4)导入“线2”的orient属性:复制primitive attribute2;属性改成orient;并且类型改成vector4 Attribute。

14-5)四元数转换成矩阵:

14-6)将“位置”乘“矩阵”,旋转所有点;

14-3)最后“分支定向”+“分支定位”输出;

spline2已经适应spline1的最后一点的旋转,移到最后一点

14-4)primitiveattribute2// Attribute:orient   调用方位属性 ;vector4 attribute

14-5)Quaternion to Matrix:

14-6)multiply// 

14-3)Add//

2:合并“线1”与“线2”

15) 合并spline2 和 “旋转移动后的spline1”

16)现在只有两个primitive:使用join合并两个prim。

17)焊接点;

15)  merge1// 

16)  join1   //  连接线1,2

17)  fuse1   //  焊接点

问题)orient失效,蓝色切线偏离了。

原因)orient没有跟随点旋转;

解决方案)

1。旋转所有向量;

2。在合并的spline上运行“并行传输”

3:合并线创建曲线坐标系

18,19) 复制<10>和<11>

产生了新的“曲线坐标系”

18)paralletransport1   

19)create_orient2

B阶段)在“组合的线条”中将“其中两条”合并成一条“更复杂的更长的线条”。

接下来)blast手动分离线条加入随机表达式 。通过循环节点的迭代值随机选择primitive。

C 随机选择线条合并


1:for循环合并线条

20)使用forloop节点分离

    a)第一件事:转换分支 ——接入<12>blast:线2。

b)接着“合并”——连接<15>merge.接下来每件事,连接线;焊接点;对新的线条“并行传输”建立曲线坐标系;转换成orient方位属性。

    c)repeat_begin输入:连接merge和transform_branches的节点;

d)输出:连接repeat_end

    e)完整的曲线坐标系

    f)

a)第一次:附加到线2的末端;

b)每次都在前一次创建的“线”的末端,附加上“线1”。

c)迭代了10次;

20)for loop with Feedback // 

小节)现在问题:总是重复之前相同的状态; 

接下来)随机选择线条;

2:"线1"随机选择prim合并

//使用表达式,使blast随机选择prim;

a) 首先建立一个随机值,

b) 然后来驱动循环的迭代值。

c) 每次循环,使用随机的prim来进行迭代;

d)每次循环在repeat begin节点创建一个元数据导入通知:create Meta Import Node,它产生关于循环的信息;它与几何体无关;它作为detail属性创建的元信息,

---------随机选择prim表达式---------

1)在“线1”中调用迭代属性表达式

问题)一段很短的拼接合并;

原因)迭代0~10;而总共prim只有3段线条;只有0~2是有效的;之后找不到prim;于是不再返回prim;

---解决---

2)我们需要总是让这个表达式范围rand随机floor向下取整函数乘3保持在0~2之间

每次迭代,随机选择一个prim进行拼接;

3)再增加个随机的因子

虽然只有三个prim但是产生了复杂的线条,如果线条更多,会更复杂;这是一种生成过程曲线的技术;

   20-3)  create Meta Import   //  

-------------------随机选择“线1”------------------

   13) blast

//-----1 第一次引入迭代次数----- 

·detail(“../repeat_begin1_metadata1/”,”iteration”,0)·//返回循环在0~9之间迭代次数

//------2 第一次改进----------

//-- rand函数返回0~1之间 ,floor函数向下取整;int只保留整数;

floor(rand(detail(“../repeat_begin1_metadata1/”,”iteration”,0))*3.0)

//------3 第二次改进----------随机因子

floor(rand(detail(“../repeat_begin1_metadata1/”,”iteration”,0)+923579)*3.0)


3:增加合并线的变化


1)改变一下repeat_end的迭代次数

interation=100

2) 加入随机旋转 这样每次增加合并新的线条,让它在z轴上进行随机旋转;

a)迭代恢复=10;

b1)进入transform_branch中增加一个组件 ,一个随机值来驱动旋转;

----1随机值---

14-8)parameter节点命名randrot,整数类型;

14-9)然后rand节点;

14-10)fit映射一下随机值0~2pi;

---2绕着z轴旋转---

通过旋转矩阵的一个向量完成

14-11)矩阵转矢量

14-12)使用quaternion结合random节点为z轴创造一个随机角度的旋转;

14-13)四分转矩阵;

14-14) 这个矩阵旋转乘另一个矩阵旋转。

b2)在transform_branch面板改变randrot数值:

randrot=1

问题)现在不是随机,这个数值是全局控制的

b3)在randrot上加上另一个Hscript表达式由迭代值驱动;这样每次迭代,会添加一个z轴上的随机的方向旋转

迭代值=10

迭代值=30

c)进一步增加随机性:改变blast的随机值

floor(rand(detail(“../repeat_begin1_metadata1/”,”iteration”,0)+927)*3.0)

  14) transform_branches    


14-8)parameter//  Name:randrot;integer;

14-9)random //  

14-10)fit // 输出最大值Destination Max=$PI*2;

14-11)matxtovec

14-12)quaternion:angle连接random;axis连接“矩阵转矢量”的row3;

14-13)  quattomatx2  //  连接<14-12>

----------------------------

detail(“../repeat_begin1_metadata1/”,”iteration”,0)

这是一种分型技术:使用单个元素创作更复杂的东西。它基于libray能生成任意长度,随机的曲线;下一节将介绍如何增加“分叉”“厚度”“几何形状”以及“如何生长”。

今天就到这儿了,收功

​教程翻译自entagma的网络教程

下一节:20180618 Kitbash Vein Growth Part 2

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

你可能感兴趣的:(第063封“情书”:路弯弯Kitbash Vein Growth Part 1)