美文网首页
Houdini VEX(十四)ForEach语句

Houdini VEX(十四)ForEach语句

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

一、简单的foreach


  • 代码:
//对于体积,并非只能用Volume Wrangle
//正如Attribute Wrangle其名,有属性就能用它;有point prim vertex就能用
//   aw可以读取和修改属性,vw可以读取和修改体积(体素)

float density[] = primintrinsic(0,'voxeldata',0);//获取intrinsic属性,
                                 //voxeldata:体素值的浮点数组
                                 
float maxValue = 0; //该变量用来存放最大值

foreach(float value; density)       //遍历density数组中的每一个浮点value
    maxValue = max(maxValue,value); // 上次的值 与 这次的值 对比,取最大的

setprimattrib(0,'name',0,sprintf('%s',maxValue)); 
//转成字符串赋予给name属性(也就是体积的名字)
//中键按住即可方便地观察体素的最大值
  • max函数:两个参数值进行比较,取最大值返回

二、for each 带序号形式

  • 代码:
//下列代码求 体积中 体素值在rangeMin~rangeMax范围内的体素 的数量占总体素量的百分比
float density[] = primintrinsic(0,'voxeldata',0);

float maxValue = 0;  //存放最大值
float minValue = 0;  //存放最小值
float rangeMax = chf('range_max');  //最大范围
float rangeMin = chf('range_min');  //最小范围
int sampleRate = int( rint( 1/chf('sample_rate') ) );
//采样率(跳过体素个数):用户输入0~1; rint()取最近整数返回浮点,如2.5=3.0,2.49=2.0,-0.6=-1; int()取整
//例如 用户输入   0 0.5 0.3 0.01  1    恰好0和1意味着完全采样
//sampleRate =  0  2   3  100   0
int count = 0;  //计数器

foreach(int id; float value; density) //遍历density数组中的每一个浮点value,
                                      //每循环一次,id+1
{                             
    if( id % sampleRate == 0 )  // 如sampleRate = 5,则每隔5个体素运行下列代码一次
    {
        maxValue = max(maxValue,value);
        minValue = min(minValue,value);
        if( value < rangeMax && value > rangeMin )//如果体素值符合范围
            ++count;                              //计数器+1
    }
}
printf('max = %s\n',maxValue);
printf('min = %s\n',minValue);
printf('percent = %s\n',float(count*sampleRate)/len(density));
// 百分比 = 计数结果*跳过体素个数 / 体素总数量

  • rint函数:进行四舍五入

相关文章

网友评论

      本文标题:Houdini VEX(十四)ForEach语句

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