您的位置:首页 > 其它

第085封“情书”:石达开Polyfolding - Part 2<Entagma>Houdini 2019

2019-08-10 23:23 78 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/sinat_33115291/article/details/99127108

▉ 为了梦想而坚持不懈的人身上有光。— 每天翻译一篇教程,这就是我写给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;    }


❖  ❖

首先
制作步骤

 

小节提要

A

01

分离prim

B

02

本地化prim

C

03

本地化矩阵

D

04

创建新的全局矩阵     

E

05

本地化的点返回原位

F

06

旋转

G

07

动画

H

08

使用动画属性改变旋转代码 

接下来
正式制作           使用软件:houdini17.5


01分离prim


○ 节点 ○


❖  小目标 ❖ 
把所有prim分开。


○ 分析 ○

  • 所有prim都共享临近prim的点,而我们需要具有单独点的prim。

  • 每个prim应该都有自己的一组不与任何prim共享的点。

  • 然后就可以改变每个prim。

🔗 解决方案 🔗

    01)❖ fact ❖:勾选Unique Points。


接下来段动

  1. 分离prim意味着:可以移动每个prim的的所有点,那样可以定义它们的特殊的origin。 

  2. 然后使用一组不同的矩阵,把它们移到我们希望的地方。这就是如何在一个水平面上改变物体。

  3. 创建一个。


02 移prim回原点本地化 


○ 节点 ○


❖  小目标 ❖ 把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”通过一个共享边相连


接下来段动


  1. 这种方案可以构建🔗新的矩阵🔗,然后转换回原来的地方。 

  2. 然后再旋转这些矩阵。

  3. 🔗新的矩阵🔗成为对象的全局矩阵,这些prim对象。

  4. 通过一组不同的矩阵,把它们移动回它们自己的地方。

❖  下一阶段目标 ❖ 

  • 首先“父变换矩阵”表示变换矩阵。

  • 然后创建“矩阵链”,它们再一个一个进行空间转换,最后到达prim所在的位置。     

  • 每个prim都是根据它的"父"来定义。这意味着如果“父”变换,“子”也跟着变换。这就是需要的卷曲效果。


03 本地化矩阵



○ 节点 ○

❖ 具体操作 ❖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;    } 




接下来段动


  1. 这🔗local_xform🔗就是一个在"父空间"中表示的变换矩阵。  

  2. 最后从“全局矩阵”得到了“局部矩阵”

  3. 这个矩阵定义了“父空间”中的对象。

❖  下一阶段目标 ❖ 

  • 把所有这些loacal_xform矩阵相乘再次创建“全局矩阵”。

  • 但是这些“全局矩阵”是由一长串线性变换组成。     


虽然prim移回以前的位置,但是不止是一个矩阵,而是一组矩阵,一个接一个的矩阵链



04 创建新的全局矩阵


○ 节点 ○


❖  小目标 ❖

需要一个新的矩阵=收集的所有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;    }


接下来段动

这一小节之后 

  1. 属性🔗local_xform🔗又储存了全局矩阵Global xform。  

  2. 但这个全局矩阵是由所有local_xform组成。

  3. 这意味着:稍后在“这两节点”之间,做一些空间变换 。

  4. 可以在转成“全局矩阵”前,"旋转“缩放”单独的prim,影响这些local_xform。

  5. 稍后在“”

❖  下一阶段目标 ❖ 

  • 使用新创建的“矩阵”将prim转换回原来的位置。


虽然prim移回以前的位置,但是不止是一个矩阵,而是一组矩阵,一个接一个的矩阵链




05 本地化点返回原位


○ 节点 ○



🔗 解决方案 🔗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;


接下来段动


  1. 虽然外表没有区别,但是现在点位置是由“一个相乘矩阵链”组成。  

  2. 现在可以做一些空间变换。

❖  下一阶段目标 ❖ 

  • 把所有这些loacal_xform矩阵相乘再次创建“全局矩阵”。

  • 但是这些“全局矩阵”是由一长串线性变换组成。     


虽然prim移回以前的位置,但是不止是一个矩阵,而是一组矩阵,一个接一个的矩阵链




06 旋转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 动画



○ 节点 ○



○ 具体操作 ○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旋转


08 使用动画属性改变旋转代码

🔗 解决方案 🔗

让angle乘以annimate属性

angle *= @animate;

❖小问题❖

并没有解决问题

🔗原因🔗

在fit中取值范围的问题

🔗 解决方案 🔗

翻转一下:min=1;max=0

出了animate属性的值,所有prim=0





外段动


  • 增加“缩放”效果:

    1. 通过增加“缩放矩阵”。

    2. 然后 乘“矩阵转换”。


教程翻译自entagma的网络教程下一节:电子邮箱:oneinchtime@126.com

公众号: 微信号

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