Houdini HDK 自制VEX函数 01

一、写在前面

由于是自制函数,并没有太多时间严格全方面测试,有bug请反馈

文件分享请等待

部分函数并非由用户使用角度出发设计,因此并不人性化,而是作为HDK教程的案例、展示C++写法等

所有函数均支持函数下拉提示(下面会提到)
预期,所有函数均佩戴黑框描述(下面会提到)
理论上所有涉及几何空间的函数,均支持三维空间,如下文多个求交点、求距离的函数。同,未大量测试,有bug请反馈

二、总览

Houdini HDK 自制VEX函数 01_第1张图片
会随着文章更新,不断增加


三、讲解(上)

(1)factorial

阶乘,就是高中数学那个阶乘,5!=5 * 4 * 3 * 2 * 1,就是从你指定的数,一直乘到1为止
用于展示HDK/C++的递归写法

支持函数名提示(后续所有函数均支持、无必要则不再反复放图)
Houdini HDK 自制VEX函数 01_第2张图片
支持函数用法(即黑框提示)(后续所有函数均支持、无必要则不再反复放图)
Houdini HDK 自制VEX函数 01_第3张图片

(2)cnk

就是高中数学的那个二项式定理的二项式系数
Houdini HDK 自制VEX函数 01_第4张图片

(3)linepointdistance

点到直线的距离
直线是无限长的,注意区分线段、射线的概念

线使用两端点坐标表示

第七行 prt() 是我自己制作的精简版printf,大概在会在讲解(中)或者讲解(下)轮到
2022年发的prt功能讲解
Houdini HDK 自制VEX函数 01_第5张图片
Houdini HDK 自制VEX函数 01_第6张图片

(4)segmentpointdistance2

点到线段的距离的平方

暂时不建议使用

(5)segmentsegmentdistance

线段到线段的距离

按最近距离来
box为方向参考,可忽略
Houdini HDK 自制VEX函数 01_第7张图片

(6)linelineintersect

直线到直线的距离

VEX新手注意,这是一个比较少见的用法 红线处 vector & intersect_pos
VEX新手注意,这是一个比较少见的用法 与其他常见函数的描述不同,用法也不同,这里多了个 &
VEX新手注意,这是一个比较少见的用法 用法:需要提前定义一个空变量,放入函数参数中,执行完函数这一行后,这个变量里面就不是空的了,会有值存在里面

由于有多个返回值(超过两个返回值),所以必须使用这种方法输出多个返回值,之后也会有这个用法的函数,就不再提了
其中float val返回的是两条直线平行的程度,越接近0则越平行
这个函数还有个问题,如果两条直线没有交点,函数也会返回一个坐标,我猜测是无交情况下,他们俩之间最近的点或者中点什么的
Houdini HDK 自制VEX函数 01_第8张图片
上面的图目前有点问题,出02的时候一起改掉
下面的图是最新的,是对的

参数同 (5)segmentsegmentdistance
pos0、pos1分别为最近点
Houdini HDK 自制VEX函数 01_第9张图片

四、总之

不完善的地方理解一下,这个很费时间

富 哥 可 以 v 我 5 0 , 讠身寸 讠身寸


五、(5)(6)实战案例

使用b站 落于ivi 分享的 Houdini 获取两条线条之间最近距离的数值(工具分享) 作为案例

a. 原方法

节点的黄色区域为原本方法
Houdini HDK 自制VEX函数 01_第10张图片

a. 新方法

节点中红色区域为使用自制vex函数的新方法
Houdini HDK 自制VEX函数 01_第11张图片

float min_d = 9999;
vector ipos0;
vector ipos1;
for(int i=0;i<npoints(0)-1;i++)
{
    for(int j=0;j<npoints(1)-1;j++)
    {
        vector p0 = point(0,'P',i);
        vector p1 = point(0,'P',i+1);
        vector p2 = point(1,'P',j);
        vector p3 = point(1,'P',j+1);
        float d = segmentsegmentdistance_R(p0,p1,p2,p3);
        if(d<min_d)
        {
            min_d = d;
            vector pos0;
            vector pos1;
            linelineintersect_R(p0,p1,p2,p3,pos0,pos1);
            ipos0 = pos0;
            ipos1 = pos1;
        }
            
    }
}
addpoint(0,ipos0);
addpoint(0,ipos1);
prt(min_d);

你可能感兴趣的:(Houdini,HDK,自制VEX函数,houdini,算法)