目录
pointvertices —— 返回连接到指定点的顶点列表
pointvertex —— 返回与指定点共享的第一个顶点的线性顶点号
primvertices —— 返回指定prim上的线性顶点列表
primpoint —— 将prim上的vertex转化为对应的点号
primvertex —— 将prim上的顶点转化为对应的线性顶点
primvertexcount —— 返回prim上的顶点总数
primfind —— 返回可能与boundingbox边界相交的面号列表
vertexprev —— 返回与给定顶点分享点的上一个顶点的线性顶点号
vertexnext —— 返回与给定顶点分享点的下一个顶点的线性顶点号;
vertexprimindex —— 将线性顶点转化为顶点号;
vertexcurveparam —— 沿着面的周长返回顶点参数坐标
geoself —— 返回当前几何体的handle
int geoself()
- Return,返回当前几何体的handle,适用于几何图形创建操作;
addpoint —— 添加点到几何体
//创建一个新点,伴随给定点号的所有属性和组; int addpoint(int geohandle, int point_number) //创建一个新点,在指定位置; int addpoint(int geohandle, vector pos)
- Args
- geohandle,待写入的几何体,仅0、geoself有效;
- Return
- 返回新点的点号,未创建新点返回-1;
- 可使用返回值,通过setpointattrib函数设置新点属性,有可能不是最终的点号;
int pt = addpoint(0,{1,1,1});
setpointattrib(0,"a",pt,1);
//创建螺旋线
int pts[];
for(int i=0; i<chi('num'); i++){
float x = cos(i*ch('ang')*$PI)*ch('rad');
float z = sin(i*ch('ang')*$PI)*ch('rad');
float y = i*ch('height');
pts[i] = addpoint(0, set(x,y,z));
}
addprim(0, 'polyline', pts);
addprim —— 添加面到几何体
//创建polygon或polyline,然后可使用addvertex添加顶点到面 //确保添加至少一个顶点到面,如处理空几何体可能引起奇怪的结果或失败 int addprim(int geohandle, string type)//使用被点号指定的点,来创建prim int addprim(int geohandle, string type, int pt0) int addprim(int geohandle, string type, int pt0, int pt1) int addprim(int geohandle, string type, int pt0, int pt1, int pt2) int addprim(int geohandle, string type, int pt0, int pt1, int pt2, int pt3) int addprim(int geohandle, string type, int pt0, int pt1, int pt2, int pt3, int pt4, int pt5, int pt6, int pt7)//使用被点号数组指定的点,来创建prim int addprim(int geohandle, string type, int points[])//输出新prim对应的顶点号,然后可使用setvertexattrib函数设置顶点属性,可能不是最终的顶点号 void addprim(int &prim_num, int geohandle, string type, int pt0, int &vertices[]) void addprim(int &prim_num, int geohandle, string type, int pt0, int pt1, int &vertices[]) void addprim(int &prim_num, int geohandle, string type, int pt0, int pt1, int pt2, int &vertices[]) void addprim(int &prim_num, int geohandle, string type, int pt0, int pt1, int pt2, int pt3, int &vertices[]) void addprim(int &prim_num, int geohandle, string type, int pt0, int pt1, int pt2, int pt3, int pt4, int pt5, int pt6, int pt7, int &vertices[]) void addprim(int &prim_num, int geohandle, string type, int points[], int &vertices[])
- Args
- geohandle,待写入的几何体,仅0、geoself有效;
- type,新面的类型;
- "poly",封闭的几何体,可使用0或更多的点;
- "polyline",打开的几何体,可使用0或更多的点;
- "tet",四面体Tetrahedron,要求4个点,不能添加顶点到prim;
- “hex”,六面体Hexahedron,要求8个点,不能添加顶点到prim;
- "sphere", "circle", "tube", "metaball", "metasquad",创建对应类型的prim,半径和形状由内在变换属性控制,要求1个点,不能添加顶点到prim;
- "AlembicRef", "PackedDisk",创建对应类型的prim,要求1个点,不能添加顶点到prim;
- Return
- 返回新prim的面号,未创建则返回-1;
- 可使用返回值,通过setprimattrib函数设置新面属性,有可能不是最终的面号;
//使用setprimintrinsic函数设置primitive’s transforms matrix3 transform_value = { {0, 0, 0}, {0, 0, 0}, {1, 1, 1}}; setprimintrinsic(geoself(), "transform", prim, transform_value);//也可设置Alembic/packed primitive intrinsics setprimintrinsic(geoself(), "unexpandedfilename", prim, "test.bgeo");
int p0 = addpoint(0, chv("p0"));
int p1 = addpoint(0, chv("p1"));
int p2 = addpoint(0, chv("p2"));
int p3 = addpoint(0, chv("p3"));
int prim = addprim(0, "poly");
addvertex(0, prim, p0);
addvertex(0, prim, p1);
addvertex(0, prim, p2);
addvertex(0, prim, p3);
//创建圆锥体
int pts[];
int num = chi('num');
for(int i=0; i<num; i++){
float x = cos(i*2*$PI/num)*ch('rad');
float z = sin(i*2*$PI/num)*ch('rad');
float y = i*ch('height');
pts[i] = addpoint(0, set(x,y,z));
}
addprim(0, 'poly', reverse(pts));
for(int i=0; i<chi('num'); i++){
int pt = addpoint(0, set(0,2,0));
addprim(0, 'poly', pts[i],pts[(i+1)%len(pts)], pt);
}
addvertex —— 添加一顶点到面
int addvertex(int geohandle, int prim_num, int point_num)
- Args
- geohandle,待写入的几何体,仅0、geoself有效;
- Return
- 返回线性顶点索引,未创建则返回-1;
- 可使用返回值,通过setvertexattrib函数设置新顶点属性,有可能不是最终的顶点索引;
minpos —— 查找点离几何体表面最近的位置
//返回点离几何体最近点位置 vector minpos(<geometry>geometry, vector point) //返回点离几何体最近点位置,在指定最大距离内 vector minpos(<geometry>geometry, vector point, float maxdist) //返回点离几何体最近点位置,在指定面组内 vector minpos(<geometry>geometry, string primgroup, vector point) //返回点离几何体最近点位置,在指定面组及最大距离内 vector minpos(<geometry>geometry, string primgroup, vector point, float maxdist)
- Args
- <geometry>,当运行在一个节点context(如wrangle SOP)时,此参数可以是一个整数(表示输入端);也可是一字符串(指定一几何体文件,如a.bgeo);
- primgroup,面组;可使用类似@Cd.x>0来指定组(可能需要反斜杠转义),空字符串表示所有面;
- point,指定的空间点位置;
- maxdist,查找最大距离;
- Return
- 最近点位置,未查找到最近点返回point;
注:等价于xyzdist + primuv;
nearpoint —— 查找离几何体最近的点
int nearpoint(<geometry>geometry, vector pt) int nearpoint(<geometry>geometry, vector pt, float maxdist) int nearpoint(<geometry>geometry, string ptgroup, vector pt) int nearpoint(<geometry>geometry, string ptgroup, vector pt, float maxdist)
- 查找几何体上最近的点号,并不是表面的位置;
- 使用xyzdist可查找表面或曲线上最近点;
- Args
- <geometry>,当运行在一个节点context(如wrangle SOP)时,此参数可以是一个整数(表示输入端);也可是一字符串(指定一几何体文件,如a.bgeo);
- ptgroup,点组,可使用SOP风格的组样式如0-10或@Cd.x>0.5,空字符串表示所有点;
- pt,指定的空间点位置;
- maxdist,最大查找距离;
- Return
- 最近点号,未查找到返回-1;
nearpoints —— 查找离几何体所有最近的点
int[] nearpoints(<geometry>geometry, vector pt, float maxdist) int[] nearpoints(<geometry>geometry, vector pt, float maxdist, int maxpts) int[] nearpoints(<geometry>geometry, string ptgroup, vector pt, float maxdist) int[] nearpoints(<geometry>geometry, string ptgroup, vector pt, float maxdist, int maxpts)
- Args
- <geometry>,当运行在一个节点context(如wrangle SOP)时,此参数可以是一个整数(表示输入端);也可是一字符串(指定一几何体文件,如a.bgeo);
- ptgroup,点组,可使用SOP风格的组样式如0-10或@Cd.x>0.5,空字符串表示所有点;
- pt,指定的空间点位置;
- maxdist,最大查找距离;
- maxpts,最大查找点数;
- Return
- 返回搜索距离内的点号数组;
注,为避免重复连线,可使用条件@ptnum < pt ;搜索0号端口会包含自身点;
//查找端口1附近的点,并连线
vector point = chv("point");
int pts[] = nearpoints(1, point, ch("maxdist"), chi("maxpts"));
vector pos;
int pt0 = addpoint(0, point);
int pt1;
foreach(int pt; pts){
pos = point(1, "P", pt);
pt1 = addpoint(0, pos);
addprim(0, "polyline", pt0, pt1);
}
//point层级,循环或solver;
//扩散,主动查找(只计算红色点@Cd.x>0.5,以红色点搜索周围点);
//当前红色点搜索周围点,如红色则变为绿色(相当于已经搜索过了),否则设置为红色;
float dist = ch("maxdist")*fit01(rand(@ptnum),0.5,1);
int pts[] = nearpoints(0, @P, dist); //包括自身点
foreach(int pt; pts){
vector cd = point(0, "Cd", pt);
if(cd.x == 1)
setpointattrib(0, "Cd", @ptnum, {0,1,0});
else if(cd.z == 1)
setpointattrib(0, "Cd", pt, {1,0,0});
}

