Commit 0043e966d97d0f0732f5229807d5436cfdffc1c5

Authored by Jiaming Guo
1 parent 9f3f0602

fixed normal vector errors

Showing 1 changed file with 23 additions and 53 deletions   Show diff stats
stim/visualization/gl_network.h
@@ -45,30 +45,17 @@ public: @@ -45,30 +45,17 @@ public:
45 45
46 ///render cylinder based on points from the top/bottom hat 46 ///render cylinder based on points from the top/bottom hat
47 ///@param C1 set of points from one of the hat 47 ///@param C1 set of points from one of the hat
48 - void renderCylinder(std::vector< stim::vec3<T> > C1, std::vector< stim::vec3<T> > C2) { 48 + void renderCylinder(std::vector< stim::vec3<T> > C1, std::vector< stim::vec3<T> > C2, stim::vec3<T> P1, stim::vec3<T> P2) {
49 glBegin(GL_QUAD_STRIP); 49 glBegin(GL_QUAD_STRIP);
50 - for (unsigned i = 0; i < C1.size() - 1; i++) { // for every point on the circle  
51 - stim::vec3<T> v1;  
52 - stim::vec3<T> v2;  
53 - stim::vec3<T> v3;  
54 - stim::vec3<T> v4;  
55 -  
56 - v1 = C2[i + 1] - C1[i + 1];  
57 - v2 = C1[i] - C1[i + 1];  
58 - v3 = C1[i] - C2[i];  
59 - v4 = C2[i + 1] - C2[i];  
60 -  
61 - stim::vec3<T> n1 = v1.cross(v2);  
62 - stim::vec3<T> n2 = v3.cross(v4);  
63 - stim::vec3<T> normal = n1 + n2;  
64 - normal = normal.norm(); 50 + for (unsigned i = 0; i < C1.size(); i++) { // for every point on the circle
  51 + stim::vec3<T> n1 = C1[i] - P1; // set normal vector for every vertex on the quads
  52 + stim::vec3<T> n2 = C2[i] - P2;
  53 + n1 = n1.norm();
  54 + n2 = n2.norm();
  55 + glNormal3f(n1[0], n1[1], n1[2]);
65 glVertex3f(C1[i][0], C1[i][1], C1[i][2]); 56 glVertex3f(C1[i][0], C1[i][1], C1[i][2]);
66 - glVertex3f(C2[i][0], C2[i][1], C2[i][2]);  
67 - glNormal3f(normal[0], normal[1], normal[2]); // set normal vector for lighting  
68 - //glNormal3f(n1[0], n1[1], n1[2]);  
69 - //glVertex3f(C1[i][0], C1[i][1], C1[i][2]);  
70 - //glNormal3f(n2[0], n2[1], n2[2]);  
71 - //glVertex3f(C2[i][0], C2[i][1], C2[i][2]); 57 + glNormal3f(n2[0], n2[1], n2[2]);
  58 + glVertex3f(C2[i][0], C2[i][1], C2[i][2]);
72 } 59 }
73 glEnd(); 60 glEnd();
74 } 61 }
@@ -120,7 +107,6 @@ public: @@ -120,7 +107,6 @@ public:
120 yy[3] = radius * std::sin(angle_z) * std::sin(angle_xy + step_xy); 107 yy[3] = radius * std::sin(angle_z) * std::sin(angle_xy + step_xy);
121 zz[3] = radius * std::cos(angle_z); 108 zz[3] = radius * std::cos(angle_z);
122 109
123 -  
124 for (unsigned k = 0; k < 4; k++) { 110 for (unsigned k = 0; k < 4; k++) {
125 glVertex3f(x + xx[k], y + yy[k], z + zz[k]); // draw the floor plane 111 glVertex3f(x + xx[k], y + yy[k], z + zz[k]); // draw the floor plane
126 } 112 }
@@ -187,37 +173,21 @@ public: @@ -187,37 +173,21 @@ public:
187 std::vector< stim::vec3<T> > Cp1 = C1.glpoints(20);// get 20 points on the circle plane 173 std::vector< stim::vec3<T> > Cp1 = C1.glpoints(20);// get 20 points on the circle plane
188 std::vector< stim::vec3<T> > Cp2 = C2.glpoints(20); 174 std::vector< stim::vec3<T> > Cp2 = C2.glpoints(20);
189 glBegin(GL_QUAD_STRIP); 175 glBegin(GL_QUAD_STRIP);
190 - for (unsigned i = 0; i < Cp1.size() - 1; i++) {  
191 - stim::vec3<T> v1;  
192 - stim::vec3<T> v2;  
193 - stim::vec3<T> v3;  
194 - stim::vec3<T> v4;  
195 - v1 = Cp2[i + 1] - Cp1[i + 1];  
196 - v2 = Cp1[i] - Cp1[i + 1];  
197 - v3 = Cp1[i] - Cp2[i];  
198 - v4 = Cp2[i + 1] - Cp2[i];  
199 -  
200 - stim::vec3<T> n1 = v1.cross(v2);  
201 - stim::vec3<T> n2 = v3.cross(v4);  
202 - stim::vec3<T> normal = n1;  
203 - normal = normal.norm(); 176 + for (unsigned i = 0; i < Cp1.size(); i++) {
  177 + stim::vec3<T> n1 = Cp1[i] - E[e][p - 1]; // set normal vector for every vertex on the quads
  178 + stim::vec3<T> n2 = Cp2[i] - E[e][p];
  179 + n1 = n1.norm();
  180 + n2 = n2.norm();
204 181
  182 + glNormal3f(n1[0], n1[1], n1[2]);
205 glTexCoord1f(E[e].r(p - 1)); 183 glTexCoord1f(E[e].r(p - 1));
206 glVertex3f(Cp1[i][0], Cp1[i][1], Cp1[i][2]); 184 glVertex3f(Cp1[i][0], Cp1[i][1], Cp1[i][2]);
  185 + glNormal3f(n2[0], n2[1], n2[2]);
207 glTexCoord1f(E[e].r(p)); 186 glTexCoord1f(E[e].r(p));
208 glVertex3f(Cp2[i][0], Cp2[i][1], Cp2[i][2]); 187 glVertex3f(Cp2[i][0], Cp2[i][1], Cp2[i][2]);
209 - glNormal3f(normal[0], normal[1], normal[2]); // set normal vector for lighting  
210 } 188 }
211 - //for (unsigned i = 0; i < Cp1.size(); i++) { // for every point on the circle(+1 means closing the circle)  
212 - // glTexCoord1f(E[e].r(p - 1));  
213 - // glNormal3f(n1[0], n1[1], n1[2]); // set normal vector for lighting  
214 - // glVertex3f(Cp1[i][0], Cp1[i][1], Cp1[i][2]);  
215 - // glTexCoord1f(E[e].r(p));  
216 - // glNormal3f(n2[0], n2[1], n2[2]);  
217 - // glVertex3f(Cp2[i][0], Cp2[i][1], Cp2[i][2]);  
218 - //}  
219 glEnd(); 189 glEnd();
220 - } // set the texture coordinate based on the specified magnitude index 190 + } // set the texture coordinate based on the specified magnitude index
221 } 191 }
222 for (unsigned n = 0; n < V.size(); n++) { 192 for (unsigned n = 0; n < V.size(); n++) {
223 size_t num = V[n].e[0].size(); // store the number of outgoing edge of that vertex 193 size_t num = V[n].e[0].size(); // store the number of outgoing edge of that vertex
@@ -229,7 +199,7 @@ public: @@ -229,7 +199,7 @@ public:
229 unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex 199 unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex
230 glTexCoord1f(E[idx].r(E[idx].size() - 1)); // bind the texture as metric of last point on that edge 200 glTexCoord1f(E[idx].r(E[idx].size() - 1)); // bind the texture as metric of last point on that edge
231 } 201 }
232 - renderBall(V[n][0], V[n][1], V[n][2], 2*radius, 20, 20); 202 + renderBall(V[n][0], V[n][1], V[n][2], 2*radius, 20);
233 } 203 }
234 glEndList(); // end the display list 204 glEndList(); // end the display list
235 } 205 }
@@ -267,7 +237,7 @@ public: @@ -267,7 +237,7 @@ public:
267 else { 237 else {
268 unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex 238 unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex
269 } 239 }
270 - renderBall(V[n][0], V[n][1], V[n][2], 2 * radius, 20, 20); 240 + renderBall(V[n][0], V[n][1], V[n][2], 2 * radius, 20);
271 } 241 }
272 glEndList(); 242 glEndList();
273 } 243 }
@@ -300,7 +270,7 @@ public: @@ -300,7 +270,7 @@ public:
300 C2.set_R(2*radius); 270 C2.set_R(2*radius);
301 std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20); 271 std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);
302 std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20); 272 std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20);
303 - renderCylinder(Cp1, Cp2); 273 + renderCylinder(Cp1, Cp2, E[e][p - 1], E[e][p]);
304 } 274 }
305 } 275 }
306 else { 276 else {
@@ -312,7 +282,7 @@ public: @@ -312,7 +282,7 @@ public:
312 C2.set_R(2*radius); 282 C2.set_R(2*radius);
313 std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20); 283 std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);
314 std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20); 284 std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20);
315 - renderCylinder(Cp1, Cp2); 285 + renderCylinder(Cp1, Cp2, E[e][p - 1], E[e][p]);
316 } 286 }
317 } 287 }
318 } 288 }
@@ -332,7 +302,7 @@ public: @@ -332,7 +302,7 @@ public:
332 glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector 302 glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector
333 } 303 }
334 glColor3f(0.3, 0.3, 0.3); // gray 304 glColor3f(0.3, 0.3, 0.3); // gray
335 - renderBall(V[n][0], V[n][1], V[n][2], 3*radius, 20, 20); 305 + renderBall(V[n][0], V[n][1], V[n][2], 3*radius, 20);
336 } 306 }
337 else { // if it is the terminal vertex 307 else { // if it is the terminal vertex
338 if (V[n].e[0].size() != 0) { 308 if (V[n].e[0].size() != 0) {
@@ -342,7 +312,7 @@ public: @@ -342,7 +312,7 @@ public:
342 unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex 312 unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex
343 } 313 }
344 glColor3f(0.6, 0.6, 0.6); // more white gray 314 glColor3f(0.6, 0.6, 0.6); // more white gray
345 - renderBall(V[n][0], V[n][1], V[n][2], 3*radius, 20, 20); 315 + renderBall(V[n][0], V[n][1], V[n][2], 3*radius, 20);
346 } 316 }
347 } 317 }
348 glEndList(); 318 glEndList();