import processing.core.PShape; //导入方法依赖的package包/类
public void updateAnim(){
if(pg_src_small == null){
createScene();
}
int num_x = pg_src_small.width;
int num_y = pg_src_small.height;
DwFilter.get(context).gaussblur.apply(pg_src, pg_src, pg_src_tmp, 3);
pg_src_small.beginDraw();
pg_src_small.image(pg_src, 0, 0, num_x, num_y);
pg_src_small.endDraw();
opticalflow.update(pg_src);
DwFilter.get(context).copy.apply(opticalflow.frameCurr.velocity, tex_vel_small);
flow = tex_vel_small.getFloatTextureData(flow);
DwFilter.get(context).gaussblur.apply(pg_src_small, pg_src_small, pg_src_small_tmp, 3);
pg_src_small.loadPixels();
float scene_dimx = bounds[3] - bounds[0];
float scene_dimy = bounds[4] - bounds[1];
float scene_dimz = bounds[5] - bounds[2];
float bounds_off = 100;
float dimx = (scene_dimx - bounds_off*2) / num_x;
float dimy = (scene_dimy - bounds_off*2) / num_y;
float dim = min(dimx, dimy);
float tx = -dim * num_x * 0.5f;
float ty = -dim * num_y * 0.5f;
float tz = 10;
for(int y = 0; y < num_y; y++){
for(int x = 0; x < num_x; x++){
int idx = y * num_x + x;
int rgb = pg_src_small.pixels[idx];
int r = (rgb >> 16) & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb >> 0) & 0xFF;
int flow_idx = (num_y - y - 1) * num_x + x;
float flows = 3;
float flowx = flow[flow_idx * 2 + 0] * +flows;
float flowy = flow[flow_idx * 2 + 1] * -flows;
float flow_mm = flowx*flowx + flowy*flowy;
float flow_m = (float) Math.pow(flow_mm, 0.5f);
float gray = (r + g + b) / (3f * 255f);
float px = x * dim;
float py = y * dim;
float pz = scene_dimz * gray * 0.25f + +flow_m;
pz = max(pz, 0);
PShape cube = shp_cubes[idx];
cube.resetMatrix();
cube.scale(dim);
cube.translate(tx+px, ty+py, tz+pz);
cube.setFill(rgb);
}
}
}