上面for是细分。下面measure是获取面积,再下面是纠正法线
代码
float seed = chf("seed");
int pts[]=primpoints(0,@primnum);
string gp = itoa(@primnum);
vector bbmin = getbbox_min(0,gp);
vector bbmax = getbbox_max(0,gp);
vector bbsize = getbbox_size(0,gp);
int cutdir;
if (bbsize.x > bbsize.z)
cutdir =0;
else
cutdir = 1;
float cutpos = fit01(rand(@primnum + seed),0.1,0.9);
// Subdivision
vector cut = lerp(bbmin,bbmax,cutpos);
vector pos;
int newpt;
if (cutdir == 0 ){
// first quad
int newprim = addprim(0,"poly");
pos = bbmin;
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
pos = set(cut.x,bbmin.y,bbmin.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
pos = set(cut.x,bbmin.y,bbmax.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
pos = set(bbmin.x,bbmin.y,bbmax.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
// second quad
newprim = addprim(0,"poly");
pos = set(cut.x,bbmin.y,bbmin.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
pos = set(bbmax.x,bbmin.y,bbmin.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
pos = set(bbmax.x,bbmin.y,bbmax.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
pos = set(cut.x,bbmin.y,bbmax.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
}else{
// first quad
int newprim = addprim(0,"poly");
pos = bbmin;
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
pos = set(bbmin.x,bbmin.y,cut.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
pos = set(bbmax.x,bbmin.y,cut.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
pos = set(bbmax.x,bbmin.y,bbmin.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
// second quad
newprim = addprim(0,"poly");
pos = set(bbmin.x,bbmin.y,cut.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
pos = set(bbmin.x,bbmin.y,bbmax.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
pos = bbmax;
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
pos = set(bbmax.x,bbmin.y,cut.z);
newpt = addpoint(0,pos);
addvertex(0,newprim,newpt);
}
removeprim(0,@primnum,1);