Beispiel #1
0
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();
    }
}
Beispiel #2
0
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;

}
Beispiel #3
0
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;

}