Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <map>
00022 #include "rtc/rtcGeometry3D.h"
00023 #include "rtc/rtcTransform.h"
00024 #include "rtc/rtcVarMat.h"
00025 #include "rtc/rtcPCA.h"
00026 #include "rtc/rtcPoint3DKdTree.h"
00027 #include "rtc/rtcMesh3DHelper.h"
00028
00029
00030
00031 namespace rtc {
00032
00033 Mesh3DHelper::Mesh3DHelper()
00034 {
00035 }
00036
00037 Mesh3DHelper::~Mesh3DHelper()
00038 {
00039 }
00040
00041 void Mesh3DHelper::addMeasurementNoise(Mesh3D& mesh, Vec3f& alpha_measurement)
00042 {
00043
00044 }
00045
00053 void Mesh3DHelper::updateVertexNormals(Mesh3D& mesh, int n_neighbors)
00054 {
00055 PrincipalComponentAnalysis<float,3> pca;
00056 int num_points = mesh.numVertices();
00057 int *closest_points=new int[n_neighbors];
00058 int n;
00059
00060
00061 float *x, *y, *z;
00062 x = (float *) calloc(num_points, sizeof(float)); rtc_test_alloc(x);
00063 y = (float *) calloc(num_points, sizeof(float)); rtc_test_alloc(y);
00064 z = (float *) calloc(num_points, sizeof(float)); rtc_test_alloc(y);
00065 for(int i=0;i<num_points; i++) {
00066 Vertex3D* v = mesh.vertices[i];
00067 x[i]=v->p[0];
00068 y[i]=v->p[1];
00069 z[i]=v->p[2];
00070 }
00071 Point3DKdTree point_kd_tree(x, y, z, num_points);
00072 free(x);
00073 free(y);
00074 free(z);
00075
00076 VarMatf data;
00077 data.setSize(n_neighbors,3);
00078
00079 for(int i=0;i<num_points; i++) {
00080 Vertex3D* v = mesh.vertices[i];
00081
00082 point_kd_tree.findNearest(v->p, n_neighbors,closest_points);
00083
00084
00085 for(int j = 0; j < n_neighbors; j++) {
00086 n = closest_points[j];
00087 data.setRow(j,mesh.vertices[n]->p);
00088 }
00089
00090
00091 SMat<float,3>& ev = pca.computeTransformMatrix(data);
00092
00093
00094 v->n = ev.getCol(2);
00095
00096
00097 Vec3f tmp = v->p.normalized();
00098 tmp*=-1;
00099 if(v->n.dot(tmp)<0)
00100 v->n*=-1;
00101 }
00102
00103 delete closest_points;
00104 }
00105
00112 void Mesh3DHelper::removeIsolatedVertices(Mesh3D& srcdest)
00113 {
00114 Mesh3D mesh_new;
00115 mesh_new.pose = srcdest.pose;
00116 mesh_new.flags = srcdest.flags;
00117 #ifndef NO_GRAPHICS
00118 mesh_new.texture = srcdest.texture;
00119 #endif
00120 mesh_new.teximage = srcdest.teximage;
00121 mesh_new.texmask = srcdest.texmask;
00122
00123 std::map<int,int> vertex_mapping;
00124
00125 int j_new=0;
00126 for (int j=0;j<srcdest.numVertices();++j)
00127 {
00128 Vertex3D* v = srcdest.vertices[j];
00129 if(v->faces.size()==0) continue;
00130 vertex_mapping[j]=j_new;
00131 Vertex3D* v_new = mesh_new.addVertex(v->p);
00132 v_new->n = v->n;
00133 v_new->c = v->c;
00134 v_new->flags = v->flags;
00135 v_new->t = v->t;
00136 j_new++;
00137 }
00138
00139
00140 for (int j=0;j<srcdest.numFaces();++j)
00141 {
00142 Face3D* f = srcdest.faces[j];
00143 Face3D* f_new = mesh_new.addFace(vertex_mapping[f->v[0]],
00144 vertex_mapping[f->v[1]],
00145 vertex_mapping[f->v[2]]);
00146 f_new->flags = f->flags;
00147 f_new->n = f->n;
00148 }
00149 srcdest.set(mesh_new);
00150 }
00151
00152
00153
00154 }
00155