美文网首页
Houdini VEX(十七)自定义函数

Houdini VEX(十七)自定义函数

作者: Joe_Game | 来源:发表于2019-08-08 21:21 被阅读0次

    一、自定义函数的目的:把我们常用的一些代码打包起来

    • 示例:
    /*
    function 关键词 可加可不加
    float 是该函数的返回类型,如果返回类型是void,代码中不需要return
    mydot 是函数名字
    a,b 是函数参数(由用户提供) 
    vector 是参数类型,相同类型可用逗号隔开;
                     不同类型必须用分号,比如(vector a;float b)
    const意味着只读 不可写
    */
    function float mydot(const vector a,b)
    {
        float c = a.x*b.x + a.y*b.y + a.z*b.z;
        return c;//必须有return关键词,返回浮点c
        //如果返回类型是void,不需要return
    }
    //函数重载,相同函数名下,可以有不同的参数类型和不同的返回类型
    function float mydot(const vector2 a,b)
    {
        return a.x*b.x + a.y*b.y;//return一个式子,式子计算结果是浮点
    }
    //@Cd = mydot({0,1,0},@N);
    //@Cd = dot({0,1,0},@N);
    
    vector2 pos = set(@P);//set函数将三维变量转为二维
    @Cd = mydot({1,0},pos);
    
    //可以有多个return关键词
    function int mymax( const int a,b)
    {
        //a*=2; //这样做会报错,因为const int b只能读不能写
        if(a>=b)
            return a;
        else
            return b;
    }
    int c = 10;
    printf('%s\n',mymax(c,2));
    printf('%s\n',c);
    
    //参数always passed by reference,总是引用,不是拷贝
    //意味着如果在函数中修改了参数变量,这个变量就改变了
    //为了避免意外地改变参数,可以加上const关键词
    function void acrossb(vector a;const vector b)
    {
        //自定义函数里面可以使用vex自带函数
        //a = set(a.y*b.z-a.z*b.y, a.z*b.x-a.x*b.z, a.x*b.y-a.y*b.x);
        //自定义函数里面还可以再次自定义函数[nested function]
        function vector myset(const float a,b,c)
        {
            vector result = 0;
            result.x = a;
            result.y = b;
            result.z = c;
            return result;
        }
        a = myset(a.y*b.z-a.z*b.y, a.z*b.x-a.x*b.z, a.x*b.y-a.y*b.x);
    }
    @N = @P;
    //@N = cross({0,1,0},@N); //vex自带cross不修改参数,而是返回向量
    //acrossb({0,1,0},@N); //不能改变纯数值
    acrossb(@N, {0,1,0}); //改变了@N
    
    

    相关文章

      网友评论

          本文标题:Houdini VEX(十七)自定义函数

          本文链接:https://www.haomeiwen.com/subject/trifjctx.html