v8.0 (2010)
Returns the current starting node used by the tesselator for
this polygon face.
By default a polygon is triangulated using a triangle fan starting
at vertex #0. So the triangulation is as follow: [0,1,2], [0,2,3],
[0,3,4], ..., [0,N-2,N-1] where N is the number of nodes in the
polygon. So for a quad the fan has only two triangles: [0,1,2] and
[0,2,3].
You can apply the TurnEdgeOp operator to
change the starting node of that triangle fan so that the
triangulation becomes: [1,2,3], [1,3,4], ..., [1,N-1,0] (or
[2,3,4], [2,4,5], ..., [2,0,1] the second time...). This is
particularly useful for non-planar polygons where the "invisible"
edges cause visible discontinuities in the shading.
Notice that for the case of concave polygons the tesselator might
decide to ignore this offset in order to create a triangulation
that doesn't create triangles outside of the polygon area.
/* This example demonstrates how to set and use the turn edge offset. */ NewScene( null, false ); CreatePrim("Grid", "MeshSurface", null, null); SetValue("grid.polymsh.geom.subdivu", 2, null); SetValue("grid.polymsh.geom.subdivv", 2, null); var GridGeom = GetValue( "Grid" ).ActivePrimitive.Geometry; var Polygons = GridGeom.Polygons; var Polygon = Polygons.Item(3); var PolygonVertices = Polygon.Vertices; var TriangleSubIndices = Polygon.TriangleSubIndexArray.toArray(); Application.LogMessage( "Polygon #3 is defined with the following vertices: " + PolygonVertices.Item(0).Index + ", " + PolygonVertices.Item(1).Index + ", " + PolygonVertices.Item(2).Index + ", " + PolygonVertices.Item(3).Index ); Application.LogMessage( "Polygon #3 has the following two triangles before applying the TurnEdge operator: [" + PolygonVertices.Item(TriangleSubIndices[0]).Index + ", " + PolygonVertices.Item(TriangleSubIndices[1]).Index + ", " + PolygonVertices.Item(TriangleSubIndices[2]).Index + "] and [" + PolygonVertices.Item(TriangleSubIndices[3]).Index + ", " + PolygonVertices.Item(TriangleSubIndices[4]).Index + ", " + PolygonVertices.Item(TriangleSubIndices[5]).Index + "]." ); ApplyOp("TurnEdgeOp", "grid.poly[LAST]", 3, siPersistentOperation, null, 0); var GridGeom = GetValue( "Grid" ).ActivePrimitive.Geometry; var Polygons = GridGeom.Polygons; var Polygon = Polygons.Item(3); var PolygonVertices = Polygon.Vertices; var TriangleSubIndices = Polygon.TriangleSubIndexArray.toArray(); Application.LogMessage( "Polygon #3 has the following two triangles after applying the TurnEdge operator: [" + PolygonVertices.Item(TriangleSubIndices[0]).Index + ", " + PolygonVertices.Item(TriangleSubIndices[1]).Index + ", " + PolygonVertices.Item(TriangleSubIndices[2]).Index + "] and [" + PolygonVertices.Item(TriangleSubIndices[3]).Index + ", " + PolygonVertices.Item(TriangleSubIndices[4]).Index + ", " + PolygonVertices.Item(TriangleSubIndices[5]).Index + "]" ); var offset = Polygon.TurnInternalEdgeOffset; // this should be 1 since with only turned the polygon edges once. Application.LogMessage( "This triangulation is equivalent to that of a polygon defined using the following vertices: " + PolygonVertices.Item( ( 0 + offset ) % 4 ).Index + ", " + PolygonVertices.Item( ( 1 + offset ) % 4 ).Index + ", " + PolygonVertices.Item( ( 2 + offset ) % 4 ).Index + ", " + PolygonVertices.Item( ( 3 + offset ) % 4 ).Index ); // Expected results: // INFO : Polygon #3 is defined with the following vertices: 4, 5, 8, 7 // INFO : Polygon #3 has the following two triangles before applying the TurnEdge operator: [4, 5, 8] and [4, 8, 7]. // INFO : Polygon #3 has the following two triangles after applying the TurnEdge operator: [5, 8, 7] and [5, 7, 4] // INFO : This triangulation is equivalent to that of a polygon defined using the following vertices: 5, 8, 7, 4 |