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]));
			}
Example #2
0
size_t detail::addVertex(K3DTree<size_t, float> &vertexTree, std::vector<vec3> &positions,
                         std::vector<vec3> &normals, const vec3 pos) {
    K3DTree<size_t, float>::Node *nearest = vertexTree.findNearest(vec3(pos));
    vec3 p;
    if (nearest) {
        p.x = nearest->getPosition()[0];
        p.y = nearest->getPosition()[1];
        p.z = nearest->getPosition()[2];
    }
    if (!nearest || (glm::distance(p, pos) > glm::epsilon<double>() * 5)) {
        nearest = vertexTree.insert(pos, positions.size());
        positions.push_back(pos);
        normals.push_back(vec3(0, 0, 0));
    }
    return nearest->get();
}
Example #3
0
void RBFHelper::setPoints(std::vector<glm::vec3> points){
	K3DTree<char> tree; //must be some data, void not yet supported
	IT_FOR(points,p){
		tree.insert(*p,'0');
	}