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])); }
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(); }
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'); }