Renderer(){ mesh = 0; auto modelMesh = static_cast<IndexedMesh*>(Mesh::LoadWavefront<IndexedMesh>(MODELS_DIR "/suzanne.obj")); float area = modelMesh->getArea(); int numPoints = 2000; K3DTree<glm::vec3> pointCloud; glm::vec3 minP = modelMesh->getBoundingAABB().minPos(); glm::vec3 maxP = modelMesh->getBoundingAABB().maxPos(); minP.x = std::min(std::min(minP.x,minP.y),minP.z); maxP.x = std::max(std::max(maxP.x,maxP.y),maxP.z); minP.z = minP.y = minP.x; maxP.z = maxP.y = maxP.x; auto triangles = modelMesh->getFaces(); for(auto tri = triangles.begin();tri!=triangles.end();++tri){ float p = numPoints * (tri->area() / area); int points = std::floorf(p + 0.5); for(int i = 0;i<points;i++){ auto p = Random::getRandomGenerator()->inTriangle(*tri); p -= minP; p /= (maxP-minP); surfPoints.push_back(p); pointCloud.insert(p,glm::vec3(0,0,0)); } } std::vector<glm::vec3> closePoints; IT_FOR(pointCloud,point){ auto nodes = pointCloud.findNNearest(point->getPosition(),10); closePoints.clear(); IT_FOR(nodes,p){ closePoints.push_back(glm::vec3((*p)->getPosition()[0],(*p)->getPosition()[1],(*p)->getPosition()[2])); }
Mesh* ModelLoaderMD3::Surface::getObject(size_t frame) const { const vector<vec3> verticesArray = getVertices(vertices + frame*header.numVerts, header.numVerts); const vector<vec3> normalsArray = getNormals(vertices + frame*header.numVerts, header.numVerts); const vector<vec2> texcoordsArray = getTexCoords(texCoords, header.numVerts); const vector<Face> facesArray = getFaces(triangles, header.numTris); return new Mesh(verticesArray, normalsArray, texcoordsArray, facesArray); }
//reads in an object from a .obj file BasicObject::BasicObject(const std::string &filename, const float _shininess){ shininess = _shininess; _numVerticies = numVertices(filename.c_str()); _numFaces = numFaces(filename.c_str()); _indexCount = _numFaces * 3; verticies = getVertices(filename.c_str(), _numVerticies); normals = getNormals(filename.c_str(), _numVerticies); faces = getFaces(filename.c_str(), _numFaces); texCoords = getTextureCoords(filename.c_str(), _numVerticies); }
void Mesh::viiRelatedFaces(Vertex* point, float radius, std::set<Face*>& catA,//Alle Vertices sind im Kreis std::set<Face*>& catB,//Zwei Vertices sind im Kreis std::set<Face*>& catC)//ein Vertice ist im Kreis { std::set<Face*> faces = getFaces(); Vector3 posPoint = point->getPosition(); for(std::set<Face*>::iterator i = faces.begin();i!=faces.end();i++) { Face* face = *i; int verticesInSphere = 0; //verticesInSphere = 0; Vector3 distance = posPoint - face->getA()->getPosition(); if(distance.getLength() <= radius) { ++verticesInSphere; } distance = posPoint - face->getB()->getPosition(); if(distance.getLength() <= radius) { ++verticesInSphere; } distance = posPoint - face->getC()->getPosition(); if(distance.getLength() <= radius) { ++verticesInSphere; } switch(verticesInSphere) { case 1: { catC.insert(face); break; } case 2: { catB.insert(face); break; } case 3: { catA.insert(face); break; } } } }
Mesh* ModelLoaderMD2::buildKeyFrame(const Material &skin, const Header &header, TexCoord *texCoords, Triangle *triangles, const Frame &frame) { const vector<vec3> verticesArray = getVertices(frame.vertices, header.numOfVertices, frame.scale, frame.translate); const vector<vec3> normalsArray = getNormals(frame.vertices, header.numOfVertices); const vector<vec2> texcoordsArray = getTexCoords(texCoords, header.numOfSt, header.skinWidth, header.skinHeight); const vector<Face> facesArray = getFaces(triangles, header.numOfTris); Mesh *mesh = new Mesh(verticesArray, normalsArray, texcoordsArray, facesArray); mesh->material = skin; return mesh; }
/** * Simplifies a mesh, merging the faces with vertex v that come from the same face. * @param oldFaces sequence of old mesh faces obtained from the merge * @param newFaces sequence of new mesh faces obtained from the merge * @param vertices sequence of indexs (v1 ... vi = v ... vn) where : * v is the current vertex to test, * vj (j < i) are tested vertices, * vk (k >= i) are vertices required to test to merge vj * (so if a vertex vk can't be merged, the merge is not possible). * @return true if the vertex v was 'merged' (obviously it could require to test * some new vertices that will be added to the vertices list) */ bool BOP_Merge::mergeFaces(BOP_Faces &oldFaces, BOP_Faces &newFaces, BOP_Indexs &vertices, BOP_Index v) { bool merged = true; // Get faces with v that come from the same original face, (without the already 'merged' from vertices) BOP_LFaces facesByOriginalFace; getFaces(facesByOriginalFace,vertices,v); if (facesByOriginalFace.size()==0) { // All the faces with this vertex were already merged!!! return true; } else { // Merge faces const BOP_IT_LFaces facesEnd = facesByOriginalFace.end(); for(BOP_IT_LFaces facesByOriginalFaceX = facesByOriginalFace.begin(); (facesByOriginalFaceX != facesEnd)&&merged; facesByOriginalFaceX++) { merged = mergeFaces((*facesByOriginalFaceX),oldFaces,newFaces,vertices,v); } } return merged; }
/** * Simplifies a mesh, merging the faces with the specified vertices. * @param mergeVertices vertices to test * @return true if a face merge was performed */ bool BOP_Merge2::mergeFaces(BOP_Indexs &mergeVertices) { // Check size > 0! if (mergeVertices.size() == 0) return false; bool didMerge = false; for( BOP_Index i = 0; i < mergeVertices.size(); ++i ) { BOP_LFaces facesByOriginalFace; BOP_Index v = mergeVertices[i]; BOP_Vertex *vert = m_mesh->getVertex(v); #ifdef BOP_DEBUG cout << "i = " << i << ", v = " << v << ", vert = " << vert << endl; if (v==48) cout << "found vert 48" << endl; #endif if ( vert->getTAG() != BROKEN ) { getFaces(facesByOriginalFace,v); switch (facesByOriginalFace.size()) { case 0: // v has no unbroken faces (so it's a new BROKEN vertex) freeVerts( v, vert ); vert->setTAG(BROKEN); break; case 2: { #ifdef BOP_DEBUG cout << "size of fBOF = " << facesByOriginalFace.size() << endl; #endif BOP_Faces ff = facesByOriginalFace.front(); BOP_Faces fb = facesByOriginalFace.back(); BOP_Index eindexs[2]; int ecount = 0; // look for two edges adjacent to v which contain both ofaces BOP_Indexs edges = vert->getEdges(); #ifdef BOP_DEBUG cout << " ff has " << ff.size() << " faces" << endl; cout << " fb has " << fb.size() << " faces" << endl; cout << " v has " << edges.size() << " edges" << endl; #endif for(BOP_IT_Indexs it = edges.begin(); it != edges.end(); ++it ) { BOP_Edge *edge = m_mesh->getEdge(*it); BOP_Indexs faces = edge->getFaces(); #ifdef BOP_DEBUG cout << " " << edge << " has " << edge->getFaces().size() << " faces" << endl; #endif if( faces.size() == 2 ) { BOP_Face *f0 = m_mesh->getFace(faces[0]); BOP_Face *f1 = m_mesh->getFace(faces[1]); if( f0->getOriginalFace() != f1->getOriginalFace() ) { #ifdef BOP_DEBUG cout << " " << f0 << endl; cout << " " << f1 << endl; #endif eindexs[ecount++] = (*it); } } } if(ecount == 2) { #ifdef BOP_DEBUG cout << " edge indexes are " << eindexs[0]; cout << " and " << eindexs[1] << endl; #endif BOP_Edge *edge = m_mesh->getEdge(eindexs[0]); BOP_Index N = edge->getVertex1(); if(N == v) N = edge->getVertex2(); #ifdef BOP_DEBUG cout << " ## OK, replace "<<v<<" with "<<N << endl; #endif mergeVertex(ff , v, N ); mergeVertex(fb , v, N ); // now remove v and its edges vert->setTAG(BROKEN); for(BOP_IT_Indexs it = edges.begin(); it != edges.end(); ++it ) { BOP_Edge *tedge = m_mesh->getEdge(*it); tedge->setUsed(false); } didMerge = true; } #ifdef BOP_DEBUG else { cout << " HUH: ecount was " << ecount << endl; } #endif } break; default: break; } } } return didMerge; }
bool FacemarkKazemiImpl::calcMeanShape (vector< vector<Point2f> >& trainlandmarks,vector<Mat>& trainimages,std::vector<Rect>& faces){ //clear the loaded meanshape if(trainimages.empty()||trainlandmarks.size()!=trainimages.size()) { // throw error if no data (or simply return -1?) CV_ErrorNoReturn(Error::StsBadArg, "Number of images is not equal to corresponding landmarks. Aborting..."); } meanshape.clear(); vector<Mat> finalimages; vector< vector<Point2f> > finallandmarks; float xmean[200] = {0.0}; //array to store mean of y coordinates float ymean[200] = {0.0}; size_t k=0; //loop to calculate mean Mat warp_mat,src,C,D; vector<Rect> facesp; Rect face; for(size_t i = 0;i < trainimages.size();i++){ src = trainimages[i].clone(); //get bounding rectangle of image for reference //function from facemark class facesp.clear(); if(!getFaces(src,facesp)){ continue; } if(facesp.size()>1||facesp.empty()) continue; face = facesp[0]; convertToUnit(face,warp_mat); //loop to bring points to a common reference and adding for(k=0;k<trainlandmarks[i].size();k++){ Point2f pt=trainlandmarks[i][k]; C = (Mat_<double>(3,1) << pt.x, pt.y, 1); D = warp_mat*C; pt.x = float(D.at<double>(0,0)); pt.y = float(D.at<double>(1,0)); trainlandmarks[i][k] = pt; xmean[k] = xmean[k]+pt.x; ymean[k] = ymean[k]+pt.y; } finalimages.push_back(trainimages[i]); finallandmarks.push_back(trainlandmarks[i]); faces.push_back(face); } //dividing by size to get mean and initialize meanshape for(size_t i=0;i<k;i++){ xmean[i]=xmean[i]/finalimages.size(); ymean[i]=ymean[i]/finalimages.size(); if(xmean[i]>maxmeanx) maxmeanx = xmean[i]; if(xmean[i]<minmeanx) minmeanx = xmean[i]; if(ymean[i]>maxmeany) maxmeany = ymean[i]; if(ymean[i]<minmeany) minmeany = ymean[i]; meanshape.push_back(Point2f(xmean[i],ymean[i])); } trainimages.clear(); trainlandmarks.clear(); trainimages = finalimages; trainlandmarks = finallandmarks; finalimages.clear(); finallandmarks.clear(); return true; }
/** * Simplifies a mesh, merging the faces with the specified vertices. * @param mergeVertices vertices to test * @return true if a face merge was performed */ bool BOP_Merge::mergeFaces(BOP_Indexs &mergeVertices) { // Check size > 0! if (mergeVertices.size() == 0) return false; // New faces added by merge BOP_Faces newFaces; // Old faces removed by merge BOP_Faces oldFaces; // Get the first vertex index and add it to // the current pending vertices to merge BOP_Index v = mergeVertices[0]; BOP_Indexs pendingVertices; pendingVertices.push_back(v); // Get faces with index v that come from the same original face BOP_LFaces facesByOriginalFace; getFaces(facesByOriginalFace,v); bool merged = true; // Check it has any unbroken face if (facesByOriginalFace.size()==0) { // v has not any unbroken face (so it's a new BROKEN vertex) (m_mesh->getVertex(v))->setTAG(BROKEN); merged = false; } // Merge vertex faces const BOP_IT_LFaces facesEnd = facesByOriginalFace.end(); for(BOP_IT_LFaces facesByOriginalFaceX = facesByOriginalFace.begin(); (facesByOriginalFaceX != facesEnd)&&merged; facesByOriginalFaceX++) { merged = mergeFaces((*facesByOriginalFaceX),oldFaces,newFaces,pendingVertices,v); } // Check if the are some pendingVertices to merge if (pendingVertices.size() > 1 && merged) { // There are pending vertices that we need to merge in order to merge v ... for(unsigned int i=1;i<pendingVertices.size() && merged;i++) merged = mergeFaces(oldFaces,newFaces,pendingVertices,pendingVertices[i]); } // If merge was succesful ... if (merged) { // Set old faces to BROKEN... const BOP_IT_Faces oldFacesEnd = oldFaces.end(); for(BOP_IT_Faces face=oldFaces.begin();face!=oldFacesEnd;face++) (*face)->setTAG(BROKEN); // ... and add merged faces (that are the new merged faces without pending vertices) const BOP_IT_Faces newFacesEnd = newFaces.end(); for(BOP_IT_Faces newFace=newFaces.begin();newFace!=newFacesEnd;newFace++) { m_mesh->addFace(*newFace); // Also, add new face vertices to the queue of vertices to merge if they weren't for(BOP_Index i = 0;i<(*newFace)->size();i++) { BOP_Index vertexIndex = (*newFace)->getVertex(i); if (vertexIndex >= m_firstVertex && !containsIndex(mergeVertices,vertexIndex)) mergeVertices.push_back(vertexIndex); } } // Set the merged vertices to BROKEN ... const BOP_IT_Indexs pendingEnd = pendingVertices.end(); for(BOP_IT_Indexs pendingVertex = pendingVertices.begin(); pendingVertex != pendingEnd;pendingVertex++) { BOP_Index pV = *pendingVertex; m_mesh->getVertex(pV)->setTAG(BROKEN); // ... and remove them from mergeVertices queue const BOP_IT_Indexs mergeEnd = mergeVertices.end(); for(BOP_IT_Indexs mergeVertex = mergeVertices.begin(); mergeVertex != mergeEnd;mergeVertex++) { BOP_Index mV = *mergeVertex; if (mV == pV) { mergeVertices.erase(mergeVertex); break; } } } } else { // The merge was not succesful, remove the vertex frome merge vertices queue mergeVertices.erase(mergeVertices.begin()); // free the not used newfaces const BOP_IT_Faces newFacesEnd = newFaces.end(); for(BOP_IT_Faces newFace=newFaces.begin();newFace!=newFacesEnd;newFace++) { delete (*newFace); } } // Invoke mergeFaces and return the merge result return (mergeFaces(mergeVertices) || merged); }