VEX —— Half-edges

28 篇文章 4 订阅

目录

一,概述

二,等效

三,函数

四,案例

Dual Mesh

Mesh Subdividsion

Mesh Bevel


在一些VEX函数,可将看成为每个面非共享的半边

一,概述

        在houdini,边通常被视为面之间无方向共享的,然而,对于一些任务(如简化或清理几何体),将面视为拥有自己的边是非常有用的;

        可理解为,将无方向且共享的边,沿着其长度切成两条半边(half-edge),对于边界的边当然只有一条半边;

        每个半边是有方向的,起始于一个顶点终止于一个顶点;

        半边函数,可快速查找半边的源顶点和目标顶点、下一个半边、从相同边获取其他半边,查找共享点的所有半边等;

二,等效

        如两半边是从同一共享边切开的,则这两半边是等效的;如下图,三个面共享一条边,则此三条半边e/f/g也是等效的;方向性并不重要,即使方向相反,e/f/g也是等效的;

        半边的源顶点(和目标顶点)可唯一标识它,意味着,一给定源顶点最多只能有一条半边;这是因为一个顶点只能属于一个面;然而,由于多个顶点可以被连接到一个相同点point,半边可共享源和目标点(point);换一句话说等效,如它们的顶点被相同的两个点point共享,则两半边等效;

        一组等效半边中的其中一条被认为是主半边;vex函数,可检测一条给定的半边是否是主,或给定一非主半边查找其等效的主半边;在一条未共享的边,则仅有一条主半边;

三,函数

hedge_isvalid检测半边是否有效
hedge-isprimary检测半边是否是主
hedge-primary查找主等效半边,如是非共享的边,则返回自身;
hedge-isequiv测试两半边是否等效
hedge-nextequiv返回下一个等效半边,无等效半边返回自身;
hedge-equivcount获取等效半边的个数
hedge-srcvertex获取半边的源顶点
hedge-dstvertex获取半边的目标顶点
hedge-presrcvertex获取半边源顶点的前顶点,即上一个半边的源顶点;
hedge-postdstvertex获取半边目标顶点的后顶点,即下一个半边的目标顶点;
hedge-prim获取半边的所属的面
hedge-srcpoint获取半边的源点
hedge-dstpoint获取半边的目标点
hedge-presrcpoint获取半边的前源点
hedge-postdstpoint获取半边的后目标点
hedge-next获取面内的下一个半边
hedge-prev获取面内的前一个半边
pointedge查找两点间(源点和目标点)的半边,顺序不同,结果不同;
pointhedge

查找给定源和目标点的半边,

查找给定源点的半边,多个半边返回较小的;

pointhedgenext返回共享给定源点半边的下一个半边
vertexhedge获取给定源顶点的半边
primhedge获取给定面上的任意一条半边

四,案例

Dual Mesh

//点层级,Dual mesh,类似divide节点的Dual功能
int hedge = pointhedge(0, @ptnum);
int ncount = neighbourcount(0, @ptnum);
int pts[];

for(int i=0; i<ncount; i++){
    int prim = hedge_prim(0, hedge);
    vector pos = prim(0, 'P', prim);
    int pt = addpoint(0, pos);
    append(pts, pt);
    
    hedge = hedge_prev(0, hedge);
    hedge = hedge_nextequiv(0, hedge);
}

addprim(0, 'poly', pts);

int prims[] = pointprims(0, @ptnum);
foreach(int prim; prims){
    removeprim(0, prim, 1);
}

Mesh Subdividsion

//prim层级,subdivide
int hedge = primhedge(0, @primnum);
int start = hedge;

while(hedge != -1){
    int pt1 = addpoint(0, @P);
    
    int nhedge = hedge_nextequiv(0, hedge);
    int nprim = hedge_prim(0, nhedge);
    vector npos = prim(0, 'P', nprim);
    int pt2 = addpoint(0, npos);
    
    int srcpt = hedge_srcpoint(0, hedge);
    
    int tri = addprim(0, 'poly', pt1, srcpt, pt2);
    
    hedge = hedge_next(0, hedge);
    if(hedge == start)
       break;
}

removeprim(0, @primnum, 1);

Mesh Bevel

//point层级
int hedge = pointhedge(0, @ptnum);
int ncount = neighbourcount(0, @ptnum);
int pts[];

for(int i=0; i<ncount; i++){
    int dstpt = hedge_dstpoint(0, hedge);
    vector dstpos = point(0, 'P', dstpt);
    vector pos = @P + (dstpos-@P)*ch('ratio');
    int pt = addpoint(0, pos);
    append(pts, pt);
    
    hedge = hedge_prev(0, hedge);
    hedge = hedge_nextequiv(0, hedge);

}

addprim(0, 'poly', pts);

int prims[] = pointprims(0, @ptnum);
foreach(int prim; prims){
    removeprim(0, prim, 1);
}
//prim层级
int hedge = primhedge(0, @primnum);
int start = hedge;
int pts[];

while(hedge != -1){
    int srcpt = hedge_srcpoint(0, hedge);
    int dstpt = hedge_dstpoint(0, hedge);
    
    vector srcpos = point(0, 'P', srcpt);
    vector dstpos = point(0, 'P', dstpt);
    
    vector pos1 = srcpos + (dstpos-srcpos)*ch('ratio');
    vector pos2 = dstpos + (srcpos-dstpos)*ch('ratio');
    
    append(pts, addpoint(0, pos1));
    append(pts, addpoint(0, pos2));
    
    hedge = hedge_next(0, hedge);
    if(hedge == start)
        break;    
}

addprim(0, 'poly', pts);
removeprim(0, @primnum, 1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值