zoukankan      html  css  js  c++  java
  • Houdini vex 学习笔记(三)

    好久没有更新博客了,一直没时间。

    // 速度反射

    比如做飞镖打耙的效果,有的飞镖直接中靶插在上面,但也有可能有部分因为角度的原因被靶子反射的回来

    1  @v = @vprevious;  
    2  @hitangle = dot(normalize(@v),normalize(@hitnml));
    3   if (@hitangle < ch("angle_threshold")) {
    4         i@dobounce = 1;
    5         @v = reflect(@v, @hitnml) * ch("scale_bounce_velocity");

    @hitnml 是碰撞点的法线

     // 模型 Smooth 

    模型Smooth其实用vex实现不难,这段代码实现的是比较简单的Smooth效果,在一个案例中看到,觉得代码很简洁,可移植性很强,就贴这里,以备后用~

    1 int npts[] = neighbours(0, @ptnum);
    2 vector avg = @P;
    3 foreach (int npt; npts)
    4 {
    5     vector npos = point(0, 'P', npt);
    6     avg += npos;
    7 }
    8 avg /= len(npts)+1;
    9 @P = avg;

      // Quaternion 的旋转

    很少在vex中利用Quaternion 来旋转物体,感觉quaternion毕竟没有3x3矩阵来的直观,今天看到了一个范例,还蛮有意思

    1 //Rotate vector
    2 vector4 rot = quaternion(angle,v@spin);  // create quaternion
    3 pos = qrotate(rot,pos);    //rotate

    angle是float型弧度,spin是旋转轴(绕那个轴旋转)

     // Bend Curve

    法线和点的序号如下左图,

     

     旋转后的曲线右图 ( 旋转曲线的主要目的是利用wiredeform旋转模型)

    //array to hold positions because 
    //wrangle does not update attributes 
    //well in recursive loops
    vector positions[];
    //Fill pos array
    for (int i = 0; i < @numpt; i++){
        vector pos = point(0,"P",i);
        append(positions,pos); 
    }
    //Do recursive rotate for each point
    for (int i = 1; i < @numpt; i++){    
        float angle = point(0,"angle",i);
        angle *= ch("multiplier");
        //Rotate root position 
        vector root = positions[i-1];
        vector N = point(0,"N",i-1);  
        //Rotate every point above the root
        for (int k = i; k < @numpt; k++){    
            //Next position 
            vector pos = positions[k];           
            //Move to origin
            pos -= root;  
            //Rotate vector
            vector4 rot = quaternion(-angle,N);
            pos = qrotate(rot,pos); 
            //Return Position
            pos += root; 
            //Update Position
            positions[k] = pos;       
        }
    }
    //Set positions from array
    for (int i = 0; i < @numpt; i++){
        vector pos = positions[i];   
        setpointattrib(0,"P",i,pos); 
    }

     angle角度是一个渐变 ,根据@ptnum 逐渐增大 ,还可以加个Ramp 方便控制

     // Curve 上点的分布的调节(Spline函数)

    创建一个curve,resample一下(得到curveu属性)。如下图,端口1生成array,按顺序存入所有点的位置(P)

    相应的代码分别

    v[]@stemPs;
    for( int i = 0; i < npoints(0); i++)
    {
        vector thisP = point( 0, 'P', i);
        append( v[]@stemPs, thisP);
    }
    View Code

    最后的节点code(Run Over Points)

    vector keys[] = detail( 1, 'stemPs', 0);
    
    float lookUpLoc = pow( @curveu, ch('pow'));
    @P = spline( 'linear', lookUpLoc, keys);
    View Code

     这样控制pow参数的大小,可以控制点的分布;pow=1,点的分布不变,pow越大越向0号点聚集。下图是pow=1和pow=10的结果图

  • 相关阅读:
    开源项目
    测试面试话题8:测试人员如何让开发少写bug?
    其他
    接口平台
    001接口概念
    python3PIL模块实现图片加文字/小图片水印
    python3实现url编码/解码
    python3实现读取Excel进行接口自动化测试
    常用正则表达式
    Python3实现简单的接口性能测试
  • 原文地址:https://www.cnblogs.com/peng-vfx/p/8443394.html
Copyright © 2011-2022 走看看