第085封“情书”:石达开Polyfolding - Part 2<Entagma>Houdini 2019
▉ 为了梦想而坚持不懈的人身上有光。— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】
█听从内心,做你所爱!终有一天梦想会照进现实!
前言不搭后语
精诚所至,金石为开:
因为喜欢而坚持,我们称为梦想。而为梦想努力,永远都不会太迟。 偷懒,不努力,不爱学习,我一直是个爱一行才会干一行的家伙,超级超级不喜欢做不爱的事,爱,奋不顾身。不爱,毋宁死。(娘也是个刚烈女子,有其母必有其子,为此把学霸妈妈气到视网膜脱落)。 只因非常喜欢美的,有想象力的,天马行空的东西,直到找到能创造这一切的事业后,我想要做到最好。 而为了做到这一点,就必须学习,必须努力,必须坚持。 我是不是个逆子?
本节内容如何让这个几何体狮子大张口。
本节要实现效果.....今天是42岁第058天周六
85这是写给Houdini的第085封“情书”
我是geo流程图
我是primitivevop流程图
我是vex代码❖ 移动每个prim到原点“本地化” ❖//-- 1 读入xform属性matrix xform = 4@xform;
//-- 2 建立个新的矩阵=反向矩阵xform:变换局部所有点需要反向矩阵
//因为需要反向xform定位所有这些点(移动点的到原点)matrix xforminv = invert(xform);
//-- 3 移动所有点到它们本地化位置@P *= xforminv;
❖ 新建本地化矩阵local_xform ❖//-- 1 用逆向的“父矩阵的xform矩阵”表示“xform矩阵” //从“父prim"中读取xform,虽然它们已转化为orignmatrix par_xform_inv = invert(prim(0, "xform", i@parent));//-- 2 创建新的本地化矩阵=在"父系统"的每个矩阵和“逆向的父矩阵”相乘4@local_xform = 4@xform * par_xform_inv;
//-- 3 增加一种判断条件 if (i@parent < 0){ 4@local_xform = 4@xform; }
❖ local xform创建新“全局矩阵” ❖//-- 1 找到所有本地化的“父矩阵”
int parents[] = reverse(i[]@parents);
//-- 2 需要全局矩阵=把所有点转换回原来的位置,它是由一串单独矩阵组成,首先初始化matrix global_matrix = 4@local_xform;matrix parent_matrix = ident(); //初始化:这个函数什么也不做。ident函数返回给定矩阵类型的单位矩阵。
//-- 3 这个循环每个父矩阵*父矩阵矩阵的父矩阵,直到根父物体,foreach(int parent; parents){ //-- 3a 首先每个prim找到它的本地化的“父矩阵” parent_matrix = prim(0, "local_xform", parent); //-- 3a 每个全局矩阵*父矩阵,再保存到“全局矩阵变量”中 global_matrix *= parent_matrix; }//-- 这里有个全新的全局矩阵,我们为它创建属性。parent<-1的矩阵使用全局矩阵。//-- 4 判断:如果不是跟prim。建立新的变量会更清晰,但是占用大量内存,所以作者喜欢重复使用local xformif(i@parent > -1){ 4@local_xform = global_matrix; }
❖ 本地化的点返回原位 ❖//-- 1 首先 点找到所属的prim,int myprim[] = pointprims(0, @ptnum);//-- 2 提出每个点全局矩阵:因为是unique分离状态,所以只有一个primmatrix local_xform = prim(0, "local_xform", myprim[0]);//-- 3 点返回原位@P *= local_xform;
❖ 设置旋转矩阵&旋转角度变量 ❖
//-- 1 首先需要一个角度float angle = radians(ch("angle")); //radians函数将参//--从“度”转换为“弧度“angle *= @animate;
//-- 2 然后 建立并初始化一个旋转矩阵 ,matrix rotmat = ident();//-- 3 rotate函数旋转一个矩阵,应该tangent旋转,也就是x轴{1,0,0}表示沿x轴rotate(rotmat, angle, {1,0,0});//-- 4 最后应用这个旋转矩阵if(i@parent > -1){ 4@local_xform = rotmat * 4@local_xform; }
❖ ❖
首先
制作步骤
小节提要
A01
分离prim
B02
本地化prim
C03
本地化矩阵
D04
创建新的全局矩阵
E05
本地化的点返回原位
F06
旋转
G07
动画
H08
使用动画属性改变旋转代码
接下来正式制作 使用软件:houdini17.5
○ 节点 ○
❖ 小目标 ❖
把所有prim分开。
○ 分析 ○
所有prim都共享临近prim的点,而我们需要具有单独点的prim。
每个prim应该都有自己的一组不与任何prim共享的点。
然后就可以改变每个prim。
🔗 解决方案 🔗
01)❖ fact ❖:勾选Unique Points。
接下来段动
分离prim意味着:可以移动每个prim的的所有点,那样可以定义它们的特殊的origin。
然后使用一组不同的矩阵,把它们移到我们希望的地方。这就是如何在一个水平面上改变物体。
创建一个。
○ 节点 ○
❖ 小目标 ❖ 把prim移动到本地。🔗 解决方案 🔗
我们只能移动点,因为prim不能直接移动。
🔗 具体操作 🔗
02)primitivewrangle命名“localize_primitives”❖ 小问题❖
现在是prim层级,应该是point
03)attribpromote命名promote_xform
a)vex
//-- 1 读入xform属性matrix xform = 4@xform;
//-- 2 建立个新的矩阵=反向矩阵xform:变换局部所有点需要反向矩阵
//因为需要反向xform定位所有这些点(移动点的到原点)matrix xforminv = invert(xform);//-- 3 移动所有点到它们本地化位置@P *= xforminv;
a)每个prim动回原点,
b)并且根据每个点矩阵的特殊origin,得到相应的旋转。这就是为什么“父子prim”通过一个共享边相连
接下来段动
这种方案可以构建🔗新的矩阵🔗,然后转换回原来的地方。
然后再旋转这些矩阵。
🔗新的矩阵🔗成为对象的全局矩阵,这些prim对象。
通过一组不同的矩阵,把它们移动回它们自己的地方。
❖ 下一阶段目标 ❖
首先“父变换矩阵”表示变换矩阵。
然后创建“矩阵链”,它们再一个一个进行空间转换,最后到达prim所在的位置。
每个prim都是根据它的"父"来定义。这意味着如果“父”变换,“子”也跟着变换。这就是需要的卷曲效果。
○ 节点 ○
❖ 具体操作 ❖04)primitivewrangle命名localize_matrices:
///-- 1 用逆向的“父矩阵的xform矩阵”表示“xform矩阵” //从“父prim"中读取xform,虽然它们已转化为orignmatrix par_xform_inv = invert(prim(0, "xform", i@parent));//-- 2 创建新的“本地化矩阵”=在"父系统"的每个矩阵和“逆向的父矩阵”相乘4@local_xform = 4@xform * par_xform_inv;
❖小问题1❖↑如果“几何体表格”中没有local_xform矩阵🔗解决方案🔗
attribute promote节点:默认是删除原始的xform
取消勾选Delete...
❖小问题2❖
还有一些没有“父prim”,没有定义local_xform矩阵
🔗解决方案 🔗//-- 3 增加一种判断条件 if (i@parent < 0){ 4@local_xform = 4@xform; }
接下来段动
这🔗local_xform🔗就是一个在"父空间"中表示的变换矩阵。
最后从“全局矩阵”得到了“局部矩阵”
这个矩阵定义了“父空间”中的对象。
❖ 下一阶段目标 ❖
把所有这些loacal_xform矩阵相乘再次创建“全局矩阵”。
但是这些“全局矩阵”是由一长串线性变换组成。
虽然prim移回以前的位置,但是不止是一个矩阵,而是一组矩阵,一个接一个的矩阵链
○ 节点 ○
❖ 小目标 ❖
需要一个新的矩阵=收集的所有prim的“父矩阵”乘“prim”
🔗 解决方案 🔗05)primtivewrangle 命名 local_to_new_global 。
//-- 1 找到所有本地化的“父矩阵”
int parents[] = reverse(i[]@parents);
//-- 2 需要全局矩阵=把所有点转换回原来的位置,它是由一串单独矩阵组成,首先初始化matrix global_matrix = 4@local_xform;matrix parent_matrix = ident(); //初始化:这个函数什么也不做。ident函数返回给定矩阵类型的单位矩阵。
//-- 3 这个循环每个父矩阵*父矩阵矩阵的父矩阵,直到根父物体,foreach(int parent; parents){ //-- 3a 首先每个prim找到它的本地化的“父矩阵” parent_matrix = prim(0, "local_xform", parent); //-- 3a 每个全局矩阵*父矩阵,再保存到“全局矩阵变量”中 global_matrix *= parent_matrix; }//-- 这里有个全新的全局矩阵,我们为它创建属性。parent<-1的矩阵使用全局矩阵。//-- 4 判断:如果不是跟prim。建立新的变量会更清晰,但是占用大量内存,所以作者喜欢重复使用local xformif(i@parent > -1){ 4@local_xform = global_matrix; }
接下来段动
这一小节之后
属性🔗local_xform🔗又储存了全局矩阵Global xform。
但这个全局矩阵是由所有local_xform组成。
这意味着:稍后在“这两节点”之间,做一些空间变换 。
可以在转成“全局矩阵”前,"旋转“缩放”单独的prim,影响这些local_xform。
稍后在“”
❖ 下一阶段目标 ❖
使用新创建的“矩阵”将prim转换回原来的位置。
虽然prim移回以前的位置,但是不止是一个矩阵,而是一组矩阵,一个接一个的矩阵链
○ 节点 ○
🔗 解决方案 🔗08)pointwrangle命名“xform_points”
//-- 1 首先 点找到所属的prim,int myprim[] = pointprims(0, @ptnum);//-- 2 提出每个点全局矩阵:因为是unique分离状态,所以只有一个primmatrix local_xform = prim(0, "local_xform", myprim[0]);//-- 3 点返回原位@P *= local_xform;
接下来段动
虽然外表没有区别,但是现在点位置是由“一个相乘矩阵链”组成。
现在可以做一些空间变换。
❖ 下一阶段目标 ❖
把所有这些loacal_xform矩阵相乘再次创建“全局矩阵”。
但是这些“全局矩阵”是由一长串线性变换组成。
虽然prim移回以前的位置,但是不止是一个矩阵,而是一组矩阵,一个接一个的矩阵链
○ 节点 ○
○ 具体操作 ○06)primitvewrangle命名“rotate”
//-- 1 首先需要一个角度float angle = radians(ch("angle")); //radians函数将参数
❖ 小目标1 ❖ 改进一下angle的数值范围
❖ 小目标2 ❖ 旋转local_xform
🔗 解决方案 🔗 :建立一个旋转矩阵
从“度”转换为“弧度“//angle *= @animate;
//-- 2 然后 建立并初始化一个旋转矩阵 ,matrix rotmat = ident();//-- 3 rotate函数旋转一个矩阵,应该tangent旋转,也就是x轴{1,0,0}表示沿x轴rotate(rotmat, angle, {1,0,0});//-- 4 最后应用这个旋转矩阵if(i@parent > -1){ 4@local_xform = rotmat * 4@local_xform; }
❖ 小问题 ❖
🔗 解决方案 🔗
a)以更小的增量减小这个角。b)不要对所有prim应用相同的angle,只对正在卷曲的部分应用angle。引入另一个primwrangle来处理
接下来段动
❖小问题❖
它们对angle非常敏感 ❖原因❖
每个prim都在“父系统”中旋转。对每个prim都应用了一样的angle。
🔗 解决方案 🔗
a)以更小的增量减小这个角。b)不要对所有prim应用相同的angle,只对正在卷曲的部分应用angle。
❖ 下一阶段目标 ❖
引入一个primvop来动画这个效果。
○ 节点 ○
○ 具体操作 ○07)primitivevop命名“animate”🔗 解决方案 🔗
使用“上一课”的dist属性,来驱动动画;
🔗 执行 🔗
07-1)bind:name=dist
07-2)fit:
❖小目标❖
需要定义范围sub-range。
🔗解决方案🔗
使用parameter是参数节点来定义sub-range。 07-3)🔗param1🔗:name=pos表示是dist梯度属性中的位置。 a) param1连接source min 07-4)🔗param2🔗:name=width表示0~1的范围 07-5)🔗add🔗:
a)输入:param1与param2
b)输出:sourcemax
(param2:决定dist梯度的值) 07-6)🔗bind export🔗:name=animate;
🔗 测试animate属性 🔗
08)visualize2 :Attribute=animate a)首先让rotate失效。 调整pos和width值
b)所以使用animate属性可以用来驱动prim旋转
🔗 解决方案 🔗
让angle乘以annimate属性
angle *= @animate;
❖小问题❖
并没有解决问题
🔗原因🔗
在fit中取值范围的问题
🔗 解决方案 🔗
翻转一下:min=1;max=0
出了animate属性的值,所有prim=0
番
外段动
增加“缩放”效果:
通过增加“缩放矩阵”。
然后 乘“矩阵转换”。
完
教程翻译自entagma的网络教程下一节:电子邮箱:oneinchtime@126.com
公众号: 微信号
- 第090封“情书”: 一生二Vellum Cell Replication Tutorial - Part 2<Entagma>Houdini 2019
- 第087封“情书”:红旗下的蛋Analytical Foam分析泡沫<Entagma>Houdini 2019
- 第093封“情书”:三生万物Vellum Cell ReplicationPart3 <Entagma>Houdini 2019
- 第097封“情书”:浮生碌碌PDG For Design Work Pt. 4 - Distributed Grains Using PDG<Entagma>Houdini 2019
- 第098封“情书”:我有病Distributed Rendering Using Redshift<Entagma>Houdini 2019
- 第092封“情书”:三国Vellum Cell Replication 2c<Entagma>Houdini 2019
- 第094封“情书”:变量20190312PDGForDesignWorkPt1-TheBasics<Entagma>Houdini 2019
- 第084封“情书”:方阵 PDG For Design Work Pt. 1b - Generating Mosaics Out Of Your Renders<Entagma>Houdini 201
- 第089封“情书”:九九归一Vellum Cell Replication TutorialPART1<Adrian Meyer>Houdini 2019
- 第088封“情书”:万宗归一Procedural Subdivision Lines - Creating Control Curves<Entagma>Houdini 20
- 第099封“情书”:天下无不散之筵席Volumes101-DissolvingGeometry<Entagma>Houdini
- 2019中国互联网趋势报告,解读未来16大机会
- 最新AUcc2019破解版下载 Adobe Audition CC 2019中文破解补丁
- Designing Applications for High Performance - Part 1
- LIBCMTD.lib(wincrt0.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
- 2019
- 2019最新手把手PHP基础入门到实战构建原生商城项目实战(完整)
- 深入浅出 Java Concurrency (2): 原子操作 part 1
- 论文阅读《Real-time part-based visual tracking via adaptive correlation filters》(2)
- Building Microservices with Spring Boot and Apache Thrift. Part 2. Swifty services