█北京西直门地铁站:路漫漫其修远兮-吾将上下而求索,
前言不搭后语:
人的一生要走多少弯路,林林总总,数也数不清;上班途中的弯路,工作中的弯路。生活中的弯路。感情中的弯路。
制作了好久东西,忘记保存,突然死机,突然断电,硬盘磁头坏掉,制作的文件,保存的东西荡然无存。数不胜数。咬牙切齿,却又无可奈何。
今天这节内容:
如何利用从线条的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 手动分离三条线
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
本文图片全部原创,版权归原作者所有