第084封“情书”:石更20190218 Polyfolding- Part 1卷曲<Entagma>Houdini 2019

▉ 岁月没有把我的灵魂磨平,只是擦掉了上面的冲动和轻狂,它依然棱角分明— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】

 【】

Sisyphean tasks.

█ 永不妥协当现实抬手给你一巴掌的时候,你应该和它击个掌。就算是破罐子,也要摔的比别人响!”

前言不搭后语

西西弗斯是古希腊神话中的一个悲剧人物,因为泄露了宙斯的秘密后又背叛了死神的承诺而被众神惩罚。

每天周而复始地进行无意义的工作——将一块巨石从山脚推到山顶,可是巨石太重一到达山顶又会因为自重滚落回山脚。西西弗斯的生命就在这样一件无效又无望的劳作当中慢慢消耗殆尽。

但他没有跪地求饶

本节内容
为物体表面每个primitive创建变换矩阵

20190218 Polyfolding - Part 13.png

今天是42岁
057周五

84
这是写给Houdini的第084封“情书”


我是geo流程图

image.png

我是vex代码

❖ add点到物体的距离 ❖

  //-- 引入add点的位置

    vector tar_pos = point(1,"P",0);

    //-- 距离变量

    float dist = length(@P - tar_pos);

    //-- 变量写到属性上

    @dist = dist;


❖ 每个prim的一个父prim  ❖

//-- 1 首先,找到prim的临近三角形,

    //每个三角形有三个邻居,其中一个作为父prim

int poly_neighbours[] = polyneighbours(0,@primnum);

    //我们需要ID号最高的那个prim

//-- 2 创建“父prim”的变量,

    //用-1初始化,这不是可用的索引,如何在循环中做到这一点,

int parent = -1;

//-- 3 遍历所有的邻居,此循环结束,返回最大ID的nbr

foreach(int nbr; poly_neighbours){

    //- 3a “当前邻居id” 比较 “父prim变量” 来更新“父变量”

    //- 3b 另外要补充,“只比当前id大的primid"

    if(nbr > parent && nbr >@primnum){

        parent = nbr;      

    }

}

i@parent = parent;


❖  收集每个prim的所有父prim ❖

int parent = 0;

int idx = @primnum;

int parents[]; 


//-- 1 只要parent不是-1循环继续,=-1循环停止

while(parent>=0){

    //-- 2 首先引入parent

    parent = prim(0,"parent",idx);

    //-- 3 添加入数组

    append(parents,parent);

    idx = parent;

    }

//-- 4 颠倒数组顺序,-1在起始位置

parents= reverse(parents);

removeindex(parents,0);


i[]@parents = parents;


❖ prim与父的共享边的两个点  ❖

//-- 1首先,需要"所有点"和“它们的parent点”

int mypoints[] = primpoints(0,@primnum);

int parpoints[] = primpoints(0,i@parent);


int edgepoints[];


//-- 2两个循环,遍历所有点中的所有的父的point

foreach(int pnt; mypoints){

    foreach(int parpnt; parpoints){

    //-- 3如果pnt与parpnt相同,点加入“edgepoints数组”

        if(pnt == parpnt){

            append(edgepoints, pnt);

        }

        

    }

}

//-- 4 补充排除parent<0的情况,取此prim的前两个点

if(i@parent<0){

    append(edgepoints, mypoints[0]);

    append(edgepoints, mypoints[1]);

}


i[]@edgepoints = edgepoints;



❖  创建矩阵 ❖

//-- 1 两个边界点位置

vector edgepos1 = point(0,"P",i[]@edgepoints[0]);

vector edgepos2 = point(0,"P",i[]@edgepoints[1]);

//-- 2 创建向量

vector edge = edgepos2 - edgepos1;


//-- 3 创建矩阵基础:4个向量(x,y,z轴,对原点坐标系的变换)

    //-- 3a 双切线:新矩阵的第一个方向

vector bitangent = normalize(edge);

    //-- 3b 法线

vector normal = @N;

    //-- 3c 切线:标准化积乘

vector tangent = normalize(cross(bitangent,normal));

    //-- 3d 第4个矢量= edge中心点到原点

vector origin = edgepos1 + ( edge*0.5);


//-- 4 创建矩阵

matrix xform = set(bitangent,normal,tangent,origin);


//-- 6 用向量的分量语法 x=第一个向量,a=第4个分量

xform.xa = 0;

xform.ya = 0;

xform.za = 0;


//-- 5 创建矩阵属性

4@xform = xform;

❖    ❖


首先
制作步骤

 

小节提要

       Polyfolding折叠(多边形交叠包起)是一种有趣的效果,您可以将对象分割为各个条带并使它们卷曲。

     它可用于分解对象或使其从无到有。为了实现卷曲行为,需要一些矩阵数学。所有prim都被视为单个对象,并附有自己独特的转换矩阵。然后,可以将它们置于层次关系中以使连续卷曲发生。

A

01

创建几何体

B

02

用参数表示几何到add点的距离

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值