Commit 42d385468c42f34a768c3522656af8b902fbd601
1 parent
c8864f86
fixed normal vector errors
Showing
1 changed file
with
50 additions
and
30 deletions
Show diff stats
stim/visualization/gl_network.h
... | ... | @@ -45,16 +45,32 @@ public: |
45 | 45 | |
46 | 46 | ///render cylinder based on points from the top/bottom hat |
47 | 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, stim::vec3<T> n1, stim::vec3<T> n2) { | |
48 | + void renderCylinder(std::vector< stim::vec3<T> > C1, std::vector< stim::vec3<T> > C2) { | |
49 | 49 | glBegin(GL_QUAD_STRIP); |
50 | - for (unsigned i = 0; i < C1.size(); i++) { // for every point on the circle | |
51 | - glNormal3f(n1[0], n1[1], n1[2]); | |
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(); | |
52 | 65 | glVertex3f(C1[i][0], C1[i][1], C1[i][2]); |
53 | - glNormal3f(n2[0], n2[1], n2[2]); | |
54 | 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]); | |
55 | 72 | } |
56 | 73 | glEnd(); |
57 | - //glFlush(); | |
58 | 74 | } |
59 | 75 | |
60 | 76 | ///render the vertex as sphere based on glut build-in function |
... | ... | @@ -104,6 +120,7 @@ public: |
104 | 120 | yy[3] = radius * std::sin(angle_z) * std::sin(angle_xy + step_xy); |
105 | 121 | zz[3] = radius * std::cos(angle_z); |
106 | 122 | |
123 | + | |
107 | 124 | for (unsigned k = 0; k < 4; k++) { |
108 | 125 | glVertex3f(x + xx[k], y + yy[k], z + zz[k]); // draw the floor plane |
109 | 126 | } |
... | ... | @@ -167,19 +184,38 @@ public: |
167 | 184 | stim::circle<T> C2 = E[e].circ(p); |
168 | 185 | C1.set_R(2*radius); // re-scale the circle to the same |
169 | 186 | C2.set_R(2*radius); |
170 | - std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);// get 20 points on the circle plane | |
171 | - std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20); | |
172 | - stim::vec3<T> n1 = C1.n(); // get the normal vector | |
173 | - stim::vec3<T> n2 = C2.n(); | |
187 | + 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 | 189 | glBegin(GL_QUAD_STRIP); |
175 | - for (unsigned i = 0; i < Cp1.size(); i++) { // for every point on the circle(+1 means closing the circle) | |
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(); | |
204 | + | |
176 | 205 | glTexCoord1f(E[e].r(p - 1)); |
177 | - glNormal3f(n1[0], n1[1], n1[2]); // set normal vector for lighting | |
178 | 206 | glVertex3f(Cp1[i][0], Cp1[i][1], Cp1[i][2]); |
179 | 207 | glTexCoord1f(E[e].r(p)); |
180 | - glNormal3f(n2[0], n2[1], n2[2]); | |
181 | 208 | glVertex3f(Cp2[i][0], Cp2[i][1], Cp2[i][2]); |
209 | + glNormal3f(normal[0], normal[1], normal[2]); // set normal vector for lighting | |
182 | 210 | } |
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 | + //} | |
183 | 219 | glEnd(); |
184 | 220 | } // set the texture coordinate based on the specified magnitude index |
185 | 221 | } |
... | ... | @@ -187,16 +223,10 @@ public: |
187 | 223 | size_t num = V[n].e[0].size(); // store the number of outgoing edge of that vertex |
188 | 224 | if (num != 0) { // if it has outgoing edge |
189 | 225 | unsigned idx = V[n].e[0][0]; // find the index of first outgoing edge of that vertex |
190 | - stim::circle<T> C = E[idx].circ(0); | |
191 | - stim::vec3<T> normal = C.n(); | |
192 | - glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector | |
193 | 226 | glTexCoord1f(E[idx].r(0)); // bind the texture as metric of first point on that edge |
194 | 227 | } |
195 | 228 | else { |
196 | 229 | unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex |
197 | - stim::circle<T> C = E[idx].circ(E[idx].size()-1); | |
198 | - stim::vec3<T> normal = C.n(); | |
199 | - glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector | |
200 | 230 | glTexCoord1f(E[idx].r(E[idx].size() - 1)); // bind the texture as metric of last point on that edge |
201 | 231 | } |
202 | 232 | renderBall(V[n][0], V[n][1], V[n][2], 2*radius, 20, 20); |
... | ... | @@ -270,9 +300,7 @@ public: |
270 | 300 | C2.set_R(2*radius); |
271 | 301 | std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20); |
272 | 302 | std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20); |
273 | - stim::vec3<T> n1 = C1.n(); // get the normal vector | |
274 | - stim::vec3<T> n2 = C2.n(); | |
275 | - renderCylinder(Cp1, Cp2, n1, n2); | |
303 | + renderCylinder(Cp1, Cp2); | |
276 | 304 | } |
277 | 305 | } |
278 | 306 | else { |
... | ... | @@ -284,9 +312,7 @@ public: |
284 | 312 | C2.set_R(2*radius); |
285 | 313 | std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20); |
286 | 314 | std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20); |
287 | - stim::vec3<T> n1 = C1.n(); // get the normal vector | |
288 | - stim::vec3<T> n2 = C2.n(); | |
289 | - renderCylinder(Cp1, Cp2, n1, n2); | |
315 | + renderCylinder(Cp1, Cp2); | |
290 | 316 | } |
291 | 317 | } |
292 | 318 | } |
... | ... | @@ -311,15 +337,9 @@ public: |
311 | 337 | else { // if it is the terminal vertex |
312 | 338 | if (V[n].e[0].size() != 0) { |
313 | 339 | unsigned idx = V[n].e[0][0]; // find the index of first incoming edge of that vertex |
314 | - stim::circle<T> C = E[idx].circ(0); | |
315 | - stim::vec3<T> normal = C.n(); | |
316 | - glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector | |
317 | 340 | } |
318 | 341 | else { |
319 | 342 | unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex |
320 | - stim::circle<T> C = E[idx].circ(E[idx].size() - 1); | |
321 | - stim::vec3<T> normal = C.n(); | |
322 | - glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector | |
323 | 343 | } |
324 | 344 | glColor3f(0.6, 0.6, 0.6); // more white gray |
325 | 345 | renderBall(V[n][0], V[n][1], V[n][2], 3*radius, 20, 20); | ... | ... |