<div dir="ltr">Hi Don,<div><br></div><div>here is my interpretation of how x3dom deals with n>3-gons, in an IndexedFaceSet. Let's only deal with crease angles which do not require duplication of indices since normals at the vertices can be shared (for a smooth appearance). </div><div><br></div><div>The tesselation/triangulation of the n-gons occurs by a simple conversion to triangle fans, with all triangles sharing the first point in the n-gon, in case of convex polygons as indicated by the convex field. In case of non-convex (concave) polygons, the more sophisticated earclipping method is used for the triangulation. In both cases, the original winding order of points around the polygons is preserved in the order of triangle indices. This is plain to see for the first, convex, case and is also true for concave case. However, the utilized earclipping library originally did not consider preservation of winding order and required a patch which was then merged.</div><div><br></div><div><a href="https://github.com/x3dom/x3dom/blob/master/src/nodes/Geometry3D/IndexedFaceSet.js#L554">https://github.com/x3dom/x3dom/blob/master/src/nodes/Geometry3D/IndexedFaceSet.js#L554</a> is the relevant entry for this first part.<br></div><div><br></div><div>Then, if normals are not provided, they are calculated here:</div><div><br></div><div><a href="https://github.com/x3dom/x3dom/blob/master/src/Mesh.js#L141">https://github.com/x3dom/x3dom/blob/master/src/Mesh.js#L141</a><br></div><div><br></div><div>The three points of a triangle are labelled 0, t, 2 in this order.<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span> </span>The vector pointing from t (the center point) to 0 is called a. <span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span> </span>The vector pointing from 2 (the center point) to t is called b. (Hm, I would have pointed both vectors away from t).</span></span></div><div><br></div><div>The normal of the triangle then is calculated as a cross b. </div><div><br></div><div>This means that the normal is pointing to the front (back to the viewer), if the actual winding order is counterclockwise (as seen from the viewer). If the counterclockwise field is set to false, the normal is inverted. (This implementation may not be quite correct since the direction of the normal probably should not depend on the actual winding order of the given points, but only on the value of the field). </div><div><br></div><div>Let's see what this all means for planar polygons. There is no problem since all generated triangles inherit the same winding order from the  polygon, and are treated then the same.</div><div>For non-planar, convex polygons, I think there is also no problem since the preservation of winding order means that all normals point consistently. For non-planar, concave polygons, the earclipping only works if for triangulation purposes points can be collapsed onto a 2d plane (say the x-z plane). But this is really an unrelated problem.</div><div><br></div><div>As a result, I think it is important for implementations and may be for the spec. to deal with winding order. Winding order should be preserved when tesselating. For elevation grid this means that given a quad with points a, b, c, d in order around the the quad, the triangles should become a, b, c and a, c, d (and not a, c, d and a, d, c).</div><div><br></div><div>-Andreas</div><div><br></div><div>[I may have to reread relevant sections on the ccw field, particularly concerning the situation where actual order is reversed from indicated order.]</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 28, 2018 at 12:45 PM, Don Brutzman <span dir="ltr"><<a href="mailto:brutzman@nps.edu" target="_blank">brutzman@nps.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Attached please find current Mantis issue searching for regular tesselation of polygons with 4 or more vertices.<br>
<br>
For browser implementers: wondering how you handle polygons with greater than 4 points (n-gons), so that all normals are pointing in the same direction for planar polygons, or to the same side of the face for nonplanar polygons.<br>
<br>
all the best, Don<span class="HOEnZb"><font color="#888888"><br>
-- <br>
Don Brutzman  Naval Postgraduate School, Code USW/Br       <a href="mailto:brutzman@nps.edu" target="_blank">brutzman@nps.edu</a><br>
Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA   <a href="tel:%2B1.831.656.2149" value="+18316562149" target="_blank">+1.831.656.2149</a><br>
X3D graphics, virtual worlds, navy robotics <a href="http://faculty.nps.edu/brutzman" rel="noreferrer" target="_blank">http://faculty.nps.edu/brutzma<wbr>n</a><br>
<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Andreas Plesch<br>Waltham, MA 02453</div></div></div>
</div>