//point层级,循环或solver;
//扩散,被动查找(即非active查找active);
//每个点查找周围的start或active点并连线,然后自身变为active,查找到的active变start
if(i@group_start==0 && i@group_active==0){
float dist = ch("maxdist")*fit01(rand(@ptnum),0.5,1);
int pts[] = nearpoints(0, @P, dist);
foreach(int pt; pts){
//只要周围有点start内,设置自身为active,并连线
if(inpointgroup(0, "start", pt)){
setpointgroup(0, "active", @ptnum, 1);
addprim(0, "polyline", @ptnum, pt);
setpointattrib(0, 'Cd', @ptnum, set(1,0,0));
break;
}
//只要周围有点active内,设置自身为active,active点设置为start,并连线
if(inpointgroup(0, "active", pt)){
setpointgroup(0, "active", @ptnum, 1);
setpointgroup(0, "active", pt, 0);
setpointgroup(0, "start", pt, 1);
addprim(0, "polyline", @ptnum, pt);
break;
}
}
}

neighbour —— 下一个被连接到给定点的点号
int neighbour(<geometry>geometry, int point_num, int neighbour_
Houdini几何体操作函数详解

该博客详细介绍了Houdini中一系列几何体操作函数,包括添加点、面、顶点,查找最近点和交点,获取点、面、顶点数量,移除属性、点、面、顶点等,还说明了各函数的参数和返回值,对Houdini几何体操作有重要指导意义。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



