void ofApp::drawNormals(const ofMesh& mesh){ for(int i = 0; i < mesh.getVertices().size(); i++){ ofVec3f n = mesh.getNormal(i); ofVec3f v = mesh.getVertex(i); ofPushStyle(); ofSetColor(0, 255, 0); ofLine(v.x, v.y, v.z, v.x + (n.x*4), v.y + (n.y*4), v.z + (n.z*4) ); ofPopStyle(); } }
ofMesh SurfaceCoons::surfaceTesselation5(const ofMesh &mesh){ // pour chaque poly, ajouter sommet central ofMesh meshret; meshret.setMode(OF_PRIMITIVE_LINES); vector<ofVec3f> vectorPts; vector<ofVec3f> vectorNormalPts; vector<ofVec3f> vectorSommetsArrets; vector<ofVec3f> vectorNormalSommetsArrets; int N = mesh.getVertices().size()/8; for(int i = 0; i < N; i++){ vectorPts.push_back(mesh.getVertex(8*i)); vectorNormalPts.push_back(mesh.getNormal(8*i)); vectorPts.push_back(mesh.getVertex(8*i+2)); vectorNormalPts.push_back(mesh.getNormal(8*i+2)); vectorPts.push_back(mesh.getVertex(8*i+4)); vectorNormalPts.push_back(mesh.getNormal(8*i+4)); vectorPts.push_back(mesh.getVertex(8*i+6)); vectorNormalPts.push_back(mesh.getNormal(8*i+6)); ofVec3f sommetCentral = vectorPts[0]/4 + vectorPts[1]/4 + vectorPts[2]/4 + vectorPts[3]/4; ofVec3f normalCentral = vectorNormalPts[0]/4 + vectorNormalPts[1]/4 + vectorNormalPts[2]/4 + vectorNormalPts[3]/4; // pour chaque arret, ajouter sommet // trouver triangle adjacent (fct) vectorSommetsArrets.push_back(vectorPts[0]/2 + vectorPts[1]/2); vectorNormalSommetsArrets.push_back(vectorNormalPts[0]/2 + vectorNormalPts[1]/2); vectorSommetsArrets.push_back(vectorPts[1]/2 + vectorPts[2]/2); vectorNormalSommetsArrets.push_back(vectorNormalPts[1]/2 + vectorNormalPts[2]/2); vectorSommetsArrets.push_back(vectorPts[2]/2 + vectorPts[3]/2); vectorNormalSommetsArrets.push_back(vectorNormalPts[2]/2 + vectorNormalPts[3]/2); vectorSommetsArrets.push_back(vectorPts[3]/2 + vectorPts[0]/2); vectorNormalSommetsArrets.push_back(vectorNormalPts[3]/2 + vectorNormalPts[0]/2); // pour chaque arret, ajouter arret // central-arret for(int j = 0; j < 4; j++){ meshret.addVertex(sommetCentral); meshret.addColor(ofFloatColor(1, 1, 0)); meshret.addNormal(normalCentral); meshret.addVertex(vectorSommetsArrets[j]); meshret.addColor(ofFloatColor(1, 1, 0)); meshret.addNormal(vectorNormalSommetsArrets[j]); meshret.addVertex(vectorSommetsArrets[j]); meshret.addColor(ofFloatColor(1, 1, 0)); meshret.addNormal(vectorNormalSommetsArrets[j]); int l = j + 1; if(j == 3){ l = 0; } meshret.addVertex(vectorPts[l]); meshret.addColor(ofFloatColor(1, 1, 0)); meshret.addNormal(vectorNormalPts[l]); meshret.addVertex(vectorPts[l]); meshret.addColor(ofFloatColor(1, 1, 0)); meshret.addNormal(vectorNormalPts[l]); int k = j + 1; if(j == 3){ k = 0; } meshret.addVertex(vectorSommetsArrets[k]); meshret.addColor(ofFloatColor(1, 1, 0)); meshret.addNormal(vectorNormalSommetsArrets[k]); meshret.addVertex(vectorSommetsArrets[k]); meshret.addColor(ofFloatColor(1, 1, 0)); meshret.addNormal(vectorNormalSommetsArrets[k]); meshret.addVertex(sommetCentral); meshret.addColor(ofFloatColor(1, 1, 0)); meshret.addNormal(normalCentral); } vectorPts.clear(); vectorSommetsArrets.clear(); vectorNormalPts.clear(); vectorNormalSommetsArrets.clear(); } return meshret; }
ofMesh SurfaceCoons::surfaceTesselation4(const ofMesh &mesh){ // pour chaque poly, ajouter sommet central vector<ofVec3f> tempVector; ofMesh meshret; meshret.setMode(OF_PRIMITIVE_LINES); vector<ofVec3f> vectorPts; vector<ofVec3f> vectorNormalPts; vector<ofVec3f> vectorSommetsArrets; vector<ofVec3f> vectorNormalSommetsArrets; int N = mesh.getVertices().size()/3; for(int i = 0; i < N; i++){ vectorPts.push_back(mesh.getVertex(3*i)); vectorNormalPts.push_back(mesh.getNormal(3*i)); vectorPts.push_back(mesh.getVertex(3*i+1)); vectorNormalPts.push_back(mesh.getNormal(3*i+1)); vectorPts.push_back(mesh.getVertex(3*i+2)); vectorNormalPts.push_back(mesh.getNormal(3*i+2)); ofVec3f sommetCentral = vectorPts[0]/3 + vectorPts[1]/3 + vectorPts[2]/3; ofVec3f normalCentral = vectorNormalPts[0]/3 + vectorNormalPts[1]/3 + vectorNormalPts[2]/3; // pour chaque arret, ajouter sommet // trouver triangle adjacent (fct) tempVector.clear(); tempVector = ArretTriangle::get2Triangles(m_at, vectorPts[0], vectorPts[1]); if(tempVector.size() == 6){ vectorSommetsArrets.push_back(vectorPts[0]/4 + vectorPts[1]/4 + (tempVector[0]/3 + tempVector[1]/3 + tempVector[2]/3)/4 + (tempVector[3]/3 + tempVector[4]/3 + tempVector[5]/3)/4); } else{ vectorSommetsArrets.push_back(vectorPts[0]/2 + vectorPts[1]/2); } vectorNormalSommetsArrets.push_back(vectorNormalPts[0]/2 + vectorNormalPts[1]/2); tempVector.clear(); tempVector = app::ArretTriangle::get2Triangles(m_at, vectorPts[1], vectorPts[2]); if(tempVector.size() == 6){ vectorSommetsArrets.push_back(vectorPts[1]/4 + vectorPts[2]/4 + (tempVector[0]/3 + tempVector[1]/3 + tempVector[2]/3)/4 + (tempVector[3]/3 + tempVector[4]/3 + tempVector[5]/3)/4); } else{ vectorSommetsArrets.push_back(vectorPts[1]/2 + vectorPts[2]/2); } vectorNormalSommetsArrets.push_back(vectorNormalPts[1]/2 + vectorNormalPts[2]/2); tempVector.clear(); tempVector = app::ArretTriangle::get2Triangles(m_at, vectorPts[2], vectorPts[0]); if(tempVector.size() == 6){ vectorSommetsArrets.push_back(vectorPts[2]/4 + vectorPts[0]/4+ (tempVector[0]/3 + tempVector[1]/3 + tempVector[2]/3)/4 + (tempVector[3]/3 + tempVector[4]/3 + tempVector[5]/3)/4); } else{ vectorSommetsArrets.push_back(vectorPts[2]/2 + vectorPts[0]/2); } vectorNormalSommetsArrets.push_back(vectorNormalPts[2]/2 + vectorNormalPts[0]/2); // pour chaque arret, ajouter arret // central-arret for(int j = 0; j < 3; j++){ meshret.addVertex(sommetCentral); meshret.addColor(ofFloatColor(1, 0, 1)); meshret.addNormal(normalCentral); meshret.addVertex(vectorSommetsArrets[j]); meshret.addColor(ofFloatColor(1, 0, 1)); meshret.addNormal(vectorNormalSommetsArrets[j]); meshret.addVertex(vectorSommetsArrets[j]); meshret.addColor(ofFloatColor(1, 0, 1)); meshret.addNormal(vectorNormalSommetsArrets[j]); int l = j + 1; if(j == 2){ l = 0; } meshret.addVertex(vectorPts[l]); meshret.addColor(ofFloatColor(1, 0, 1)); meshret.addNormal(vectorNormalPts[l]); meshret.addVertex(vectorPts[l]); meshret.addColor(ofFloatColor(1, 0, 1)); meshret.addNormal(vectorNormalPts[l]); int k = j + 1; if(j == 2){ k = 0; } meshret.addVertex(vectorSommetsArrets[k]); meshret.addColor(ofFloatColor(1, 0, 1)); meshret.addNormal(vectorNormalSommetsArrets[k]); meshret.addVertex(vectorSommetsArrets[k]); meshret.addColor(ofFloatColor(1, 0, 1)); meshret.addNormal(vectorNormalSommetsArrets[k]); meshret.addVertex(sommetCentral); meshret.addColor(ofFloatColor(1, 0, 1)); meshret.addNormal(normalCentral); } vectorPts.clear(); vectorSommetsArrets.clear(); vectorNormalPts.clear(); vectorNormalSommetsArrets.clear(); } return meshret; }