Vex前言
Vex是Houdini的控制脚本, 语法类似C/C++, 能方便编写出操控几何数据的程序.
八面体阵列程序
void add_pyramid(vector pos)
{
int p0 = addpoint(0, pos + {1, 0, 1});
int p1 = addpoint(0, pos + {1, 0, -1});
int p2 = addpoint(0, pos + {-1, 0, 1});
int p3 = addpoint(0, pos + {-1, 0, -1});
int p4 = addpoint(0, pos + {0, 1.5, 0});
int p5 = addpoint(0, pos + {0, -1.5, 0});
addprim(0, "poly", p2, p4, p0);
addprim(0, "poly", p0, p4, p1);
addprim(0, "poly", p1, p4, p3);
addprim(0, "poly", p3, p4, p2);
addprim(0, "poly", p0, p5, p2);
addprim(0, "poly", p1, p5, p0);
addprim(0, "poly", p3, p5, p1);
addprim(0, "poly", p2, p5, p3);
}
int row = chi("row");
int colume = chi("colume");
if(row >= 1 && colume >= 1)
{
for(int x = 0; x < row; ++x)
{
for(int y = 0; y < colume; ++y)
{
add_pyramid(set(2 * x, 2 * y, 0));
}
}
}
猪头涟漪形变
vector inf_pos = point(1, 'P', 0);
float radius = chf("radius");
int handle = pcopen(0, 'P', inf_pos, radius, chi("max_points"));
int ptnum = -1;
float distance = 0.0;
while (pciterate(handle))
{
pcimport(0, "point:number", ptnum);
pcimport(0, "point:distance", distance);
if(distance > radius - chf("threshold"))
{
vector pos = point(0, "P", ptnum);
vector dir = normalize(pos - inf_pos);
setpointattrib(0, "P", ptnum, pos + dir * chf("push_distance"));
setpointattrib(0, "Cd", ptnum, {1, 1, 0});
}
else
{
setpointattrib(0, "Cd", ptnum, {0, 0, 1});
}
}
参考资料
https://www.bilibili.com/video/BV1Zp411d7Hw?p=1