VEX —— Half-edges

目录

一,概述

二,等效

三,函数

四,案例

Dual Mesh

Mesh Subdividsion

Mesh Bevel


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

一,概述

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

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

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

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

二,等效

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

        半边的源顶点(目标顶点)可唯一标识它,意味着,一给定源顶点最多只能有一条半边;这是因为一个顶点只能属于一个面;然而,由于多个顶点可以被连接到一个点,半边可共享源和目标点(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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/175116.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM App ≈ 数据ETL管线

虽然现有的 LLM 应用程序工具&#xff08;例如 LangChain 和 LlamaIndex&#xff09;对于构建 LLM 应用程序非常有用&#xff0c;但在初始实验之外不建议使用它们的数据加载功能。 当我构建和测试我的LLM应用程序管道时&#xff0c;我能够感受到一些尚未开发和破解的方面的痛苦…

微服务的注册发现和微服务架构下的负载均衡

文章目录 微服务注册模型服务注册与发现怎么保证高可用【1. 服务端崩溃检测】【2. 客户端容错】【3. 注册中心选型】 微服务架构下的负载均衡【1.轮询与加权轮询】【2.随机与加权随机】【3.哈希与一致性哈希】【4.最少连接数】【5.最少活跃数】【6.最快响应时间】【总结】 负载…

DNA甲基化的相关知识

目录 1. DNA甲基化简介 2. 原理 3. 酶分类 4. DNA甲基化类型 5.机制 6. 十大DNA甲基化研究核心问题 6.1 植物中的甲基化 6.2 植物中DNA甲基化的主要功能 6.3 DNA甲基化作为生物标志物的潜力 6.4 DNA甲基化检测方法 1. DNA甲基化简介 DNA甲基化&#xff08;DNA methy…

基于FPGA的图像RGB转HLS实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1计算最大值和最小值 4.2计算亮度L 4.3计算饱和度S 4.4计算色调H 5.算法完整程序工程 1.算法运行效果图预览 将FPGA结果导入到MATLAB显示效果&#xff1a; 2.算法运行软件版本 Vivado…

LeetCode(14)加油站【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 134. 加油站 1.题目 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加…

「Verilog学习笔记」用优先编码器①实现键盘编码电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 用此编码器实现键盘的编码电路。 注意&#xff1a;编码器的输出是低电平有效&#xff0c;而键盘编码电路输出的是正常的8421BCD码&#xff0c;是高电平有效。因此将编…

opencv车牌识别<一>

目录 一、概述 二、ANPR简介 一、概述 本文将介绍创建自动车牌识别(Automatic Number Plate Recognition&#xff0c;ANPR)所需的步骤。对于不同的情形&#xff0c;实现自动车牌识别会用不同的方法和技术&#xff0c;例如&#xff0c;IR 摄像机、固定汽车位置、光照条件等…

C/C++轻量级并发TCP服务器框架Zinx-框架开发001: 读取标准输入,回显到标准输出

文章目录 完整代码实现参考-非项目使用项目使用的代码 - 乱-但是思路与上面的相同创建Kernel类添加删除修改epoll&#xff0c;才能写run方法创建stdin_Channel类在Kernel类中实现run方法 完整代码实现参考-非项目使用 #include <errno.h> #include <signal.h> #in…

Leetcode—122.买卖股票的最佳时机II【中等】

2023每日刷题&#xff08;二十八&#xff09; Leetcode—122.买卖股票的最佳时机II 实现代码 int maxProfit(int* prices, int pricesSize) {int totalProfit 0;if(pricesSize < 1) {return 0;}for(int i 1; i < pricesSize; i) {if(prices[i] - prices[i - 1] > …

The 8th China Open Source Conference Successfully Concludes

由开源社主办的第八届中国开源年会&#xff08;COSCon23&#xff09;于 2023年10月29日在成都圆满收官。本次大会&#xff0c;为期两天&#xff0c;线下参会报名逾千人次&#xff0c;在线直播观看人数总计 168610 人&#xff0c;直播观看次数达 248725 次&#xff0c;官网累计浏…

使用VScode编译betaflight固件--基于windows平台

使用VScode编译betaflight固件--基于windows平台 1、使用git克隆betaflight的开源代码2、betaflight的代码框架分析&#xff1a;3、配置编译环境&#xff1a;4、VScode上编译 betaflight不仅可以在LInux上进行编译也可以在Windows上编译&#xff0c;本文主要介绍在windows平台上…

建设大型综合运维平台,对接集成多厂商网管系统

当前&#xff0c;云计算、大数据、人工智能等IT技术迅猛发展&#xff0c;企业的信息化步入了一个崭新的时代&#xff0c;企业规模不断壮大&#xff0c;业务不断拓展&#xff0c;企业信息化依赖的网络结构和IT技术越来越复杂。因建设时期等原因&#xff0c;企业网络中分布着不同…