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".

Reply via email to