It's pretty strange.
If I only do:
GeometryInfo gi = new GeometryInfo( head );
IndexedGeometryArray iga = gi.getIndexedGeometryArray(true);
Point3f[] coords = gi.getCoordinates();
Object[] texcoords = gi.getTextureCoordinates(0);
As you can see, I didn't use "IndexedGeometryArray iga" at all, but it seems "gi.getIndexedGeometryArray(true)" not only assign to "iga" but change "gi" itself !!
Now, coords has 75,970 elements while texcoords has 75,969 elements.
There should be totally 75,972 coordinates with 75,972 textures spreading over these 75,972 points.
To my most strange:
gi.setCoordinates(shapeVec);
gi.setTextureCoordinates(0, texVec);
works, where shapeVec and texVec are two vectors of 75,972 elements.
That's to say, getCoordinates() returns a vector of 75,970, while setCoordinates() works for a vecto of 75,972.
Seriously don't know how Java3D performed.
And it's seriously confusing why
IndexedGeometryArray iga = gi.getIndexedGeometryArray(true);
changes gi

?
Ooops...
JIA