> Date: Wed, 31 Jan 2001 22:34:31 -0000 > From: Glenn Rowe <[EMAIL PROTECTED]> > Subject: [JAVA3D] Is triangulator needed? > To: [EMAIL PROTECTED] > > I've been experimenting with GeometryInfo for producing triangulations of > arbitrary polygons, and according to the docs/examples, you should create > an array of coordinates, assign them to a GeometryInfo, and then call > Triangulator's triangulate() method to triangulate the polygon. However, > in the runs I've done, if you omit the call to triangulate(), the polygon > still gets triangulated (presumably by GeometryInfo itself). > > Calling the Triangulator constructor with an argument of 1 (EARS_RANDOM) > will produce a different triangulation than that produced by GeometryInfo > on its own, so the Triangulator object obviously does do something, > but it seems that the default Triangulator (with no arguments to the > constructor) > just produces the same results as if it hadn't been called at all. > > Has anyone else noticed this behaviour? Is it intended? GeometryInfo does a lot in the background. If you put your geometry into it as POLYGON_ARRAY and then immediately call getGeometryArray(), it will create a default triangulator and triangulate your data, then unindexify it, and then create the GeometryArray and pass it back. There's no other choice because you can't put polygons into a GeometryArray. The word "polygon" is never used anywhere in Java 3D except in GeometryInfo and the triangulator. To further expand this, the NormalGenerator and Stripifier only work on indexed triangles. Therefore, no matter what format your data is in, it will be converted to indexed triangles if you call the NormalGenerator or Stripfier. This is hidden from the user. If you send in quads and call the stripfier, you will get triangle strips out, and you won't know that your quads were converted to indexed triangles in the interim. If you send quads (or fans or strips) to the NormalGenerator, they get converted to indexed triangles before Normals are calculated. If you then call getGeometryArray(), the triangles are converted back to the original primitive in the most intelligent way possible. If it was originally fans or strips, it will attempt to stitch them back together, but it may have to break a strip in two if there was a hard edge in the middle of the strip. It does the same thing for quads. (There can't be a hard edge in the middle of a quad because the same facet normal is used by both sub-triangles of the quad). This probably rarely happens because most people aren't going to generate normals and then call getGeometryArray(), they're going to call the stripifier first. In that case, the data is left as indexed triangles and sent immediately to the stripifier. It's never converted back to the original primitive type. Keeping all that in mind, POLYGON_ARRAY is treated just like any other primitive by GeometryInfo. Before it can be sent to the NormalGenerator or Stripifier, it must first be converted to triangles. It uses the triangulator utility to do this. Where it differs from the other primitives is when you don't call the Stripifyer. If you call getGeometryArray() on POLYGON_ARRAY data without calling the stripifier, you will always get back individual triangles. So the answer to your question is yes, you don't need to call the triangulator explicitly (unless you want to specify the earOrder) because it gets called automatically when POLYGON_ARRAY data is used. Does it hurt to call it explicitly? Not much. The triangulator is smart enough to do nothing if the input data is already triangles. Homework: 1) If I put Quad data into GeometryInfo and call the NormalGenerator followed by getGeometryArray(), what will be the primitive of the returned data? 2) If I put Triangle Fan data into GeometryInfo and call the Stripifier followed by getGeometryArray(), what will be the primitive of the returned data? 3) If I put Polygon data into GeometryInfo and call the NormalGenerator then the Stripifier then getGeometryArray(), what will be the primitive of the returned data? 4) If I put Quad data into GeometryInfo and call the Stripifier then the NormalGenerator then getGeometryArray(), what will be the primitive of the returned data? Answers: 1) Quad. The quads get taken apart to calculate the normals, then they get put back together. 2) Triangle Strip. The input primitive type doesn't matter because you called the Stripifier. 3) Triangle Strip. Same as #2. 4) Don't do this! When you call the Stripifier, GeometryInfo will convert your data into triangles, and then the Stripifier will turn it into strips. Then GeometryInfo has to turn it back into triangles before it can call the NormalGenerator! Then, after calculating the normals, it will attempt to stitch the strips back together. Don't do this! You are doing tons of extra work and your strips aren't as long as they would have been. Always call the NormalGenerator before calling the Stripifier. -Paul =========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA3D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".