@@ -332,7 +332,7 @@ Vector SSurface::PointAt(double u, double v) const {
332332 return num;
333333}
334334
335- void SSurface::TangentsAt (double u, double v, Vector *tu, Vector *tv) const {
335+ void SSurface::TangentsAt (double u, double v, Vector *tu, Vector *tv, bool retry ) const {
336336 Vector num = Vector::From (0 , 0 , 0 ),
337337 num_u = Vector::From (0 , 0 , 0 ),
338338 num_v = Vector::From (0 , 0 , 0 );
@@ -364,6 +364,12 @@ void SSurface::TangentsAt(double u, double v, Vector *tu, Vector *tv) const {
364364
365365 *tv = ((num_v.ScaledBy (den)).Minus (num.ScaledBy (den_v)));
366366 *tv = tv->ScaledBy (1.0 /(den*den));
367+
368+ // Tangent is zero at sungularities like the north pole. Move away a bit and retry.
369+ if (tv->Equals (Vector::From (0 ,0 ,0 )) && retry)
370+ TangentsAt (u+(0.5 -u)*0.00001 , v, tu, tv, false );
371+ if (tu->Equals (Vector::From (0 ,0 ,0 )) && retry)
372+ TangentsAt (u, v+(0.5 -v)*0.00001 , tu, tv, false );
367373}
368374
369375Vector SSurface::NormalAt (Point2d puv) const {
0 commit comments