Commit a4c3a0e01aef71a8ec579362fd2491f4ed3c0a67
1 parent
f8a38243
added the neccessary changes for better modeling to shview. Some debug code. Iss…
…ue with weird symmetry
Showing
1 changed file
with
113 additions
and
10 deletions
Show diff stats
main.cpp
1 | #include <iostream> | 1 | #include <iostream> |
2 | +#include <sstream> | ||
2 | 3 | ||
3 | #include <GL/glut.h> | 4 | #include <GL/glut.h> |
4 | 5 | ||
@@ -6,6 +7,7 @@ | @@ -6,6 +7,7 @@ | ||
6 | #include <stim/parser/arguments.h> | 7 | #include <stim/parser/arguments.h> |
7 | #include <stim/visualization/obj.h> | 8 | #include <stim/visualization/obj.h> |
8 | #include <stim/visualization/gl_spharmonics.h> | 9 | #include <stim/visualization/gl_spharmonics.h> |
10 | +#include <stim/math/constants.h> | ||
9 | 11 | ||
10 | #define theta_scale 0.01 | 12 | #define theta_scale 0.01 |
11 | #define phi_scale 0.01 | 13 | #define phi_scale 0.01 |
@@ -119,6 +121,60 @@ void mouse_drag(int x, int y){ | @@ -119,6 +121,60 @@ void mouse_drag(int x, int y){ | ||
119 | glutPostRedisplay(); | 121 | glutPostRedisplay(); |
120 | } | 122 | } |
121 | 123 | ||
124 | +float uniformRandom() | ||
125 | +{ | ||
126 | + return ( (float)(rand()))/( (float)(RAND_MAX)); | ||
127 | +} | ||
128 | + | ||
129 | +std::vector<stim::vec3 <float> > | ||
130 | +sample_sphere(int num_samples, float radius = 1.0) | ||
131 | +{ | ||
132 | + | ||
133 | + float solidAngle = 2*stim::PI; ///Solid angle to sample over | ||
134 | + float PHI[2], Z[2], range; ///Range of angles in cylinderical coordinates | ||
135 | + PHI[0] = solidAngle/2; ///project the solid angle into spherical coords | ||
136 | + PHI[1] = asin(0); /// | ||
137 | + Z[0] = cos(PHI[0]); ///project the z into spherical coordinates | ||
138 | + Z[1] = cos(PHI[1]); /// | ||
139 | + range = Z[0] - Z[1]; ///the range of all possible z values. | ||
140 | + | ||
141 | + float z, theta, phi; /// temporary individual | ||
142 | + | ||
143 | + std::vector<stim::vec3<float> > samples; | ||
144 | + | ||
145 | + //srand(time(NULL)); ///set random seed | ||
146 | + srand(100); ///set random seed | ||
147 | + | ||
148 | + for(int i = 0; i < num_samples; i++) | ||
149 | + { | ||
150 | + z = uniformRandom()*range + Z[1]; | ||
151 | + theta = uniformRandom()*stim::TAU; | ||
152 | + phi = acos(z); | ||
153 | + stim::vec3<float> sph(1, theta, phi); | ||
154 | + stim::vec3<float> cart = sph.sph2cart(); | ||
155 | + sph[0] *= radius; | ||
156 | + samples.push_back(cart); | ||
157 | + } | ||
158 | + samples.push_back(stim::vec3<float>(0.,0.,1.)); | ||
159 | + samples.push_back(stim::vec3<float>(0.,1.0,0.)); | ||
160 | + samples.push_back(stim::vec3<float>(0.,-1.,0.)); | ||
161 | + | ||
162 | + | ||
163 | + std::stringstream name; | ||
164 | + for(int i = 0; i < num_samples; i++) | ||
165 | + name << samples[i].str() << std::endl; | ||
166 | + name << samples[num_samples].str() << std::endl; | ||
167 | + name << samples[num_samples+1].str() << std::endl; | ||
168 | + name << samples[num_samples+2].str() << std::endl; | ||
169 | + | ||
170 | + | ||
171 | + std::ofstream outFile; | ||
172 | + outFile.open("New_Pos_Vectors.txt"); | ||
173 | + outFile << name.str().c_str(); | ||
174 | + | ||
175 | + return samples; | ||
176 | +} | ||
177 | + | ||
122 | void process_arguments(int argc, char* argv[]){ | 178 | void process_arguments(int argc, char* argv[]){ |
123 | 179 | ||
124 | args.add("help", "prints this help"); | 180 | args.add("help", "prints this help"); |
@@ -128,6 +184,7 @@ void process_arguments(int argc, char* argv[]){ | @@ -128,6 +184,7 @@ void process_arguments(int argc, char* argv[]){ | ||
128 | args.add("obj", "approximates a geometric object given as a Wavefront OBJ file", "", "filename"); | 184 | args.add("obj", "approximates a geometric object given as a Wavefront OBJ file", "", "filename"); |
129 | args.add("out", "filename for outputting spherical harmonics coefficients", "", "filename"); | 185 | args.add("out", "filename for outputting spherical harmonics coefficients", "", "filename"); |
130 | args.add("zaxis", "render the z-axis as a green line"); | 186 | args.add("zaxis", "render the z-axis as a green line"); |
187 | + args.add("pdf", "outputs the PDF if an OBJ files is given"); | ||
131 | 188 | ||
132 | //process the command line arguments | 189 | //process the command line arguments |
133 | args.parse(argc, argv); | 190 | args.parse(argc, argv); |
@@ -212,12 +269,17 @@ void process_arguments(int argc, char* argv[]){ | @@ -212,12 +269,17 @@ void process_arguments(int argc, char* argv[]){ | ||
212 | 269 | ||
213 | std::string filename = args["obj"].as_string(0); | 270 | std::string filename = args["obj"].as_string(0); |
214 | unsigned int l = args["obj"].as_int(1); | 271 | unsigned int l = args["obj"].as_int(1); |
272 | + int p = args["obj"].as_int(2); | ||
273 | + std::cout << p << std::endl; | ||
274 | + std::vector<stim::vec3<float> > sphere = sample_sphere(p); | ||
275 | + p = p+3; | ||
215 | 276 | ||
216 | //create an obj object | 277 | //create an obj object |
217 | stim::obj<double> object(filename); | 278 | stim::obj<double> object(filename); |
218 | 279 | ||
219 | //get the centroid of the object | 280 | //get the centroid of the object |
220 | stim::vec<double> c = object.centroid(); | 281 | stim::vec<double> c = object.centroid(); |
282 | + c[0] = 0; c[1] = 0; c[2] = 0; | ||
221 | 283 | ||
222 | //get the number of vertices in the model | 284 | //get the number of vertices in the model |
223 | unsigned int nV = object.numV(); | 285 | unsigned int nV = object.numV(); |
@@ -236,18 +298,59 @@ void process_arguments(int argc, char* argv[]){ | @@ -236,18 +298,59 @@ void process_arguments(int argc, char* argv[]){ | ||
236 | //generate the spherical PDF | 298 | //generate the spherical PDF |
237 | stim::spharmonics<double> P; | 299 | stim::spharmonics<double> P; |
238 | P.pdf(spherical, l, l); | 300 | P.pdf(spherical, l, l); |
301 | + std::vector<float> weights; ///array of weights | ||
302 | + if(args["pdf"].is_set()) | ||
303 | + { | ||
304 | +// S.pdf(spherical, l, l); | ||
305 | + for(int i = 0; i < p; i++) ///for each point on the sphere. | ||
306 | + { | ||
307 | + float val = 0; ///value starts with 0 | ||
308 | + for(int j = 0; j < nV; j++) ///for each point on surface | ||
309 | + { | ||
310 | + stim::vec3<float> star(object.getV(j)[0] - c[0], | ||
311 | + object.getV(j)[1] - c[1], | ||
312 | + object.getV(j)[2] - c[2]); ///center each point on the model | ||
313 | +// val += abs(star.dot(sphere[i])); ///sum the dot product of the centered point and the sphere. | ||
314 | + if(star.dot(sphere[i]) > 0) | ||
315 | + val += pow(star.dot(sphere[i]),8); ///sum the dot product of the centered point and the sphere. | ||
316 | + } | ||
317 | + weights.push_back(val); | ||
318 | + } | ||
319 | + | ||
320 | + S.mcBegin(l,l); | ||
321 | + for(int i = 0; i < p; i++) | ||
322 | + { | ||
323 | + if(sphere[i] == stim::vec3<float>(0., 0., 1.)) | ||
324 | + { | ||
325 | + std::cout << i << sphere[i] << " " << weights[i] << std::endl; | ||
326 | + } | ||
327 | + if(sphere[i] == stim::vec3<float>(0., 1., 0.)) | ||
328 | + { | ||
329 | + std::cout << i << sphere[i] << " " << weights[i] << std::endl; | ||
330 | + } | ||
331 | + if(sphere[i] == stim::vec3<float>(0., -1., 0.)) | ||
332 | + { | ||
333 | + std::cout << i << sphere[i] << " " << weights[i] << std::endl; | ||
334 | + } | ||
335 | + stim::vec3<float> sph = sphere[i].cart2sph(); | ||
336 | + S.mcSample(sph[1], sph[2], weights[i]); | ||
337 | + } | ||
338 | + S.mcEnd(); | ||
239 | 339 | ||
240 | - //begin Monte-Carlo sampling, using the model vertices as samples | ||
241 | - S.mcBegin(l, l); | ||
242 | - double theta, phi, fx, px; | ||
243 | - for(unsigned int i = 0; i < nV; i++){ | ||
244 | - theta = spherical[i][1]; | ||
245 | - phi = spherical[i][2]; | ||
246 | - fx = spherical[i][0]; | ||
247 | - px = P(theta, phi); | ||
248 | - S.mcSample(theta, phi, fx / px); | ||
249 | } | 340 | } |
250 | - S.mcEnd(); | 341 | + else{ |
342 | + //begin Monte-Carlo sampling, using the model vertices as samples | ||
343 | + S.mcBegin(l, l); | ||
344 | + double theta, phi, fx, px; | ||
345 | + for(unsigned int i = 0; i < nV; i++){ | ||
346 | + theta = spherical[i][1]; | ||
347 | + phi = spherical[i][2]; | ||
348 | + fx = spherical[i][0]; | ||
349 | + px = P(theta, phi); | ||
350 | + S.mcSample(theta, phi, fx / px); | ||
351 | + } | ||
352 | + S.mcEnd(); | ||
353 | + } | ||
251 | } | 354 | } |
252 | 355 | ||
253 | //if the user specifies an SH basis function | 356 | //if the user specifies an SH basis function |