1-4期
195人加入学习
(33人评价)
Houdini 影视特效实验班

6个月零基础到入职

价格 ¥ 6198.00
教学计划
承诺服务

int temp_array[] = point(0, "already_taken", 0);

for(int i = 0; i < npoints(0); i++){
    
    vector current_P = point(0, "P", i);
    int current_id = point(0, "id", i);
    int branch_count_temp = point(0, "branch_count", i);
    int branch_time_temp = point(0, "branch_time", i);
    
    if(branch_count_temp > -1 && branch_count_temp <= branch_time_temp){
        branch_count_temp += 1;
        setpointattrib(0, "branch_count", i, branch_count_temp, "set");
    }else if(branch_count_temp > -1 && branch_count_temp > branch_time_temp){
        branch_count_temp = -1;
        setpointattrib(0, "branch_count", i, branch_count_temp, "set");
        
        setpointattrib(0, "Cd", i, {0,0,0}, "set");
    }
    
    
    float seach_radius = chf("seach_radius");
    int max_points = chi("max_points");
    
    int found_ptnum;
    
    float id_seed = rand(current_P * @Frame);
    
    int handle = pcopen(1, "P", current_P, seach_radius, max_points);
    while(pciterate(handle)){
        pcimport(handle, "point.number", found_ptnum);
        
        int bool_A = branch_count_temp == -1 ? 1 : 0;
        int array_check = find(temp_array, found_ptnum);
        int bool_B = array_check < 0 ? 1 : 0;
        int bool_C = id_seed > chf("id_shreshold") ? 1 : 0;
        int bool_D = rand(found_ptnum + 343 * @Frame) > chf("found_ptnum_threshold") ? 1 : 0;
        
        if(bool_A && bool_B && bool_C && bool_D){
            setpointattrib(0, "branch_point", i, found_ptnum, "set");
            setpointattrib(0, "branch_count", i, branch_count_temp + 1, "set");
            
            append(temp_array, found_ptnum);
            temp_array = sort(temp_array);
            
            setpointattrib(0, "Cd", i, {1,0,0}, "set");
            
            break;
        }
    }
    pcclose(handle);
}
setpointattrib(0, "already_taken", 0, temp_array, "set");

 

我终于弄明白了这些VEX代码的意思,并且简单的进行了一个排序,让它看起来更加符合逻辑,整个学下来,这么说吧,这套VEX代码是专门为这种分支闪电开发出来的,我实在是想不到在别的什么地方这一套代码有什么样的应用,而且,其实可以完全手动的进行添加分支线,具体方法是这样的,通过blast节点选出想要进行分支的点,然后把这个点投射到目标物体上,把两个点进行连接,重采样,进行扰乱,形成闪电的形状,甚至可以再添加polywire形成一个mesh,mesh的粗细可以通过重采样节点的curveu属性进行控制(因为有些公司不使用houdini来渲染,需要导出一个polygon给到材质组渲染,如果只是在houdini里面渲染,可以直接渲染线条,添加一个@width属性就可以控制线条的粗细),主体闪电和分支闪电都可以用group节点,使用一个object进行打组,再进行删除key帧,这样就有闪电从无到有再从有到无的一个变化,然后通过trail节点来进行速度计算(或者可以在线条还没有进行扰乱的时候添加一个同一方向的速度),渲染运动模糊,不过闪电一般都是高亮渲染,即使有运动模糊也不是很看得出来,这样级别的运动模糊也完全可以后期加。我说的这种办法虽然操作起来很麻烦,也不够那么程序化,用到的节点会比较多,但是控制更加灵活,无论导演对哪一根闪电有什么样的要求都可以进行修改,而这一套VEX代码想要修改具体的哪一根闪电,实现起来难上加难

[展开全文]

float id_seed竟然是=cur_P *@Frame

cur_P是个矢量,乘以帧号得出了一个浮点?(这里F一定要大写,小写不行)

 

保持代码的轻量化,不浪费内存,开启点云后要关闭点云pcclose(handle)

[展开全文]