VEX —— Functions|Geometry

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

目录

geoself —— 返回当前几何体的handle


addpoint —— 添加点到几何体

addprim —— 添加面到几何体

addvertex —— 添加一顶点到面


minpos —— 查找点离几何体表面最近的位置

nearpoint —— 查找离几何体最近的点

nearpoints —— 查找离几何体所有最近的点

neighbour —— 下一个被连接到给定点的点号

neighbours —— 所有被连接到给定点的点号

neighbourcount —— 被连接到给定点的点总数


intersect —— 计算射线的第一个交点

intersects —— 计算射线的所有交点


pointprims —— 返回包含指定点的prim列表

pointvertices —— 返回连接到指定点的顶点列表

pointvertex —— 返回与指定点共享的第一个顶点的线性顶点号

primpoints —— 返回指定prim上点的列表


primvertices —— 返回指定prim上的线性顶点列表

primpoint —— 将prim上的vertex转化为对应的点号

primvertex —— 将prim上的顶点转化为对应的线性顶点

primvertexcount —— 返回prim上的顶点总数

primfind —— 返回可能与boundingbox边界相交的面号列表

polyneighbours —— 返回边邻居的面号数组


vertexindex —— 将顶点转化为线性顶点

vertexprev —— 返回与给定顶点分享点的上一个顶点的线性顶点号

vertexnext —— 返回与给定顶点分享点的下一个顶点的线性顶点号;

vertexpoint —— 返回线性顶点的点号;

vertexprim —— 返回包含给定线性顶点的面号;

vertexprimindex —— 将线性顶点转化为顶点号;


npoints —— 返回点总数

nprimitives —— 返回面总数

nvertices —— 返回顶点总数

npointsgroup —— 返回组内的点总数

nprimitivesgroup —— 返回组内的面总数

nverticesgroup —— 返回组内的顶点总数


removeattrib —— 移除指定属性或组

removepoint —— 移除指定点

removeprim —— 移除指定面

removevertex —— 移除指定顶点


setprimvertex —— 将顶点重连接到不同的点

setvertexpoint —— 将顶点重连接到不同的点

setedgegroup —— 设置边组成员


expandedgegroup —— 返回边点列表

inedgegroup —— 是否在指定的边组

nedgesgroup —— 返回组内的边数

uvintersect —— 计算在UV空间内射线交点

vertexcurveparam —— 沿着面的周长返回顶点参数坐标

clip —— 切割p0和p1之间的线段

geounwrap 


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_
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值