/** @def This function simulate the movement of the cloud mesh, it requires that every point is associated with a Particle data structure @param MeshModel cloud - Mesh of points @param Point3f force - Direction of the force @param float l - Lenght of the movementstep @param float t - Time Step @return nothing */ void MoveCloudMeshForward(MeshModel *cloud,MeshModel *base,Point3f g,Point3f force,float l,float a,float t,int r_step){ CMeshO::PerVertexAttributeHandle<Particle<CMeshO> > ph = Allocator<CMeshO>::GetPerVertexAttribute<Particle<CMeshO> >(cloud->cm,"ParticleInfo"); CMeshO::VertexIterator vi; for(vi=cloud->cm.vert.begin();vi!=cloud->cm.vert.end();++vi) if(!vi->IsD()) MoveParticle(ph[vi],&*vi,l,t,force,g,a); //Handle falls Particle ComputeParticlesFallsPosition(base,cloud,g); //Compute Particles Repulsion for(int i=0;i<r_step;i++) ComputeRepulsion(base,cloud,50,l,g,a); }
/** This function compute the repulsion beetwen particles @param MeshModel* b_m - base mesh @param MeshModel* c_m - cloud of points @param int k - max number of particle to repulse @param float l - lenght of the step @return nothing - adhesion factor */ void ComputeRepulsion(MeshModel* b_m,MeshModel *c_m,int k,float l,Point3f g,float a){ CMeshO::PerVertexAttributeHandle<Particle<CMeshO> > ph = Allocator<CMeshO>::GetPerVertexAttribute<Particle<CMeshO> >(c_m->cm,"ParticleInfo"); MetroMeshVertexGrid v_grid; std::vector< Point3<float> > v_points; std::vector<CMeshO::VertexPointer> vp; std::vector<float> distances; v_grid.Set(c_m->cm.vert.begin(),c_m->cm.vert.end(),b_m->cm.bbox); CMeshO::VertexIterator vi; for(vi=c_m->cm.vert.begin();vi!=c_m->cm.vert.end();++vi){ vcg::tri::GetKClosestVertex(c_m->cm,v_grid,k,vi->P(),EPSILON,vp,distances,v_points); for(unsigned int i=0;i<vp.size();i++){CMeshO::VertexPointer v = vp[i]; if(v->P()!=vi->P() && !v->IsD() && !vi->IsD()){ Ray3<float> ray(vi->P(),fromBarCoords(RandomBaricentric(),ph[vp[i]].face)); ray.Normalize(); Point3f dir=ray.Direction(); dir.Normalize(); MoveParticle(ph[vp[i]],vp[i],0.01,1,dir,g,a); } } } }