▉ 岁月没有把我的灵魂磨平,只是擦掉了上面的冲动和轻狂,它依然棱角分明。— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】
█ 永不妥协:当现实抬手给你一巴掌的时候,你应该和它击个掌。就算是破罐子,也要摔的比别人响!”
前言不搭后语
西西弗斯是古希腊神话中的一个悲剧人物,因为泄露了宙斯的秘密后又背叛了死神的承诺而被众神惩罚。
每天周而复始地进行无意义的工作——将一块巨石从山脚推到山顶,可是巨石太重一到达山顶又会因为自重滚落回山脚。西西弗斯的生命就在这样一件无效又无望的劳作当中慢慢消耗殆尽。
但他没有跪地求饶。
我是geo流程图
❖ 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都被视为单个对象,并附有自己独特的转换矩阵。然后,可以将它们置于层次关系中以使连续卷曲发生。
01
创建几何体
02
用参数表示几何到add点的距离