Hello Mates! I try to build a Shape3D object with a pretty big "float[] coordinateData". In other words it got alot of different surfaces. By the way I do not want to model this through some 3D-model program, I want to code it my self so I know that I master it.
Now when the geometry is done, I also want to apply different textures to different surfaces of the Shape3D. But I get a ArrayIndexOutOfBoundsException. I do think that this should be possible with the GeometryInfo like: public Shape3D createShape3D() { float[] coordinateData = createCoordinateData(); TexCoord3f[][] textureCoordinateData = createTextureCoordinateData(); int[] stripCount = {11, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 5, 5}; //First I set the geometry GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY); gi.setCoordinates(coordinateData); gi.setStripCounts(stripCount); //Then I set the texture cordinates gi.setTextureCoordinateParams(2, 3); gi.setTextureCoordinates(0, textureCoordinateData[0]); gi.setTextureCoordinates(1, textureCoordinateData[1]); //But at this part i get the a ArrayIndexOutOfBoundsException //But I cant understand why! NormalGenerator ng = new NormalGenerator(); ng.generateNormals(gi); gi.recomputeIndices(); Stripifier st = new Stripifier(); st.stripify(gi); gi.recomputeIndices(); Shape3D part = new Shape3D(); part.setAppearance(createMaterialAppearance()); part.setGeometry(gi.getGeometryArray()); return part; } The Exception is: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException at com.sun.j3d.utils.geometry.Triangulator.writeTriangleToGeomInfo(Triangulator .java:682) at com.sun.j3d.utils.geometry.Triangulator.triangulate(Triangulator.java:532) at com.sun.j3d.utils.geometry.NormalGenerator.generateNormals(NormalGenerator.j ava:787) at java3d.MTLB.createShape3D(MTLB.java:46) at java3d.MTLB.<init>(MTLB.java:24) at java3d.TestBuildGeomObject.<init>(TestBuildGeomObject.java:28) at java3d.MTLB.main(MTLB.java:230) Below is my 2 classes to test this. The MTLB Class is the Shape3D and the other one is just for viewing any Shape3D. You can turn the loaded Shape3D around with the arrow keys. So if any one could explain why I get the Exception it would be great. Perhaps you could give some more hints to solve this if you see any thing strange. Best regards Fredrik --------------------------------------------------------------------------- import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.geometry.*; import java.awt.Frame; import com.sun.j3d.utils.applet.MainFrame; public class MTLB extends BranchGroup { public MTLB() { Transform3D transform3D = new Transform3D(); //Hole TransformGroup holeTransformGroup = new TransformGroup(); holeTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); holeTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); transform3D.setTranslation( new Vector3d( 0.0, -2.0, -13.0 ) ); holeTransformGroup.setTransform(transform3D); setCapability(BranchGroup.ALLOW_CHILDREN_READ ); holeTransformGroup.addChild( createShape3D() ); addChild( holeTransformGroup ); compile(); } public Shape3D createShape3D() { float[] coordinateData = createCoordinateData(); TexCoord3f[][] textureCoordinateData = createTextureCoordinateData(); int[] stripCount = {11, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 5, 5}; GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY); gi.setCoordinates(coordinateData); gi.setStripCounts(stripCount); gi.setTextureCoordinateParams(2, 3); gi.setTextureCoordinates(0, textureCoordinateData[0]); gi.setTextureCoordinates(1, textureCoordinateData[1]); NormalGenerator ng = new NormalGenerator(); ng.generateNormals(gi); gi.recomputeIndices(); Stripifier st = new Stripifier(); st.stripify(gi); gi.recomputeIndices(); Shape3D part = new Shape3D(); part.setAppearance(createMaterialAppearance()); part.setGeometry(gi.getGeometryArray()); return part; } public float[] createCoordinateData() { float[] data = new float[82*3]; int i = 0; //Back data[i++]= -1.0f; data[i++]= 0.6f; data[i++]= -0.2f; //0 data[i++]= 1.0f; data[i++]= 0.6f; data[i++]= -0.2f; //1 data[i++]= 1.0f; data[i++]= 1.3f; data[i++]= -0.1f; //2 data[i++]= 1.5f; data[i++]= 1.3f; data[i++]= -0.1f; //3 data[i++]= 1.35f; data[i++]= 1.7f; data[i++]= -0.05f; //4 data[i++]= 0.8f; data[i++]= 1.9f; data[i++]= 0.0f; //4 data[i++]= -0.8f; data[i++]= 1.9f; data[i++]= 0.0f; //5 data[i++]= -1.35f; data[i++]= 1.7f; data[i++]= -0.05f; //4 data[i++]= -1.5f; data[i++]= 1.3f; data[i++]= -0.1f; //6 data[i++]= -1.0f; data[i++]= 1.3f; data[i++]= -0.1f; //7 data[i++]= -1.0f; data[i++]= 0.6f; data[i++]= -0.2f; //8 //Right lover side data[i++]= 1.0f; data[i++]= 0.6f; data[i++]= -0.2f; //1 data[i++]= 1.0f; data[i++]= 0.6f; data[i++]= -5.0f; //1 data[i++]= 1.0f; data[i++]= 1.3f; data[i++]= -5.5f; //2 data[i++]= 1.0f; data[i++]= 1.3f; data[i++]= -0.1f; //3 data[i++]= 1.0f; data[i++]= 0.6f; data[i++]= -0.2f; //4 //Left lover side data[i++]= -1.0f; data[i++]= 0.6f; data[i++]= -0.2f; //1 data[i++]= -1.0f; data[i++]= 0.6f; data[i++]= -5.0f; //1 data[i++]= -1.0f; data[i++]= 1.3f; data[i++]= -5.5f; //2 data[i++]= -1.0f; data[i++]= 1.3f; data[i++]= -0.1f; //3 data[i++]= -1.0f; data[i++]= 0.6f; data[i++]= -0.2f; //4 //Right wheel roof data[i++]= 1.0f; data[i++]= 1.3f; data[i++]= -0.1f; //1 data[i++]= 1.55f; data[i++]= 1.3f; data[i++]= -0.1f; //1 data[i++]= 1.55f; data[i++]= 1.3f; data[i++]= -5.0f; //1 data[i++]= 1.0f; data[i++]= 1.3f; data[i++]= -5.0f; //1 data[i++]= 1.0f; data[i++]= 1.3f; data[i++]= -0.1f; //1 //Left wheel roof data[i++]= -1.0f; data[i++]= 1.3f; data[i++]= -0.1f; //1 data[i++]= -1.55f; data[i++]= 1.3f; data[i++]= -0.1f; //1 data[i++]= -1.55f; data[i++]= 1.3f; data[i++]= -5.0f; //1 data[i++]= -1.0f; data[i++]= 1.3f; data[i++]= -5.0f; //1 data[i++]= -1.0f; data[i++]= 1.3f; data[i++]= -0.1f; //1 //Right upper side data[i++]= 1.5f; data[i++]= 1.3f; data[i++]= -0.1f; //1 data[i++]= 1.5f; data[i++]= 1.3f; data[i++]= -3.3f; //1 data[i++]= 1.35f; data[i++]= 1.7f; data[i++]= -3.3f; //1 data[i++]= 1.35f; data[i++]= 1.7f; data[i++]= -0.05f; //1 data[i++]= 1.5f; data[i++]= 1.3f; data[i++]= -0.1f; //1 //Left upper side data[i++]= -1.5f; data[i++]= 1.3f; data[i++]= -0.1f; //1 data[i++]= -1.5f; data[i++]= 1.3f; data[i++]= -3.3f; //1 data[i++]= -1.35f; data[i++]= 1.7f; data[i++]= -3.3f; //1 data[i++]= -1.35f; data[i++]= 1.7f; data[i++]= -0.05f; //1 data[i++]= -1.5f; data[i++]= 1.3f; data[i++]= -0.1f; //1 //Right roof data[i++]= 1.35f; data[i++]= 1.7f; data[i++]= -0.05f; //1 data[i++]= 1.35f; data[i++]= 1.7f; data[i++]= -3.3f; //1 data[i++]= 0.8f; data[i++]= 1.9f; data[i++]= -3.3f; //1 data[i++]= 0.8f; data[i++]= 1.9f; data[i++]= 0.0f; //1 data[i++]= 1.35f; data[i++]= 1.7f; data[i++]= -0.05f; //1 //Left roof data[i++]= -1.35f; data[i++]= 1.7f; data[i++]= -0.05f; //1 data[i++]= -1.35f; data[i++]= 1.7f; data[i++]= -3.3f; //1 data[i++]= -0.8f; data[i++]= 1.9f; data[i++]= -3.3f; //1 data[i++]= -0.8f; data[i++]= 1.9f; data[i++]= 0.0f; //1 data[i++]= -1.35f; data[i++]= 1.7f; data[i++]= -0.05f; //1 //Back Roof data[i++]= -0.8f; data[i++]= 1.9f; data[i++]= 0.0f; //1 data[i++]= 0.8f; data[i++]= 1.9f; data[i++]= 0.0f; //1 data[i++]= 0.8f; data[i++]= 1.9f; data[i++]= -3.3f; //1 data[i++]= -0.8f; data[i++]= 1.9f; data[i++]= -3.3f; //1 data[i++]= -0.8f; data[i++]= 1.9f; data[i++]= 0.0f; //1 //Right Cabin side data[i++]= 1.5f; data[i++]= 1.3f; data[i++]= -3.3f; //1 data[i++]= 1.1f; data[i++]= 1.3f; data[i++]= -4.8f; //1 data[i++]= 1.05f; data[i++]= 1.5f; data[i++]= -4.8f; //1 data[i++]= 1.05f; data[i++]= 1.6f; data[i++]= -4.5f; //1 data[i++]= 1.05f; data[i++]= 1.9f; data[i++]= -4.15f; //1 data[i++]= 1.0f; data[i++]= 1.9f; data[i++]= -3.5f; //1 data[i++]= 1.35f; data[i++]= 1.7f; data[i++]= -3.3f; //1 data[i++]= 1.5f; data[i++]= 1.3f; data[i++]= -3.3f; //1 //Left Cabin side data[i++]= -1.5f; data[i++]= 1.3f; data[i++]= -3.3f; //1 data[i++]= -1.1f; data[i++]= 1.3f; data[i++]= -4.8f; //1 data[i++]= -1.05f; data[i++]= 1.5f; data[i++]= -4.8f; //1 data[i++]= -1.05f; data[i++]= 1.6f; data[i++]= -4.5f; //1 data[i++]= -1.05f; data[i++]= 1.9f; data[i++]= -4.15f; //1 data[i++]= -1.0f; data[i++]= 1.9f; data[i++]= -3.5f; //1 data[i++]= -1.35f; data[i++]= 1.7f; data[i++]= -3.3f; //1 data[i++]= -1.5f; data[i++]= 1.3f; data[i++]= -3.3f; //1 //Cabin Roof data[i++]= -1.0f; data[i++]= 1.9f; data[i++]= -3.5f; //1 data[i++]= 1.0f; data[i++]= 1.9f; data[i++]= -3.5f; //1 data[i++]= 1.05f; data[i++]= 1.9f; data[i++]= -4.15f; //1 data[i++]= -1.05f; data[i++]= 1.9f; data[i++]= -4.15f; //1 data[i++]= -1.0f; data[i++]= 1.9f; data[i++]= -3.5f; //1 //Windscreen data[i++]= -1.05f; data[i++]= 1.9f; data[i++]= -4.15f; data[i++]= 1.05f; data[i++]= 1.9f; data[i++]= -4.15f; data[i++]= 1.05f; data[i++]= 1.6f; data[i++]= -4.5f; data[i++]= -1.05f; data[i++]= 1.6f; data[i++]= -4.5f; data[i++]= -1.05f; data[i++]= 1.9f; data[i++]= -4.15f; return data; } public TexCoord3f[][] createTextureCoordinateData() { TexCoord3f[][] data = new TexCoord3f[2][]; int i = 0; int j = 0; //Back data[0] = new TexCoord3f[11]; data[i][j++]= new TexCoord3f(-1.0f, 0.6f, -0.2f); data[i][j++]= new TexCoord3f( 1.0f, 0.6f, -0.2f); data[i][j++]= new TexCoord3f( 1.0f, 1.3f, -0.1f); data[i][j++]= new TexCoord3f( 1.5f, 1.3f, -0.1f); data[i][j++]= new TexCoord3f( 1.35f, 1.7f, -0.05f); data[i][j++]= new TexCoord3f( 0.8f, 1.9f, 0.0f); data[i][j++]= new TexCoord3f(-0.8f, 1.9f, 0.0f); data[i][j++]= new TexCoord3f(-1.35f, 1.7f, -0.05f); data[i][j++]= new TexCoord3f(-1.5f, 1.3f, -0.1f); data[i][j++]= new TexCoord3f(-1.0f, 1.3f, -0.1f); data[i][j++]= new TexCoord3f(-1.0f, 0.6f, -0.2f); //Right lover side data[++i] = new TexCoord3f[5]; j = 0; data[i][j++]= new TexCoord3f(1.0f, 0.6f, -0.2f); data[i][j++]= new TexCoord3f(1.0f, 0.6f, -5.0f); data[i][j++]= new TexCoord3f(1.0f, 1.3f, -5.5f); data[i][j++]= new TexCoord3f(1.0f, 1.3f, -0.1f); data[i][j++]= new TexCoord3f(1.0f, 0.6f, -0.2f); return data; } public Appearance createMaterialAppearance() { Appearance materialAppear = new Appearance(); PolygonAttributes polyAttrib = new PolygonAttributes(); polyAttrib.setCullFace(PolygonAttributes.CULL_NONE); materialAppear.setPolygonAttributes(polyAttrib); Material material = new Material(); material.setDiffuseColor(new Color3f(0.4f, 0.4f, 0.4f)); materialAppear.setMaterial(material); return materialAppear; } public static void main(String[] args) { Frame frame = new MainFrame(new TestBuildGeomObject(), 600, 400); } } ---------------------------------------------------------------------------- --- import java.applet.*; import java.awt.*; import java.awt.Frame; import java.awt.event.*; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.behaviors.keyboard.*; import javax.media.j3d.*; import javax.vecmath.*; import javax.swing.*; import com.sun.j3d.loaders.*; import java.io.*; import java.util.*; public class TestBuildGeomObject extends Applet implements KeyListener { BranchGroup branchGroup; TransformGroup transformGroup1; Canvas3D canvas3D; SimpleUniverse simpleUniverse; Car car = new Car(); MTLB mtlb = new MTLB(); public void init() { long start = System.currentTimeMillis(); setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); canvas3D = new Canvas3D(config); canvas3D.addKeyListener( this ); add("Center", canvas3D); simpleUniverse = new SimpleUniverse(canvas3D); simpleUniverse.addBranchGraph( addLight() ); BranchGroup branchGroup1 = mtlb; transformGroup1 = (TransformGroup)branchGroup1.getChild(0); simpleUniverse.addBranchGraph( branchGroup1 ); long end = System.currentTimeMillis(); System.out.println((end-start)/1000); } private BranchGroup addLight() { BranchGroup branchGroup = new BranchGroup(); LightManager lightManager = new LightManager(branchGroup); lightManager.addAmbientLight(new Color3f(1f, 1f, 1f)); lightManager.addDirectionalLight(new Vector3f( -0.0f, 0.0f, -10.0f ), new Color3f(0.5f, 0.5f, 0.5f)); branchGroup.compile(); return branchGroup; } public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { if( e.getKeyCode() == KeyEvent.VK_UP ) { ObjectRotationManager.rotX(transformGroup1, Math.PI/4); } else if( e.getKeyCode() == KeyEvent.VK_DOWN ) { ObjectRotationManager.rotX(transformGroup1, -Math.PI/4); } else if( e.getKeyCode() == KeyEvent.VK_RIGHT ) { ObjectRotationManager.rotY(transformGroup1, -Math.PI/4); } else if( e.getKeyCode() == KeyEvent.VK_LEFT ) { ObjectRotationManager.rotY(transformGroup1, Math.PI/4); } else if( e.getKeyCode() == KeyEvent.VK_Z ) { ObjectRotationManager.rotZ(transformGroup1, -Math.PI/4); } else if( e.getKeyCode() == KeyEvent.VK_X ) { ObjectRotationManager.rotZ(transformGroup1, Math.PI/4); } } public void keyReleased(KeyEvent e) { } public static void main(String[] args) { Frame frame = new MainFrame(new TestBuildGeomObject(), 600, 400); } } =========================================================================== 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".