コード例 #1
0
	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]));
			}
コード例 #2
0
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);
}
コード例 #3
0
ファイル: BasicObject.cpp プロジェクト: pwestrich/csc_4750
//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);

}
コード例 #4
0
ファイル: Mesh.cpp プロジェクト: GFHund/LII
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;
			}
		}
	}
}
コード例 #5
0
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;
}
コード例 #6
0
ファイル: BOP_Merge.cpp プロジェクト: MakersF/BlenderDev
/**
 * 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;
}
コード例 #7
0
ファイル: BOP_Merge2.cpp プロジェクト: OldBrunet/BGERTPS
/**
 * 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;
}
コード例 #8
0
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;
}
コード例 #9
0
ファイル: BOP_Merge.cpp プロジェクト: MakersF/BlenderDev
/**
 * 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);
}