Polygon array dowsn't display

Hi, I'm trying to get a 3D wire-frame model to display using a polygon array in a geometry information object. While this compiles and runs OK it doesn't display anything other than a black window. Can anyone please explain what's happening? Is it a problem with adding the gi component to the scenegraph or something else?

import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

import java.awt.event.WindowAdapter;

import java.awt.GraphicsConfiguration;

import com.sun.j3d.utils.applet.MainFrame;

import com.sun.j3d.utils.universe.* ;

import com.sun.j3d.utils.geometry.*;

import javax.media.j3d.*;

import javax.vecmath.*;

publicclass PlanBextends Appletimplements ActionListener, KeyListener

{

private GeometryInfo gi;

private TransformGroup objTrans;

private Transform3D trans =new Transform3D();

privatefloat xloc=0.0f;

privatefloat yloc=0.0f;

privatefloat zloc=0.0f;

private Shape3D part;//Instansiated in createTank()

publicstaticvoid main(String[] args)

{

PlanB planB=new PlanB();

planB.addKeyListener(planB);

MainFrame mf =new MainFrame(planB, 256, 256);

}

public PlanB()

{

setLayout(new BorderLayout());

GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();

Canvas3D c =new Canvas3D(config);

add("Center", c);

c.addKeyListener(this);

// Create a simple scene and attach it to the virtual universe

BranchGroup scene = createSceneGraph();

SimpleUniverse u =new SimpleUniverse(c);

u.getViewingPlatform().setNominalViewingTransform();

u.addBranchGraph(scene);

}

float[] createCoordinateData()

{

float[] data =newfloat[42*3];

int i = 0;

// XYZfor each point in the polygon

//Draw near view first

data[i++]= -1.0f; data[i++]= -1.0f; data[i++]= 0.0f;//1Back right corner of base

data[i++]= -1.5f; data[i++]= -0.5f; data[i++]= 0.0f;

data[i++]= -1.0f; data[i++]= 0.0f; data[i++]= 0.0f;

data[i++]= +2.0f; data[i++]= 0.0f; data[i++]= 0.0f;//Draws base

data[i++]= +3.0f; data[i++]= -0.5f; data[i++]= 0.0f;//Forward most point

data[i++]= +2.0f; data[i++]= +0.75f; data[i++]= 0.0f;

data[i++]= +2.0f; data[i++]= +0.5f; data[i++]= 0.0f;

data[i++]= +1.0f; data[i++]= +0.5f; data[i++]= 0.0f;

data[i++]= +2.0f; data[i++]= 0.0f; data[i++]= 0.0f;//9

data[i++]= -1.0f; data[i++]= -1.0f; data[i++]= -1.0f;//Back left corner of base

data[i++]= -1.5f; data[i++]= -0.5f; data[i++]= - 1.0f;

data[i++]= -1.0f; data[i++]= 0.0f; data[i++]= -1.0f;

data[i++]= +2.0f; data[i++]= 0.0f; data[i++]= -1.0f;//Draws base

data[i++]= +3.0f; data[i++]= -0.5f; data[i++]= -1.0f;//Forward most point

data[i++]= +2.5f; data[i++]= -1.0f; data[i++]= -1.0f;//6

data[i++]= -1.0f; data[i++]= 0.0f; data[i++]= -1.0f;//Draw top and turret

data[i++]= 0.0f; data[i++]= +1.0f; data[i++]= -1.0f;//Highest point - Antanae array on top of here

data[i++]= +0.5f; data[i++]= +0.75f; data[i++]= -1.0f;

data[i++]= +2.0f; data[i++]= +0.75f; data[i++]= - 1.0f;

data[i++]= +2.0f; data[i++]= +0.5f; data[i++]= -1.0f;

data[i++]= +1.0f; data[i++]= +0.5f; data[i++]= -1.0f;//25

data[i++]= +2.0f; data[i++]= 0.0f; data[i++]= -1.0f;//26

//Creates connecting polygon

data[i++]= -1.0f; data[i++]= -1.0f; data[i++]= 0.0f;//1

data[i++]= -1.5f; data[i++]= -0.5f; data[i++]= 0.0f;

data[i++]= -1.0f; data[i++]= 0.0f; data[i++]= 0.0f;

data[i++]= 0.0f; data[i++]= +1.0f; data[i++]= 0.0f;

data[i++]= +0.5f; data[i++]= +0.75f; data[i++]= -0.25f;//5

data[i++]= +2.0f; data[i++]= 0.75f; data[i++]= -0.25f;

data[i++]= +1.0f; data[i++]= +0.5f; data[i++]= 0.0f;

data[i++]= +2.0f; data[i++]= 0.0f; data[i++]= 0.0f;

data[i++]= +3.0f; data[i++]= -0.5f; data[i++]= 0.0f;

data[i++]= +2.5f; data[i++]= -1.0f; data[i++]= 0.0f;//10

data[i++]= +2.5f; data[i++]= -1.0f; data[i++]= -1.0f;

data[i++]= +3.0f; data[i++]= - 0.5f; data[i++]= -1.0f;

data[i++]= +2.0f; data[i++]= 0.0f; data[i++]= -1.0f;

data[i++]= +1.0f; data[i++]= +0.5f; data[i++]= -1.0f;

data[i++]= +2.0f; data[i++]= +0.75f; data[i++]= -.75f;//15

data[i++]= +0.5f; data[i++]= 0.75f; data[i++]= +0.75f;

data[i++]= 0.0f; data[i++]= +1.0f; data[i++]= -1.0f;

data[i++]= -1.0f; data[i++]= 0.0f; data[i++]= -1.0f;

data[i++]= -1.5f; data[i++]= -0.5f; data[i++]= -1.0f;

data[i++]= - 1.0f; data[i++]= -1.0f; data[i++]= -1.0f;//20

return data;

}

public BranchGroup createSceneGraph()

{

// Create the root of the branch graph

BranchGroup objRoot =new BranchGroup();

objTrans =new TransformGroup();

objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

objRoot.addChild(objTrans);

createTank();//GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY );

objTrans =new TransformGroup();

objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

Transform3D pos1 =new Transform3D();

//pos1.setTranslation(new Vector3f(xloc,yloc,zloc));

pos1.setTranslation(new Vector3f(0.0f,0.0f,0.0f));

objTrans.setTransform(pos1);

objTrans.addChild(part);

objRoot.addChild(objTrans);

BoundingSphere bounds =new BoundingSphere(new Point3d( 0.0,0.0,0.0), 100.0);

// Let Java 3D perform optimizations on this scene graph.

objRoot.compile();

return objRoot;

}

public GeometryInfo createTank()

{

int total = 0;

float[] coordinateData =null;

coordinateData = createCoordinateData();

int[] stripCount ={9,6,7,20};

GeometryInfo gi =new GeometryInfo(GeometryInfo.POLYGON_ARRAY);

gi.setStripCounts(stripCount);

gi.setCoordinates(coordinateData);

gi.recomputeIndices();

new NormalGenerator().generateNormals(gi);

gi.recomputeIndices();

new Stripifier().stripify(gi);

gi.recomputeIndices();

GeometryArray ga = gi.getGeometryArray();

ga.setCapability(Geometry.ALLOW_INTERSECT);

//gi.setGeometry(ga);

Shape3D part=new Shape3D();

part.setGeometry(gi.getGeometryArray());

createWireFrameAppearance();

BranchGroup contentRoot =new BranchGroup();

return gi;

}

public Appearance createWireFrameAppearance()

{

Appearance materialAppear =new Appearance();

PolygonAttributes polyAttrib =new PolygonAttributes();

polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);

materialAppear.setPolygonAttributes (polyAttrib);

ColoringAttributes greenColoring =new ColoringAttributes();

greenColoring.setColor(0.0f, 1.0f, 0.0f);

materialAppear.setColoringAttributes(greenColoring);

return materialAppear;

}

publicvoid keyPressed(KeyEvent e){

//Invoked when a key has been pressed.

if (e.getKeyChar()=='a')

{

xloc = xloc - .1f;

}

if ( e.getKeyChar()=='d')

{

xloc = xloc + .1f;

}

if (e.getKeyChar()=='w')

{

yloc = yloc + .1f;

}

if (e.getKeyChar()=='s')

{

yloc = yloc - .1f;

}

if (e.getKeyChar()=='b')

{

zloc = zloc - .1f;

}

if (e.getKeyChar()=='f')

{

zloc = zloc + .1f;

}

trans.set(new Vector3d(xloc,yloc,zloc));

objTrans.setTransform(trans);

System.out.println("X "+xloc+"Y "+yloc+"Z "+zloc);

}

publicvoid keyReleased(KeyEvent e){}

publicvoid keyTyped(KeyEvent e){}

publicvoid actionPerformed(ActionEvent e ){}

}

[12543 byte] By [Hard_Wireda] at [2007-9-25]
# 1

I changed some of the code where indicated to set the geometry to a shape3D and add it to the scenegraph and create some lights and add those to the viewing platform.

regards

import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

import java.awt.event.WindowAdapter;

import java.awt.GraphicsConfiguration;

import com.sun.j3d.utils.applet.MainFrame;

import com.sun.j3d.utils.universe.* ;

import com.sun.j3d.utils.geometry.*;

import javax.media.j3d.*;

import javax.vecmath.*;

public class PlanB extends Applet implements ActionListener, KeyListener

{

private GeometryInfo gi;

private TransformGroup objTrans;

private Transform3D trans = new Transform3D();

private float xloc=0.0f;

private float yloc=0.0f;

private float zloc=0.0f;

private Shape3D part;//Instansiated in createTank()

SimpleUniverse u;

public static void main(String[] args)

{

PlanB planB=new PlanB();

planB.addKeyListener(planB);

MainFrame mf = new MainFrame(planB, 256, 256);

}

public PlanB()

{

setLayout(new BorderLayout());

GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();

Canvas3D c = new Canvas3D(config);

add("Center", c);

c.addKeyListener(this);

// Create a simple scene and attach it to the virtual universe

BranchGroup scene = createSceneGraph();

//SimpleUniverse u = new SimpleUniverse(c);

u = new SimpleUniverse(c);

doLights();

u.getViewingPlatform().setNominalViewingTransform();

u.addBranchGraph(scene);

}

// I added this

public void doLights() {

PlatformGeometry pg = new PlatformGeometry();

ViewingPlatform viewingPlatform = u.getViewingPlatform();

BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

// Set up the ambient light

Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);

AmbientLight ambientLightNode = new AmbientLight(ambientColor);

ambientLightNode.setInfluencingBounds(bounds);

pg.addChild(ambientLightNode);

// Set up the directional lights

Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);

Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);

Color3f light2Color = new Color3f(1.0f, 1.0f, 1.0f);

Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);

DirectionalLight light1

= new DirectionalLight(light1Color, light1Direction);

light1.setInfluencingBounds(bounds);

pg.addChild(light1);

DirectionalLight light2

= new DirectionalLight(light2Color, light2Direction);

light2.setInfluencingBounds(bounds);

pg.addChild(light2);

viewingPlatform.setPlatformGeometry( pg );

}

float[] createCoordinateData()

{

float[] data = new float[42*3];

int i = 0;

// XYZfor each point in the polygon

//Draw near view first

data[i++]= -1.0f; data[i++]= -1.0f; data[i++]= 0.0f;//1Back right corner of base

data[i++]= -1.5f; data[i++]= -0.5f; data[i++]= 0.0f;

data[i++]= -1.0f; data[i++]= 0.0f; data[i++]= 0.0f;

data[i++]= +2.0f; data[i++]= 0.0f; data[i++]= 0.0f; //Draws base

data[i++]= +3.0f; data[i++]= -0.5f; data[i++]= 0.0f;//Forward most point

data[i++]= +2.0f; data[i++]= +0.75f; data[i++]= 0.0f;

data[i++]= +2.0f; data[i++]= +0.5f; data[i++]= 0.0f;

data[i++]= +1.0f; data[i++]= +0.5f; data[i++]= 0.0f;

data[i++]= +2.0f; data[i++]= 0.0f; data[i++]= 0.0f;//9

data[i++]= -1.0f; data[i++]= -1.0f; data[i++]= -1.0f;//Back left corner of base

data[i++]= -1.5f; data[i++]= -0.5f; data[i++]= - 1.0f;

data[i++]= -1.0f; data[i++]= 0.0f; data[i++]= -1.0f;

data[i++]= +2.0f; data[i++]= 0.0f; data[i++]= -1.0f;//Draws base

data[i++]= +3.0f; data[i++]= -0.5f; data[i++]= -1.0f;//Forward most point

data[i++]= +2.5f; data[i++]= -1.0f; data[i++]= -1.0f;//6

data[i++]= -1.0f; data[i++]= 0.0f; data[i++]= -1.0f;//Draw top and turret

data[i++]= 0.0f; data[i++]= +1.0f; data[i++]= -1.0f;//Highest point - Antanae array on top of here

data[i++]= +0.5f; data[i++]= +0.75f; data[i++]= -1.0f;

data[i++]= +2.0f; data[i++]= +0.75f; data[i++]= - 1.0f;

data[i++]= +2.0f; data[i++]= +0.5f; data[i++]= -1.0f;

data[i++]= +1.0f; data[i++]= +0.5f; data[i++]= -1.0f;//25

data[i++]= +2.0f; data[i++]= 0.0f; data[i++]= -1.0f;//26

//Creates connecting polygon

data[i++]= -1.0f; data[i++]= -1.0f; data[i++]= 0.0f;//1

data[i++]= -1.5f; data[i++]= -0.5f; data[i++]= 0.0f;

data[i++]= -1.0f; data[i++]= 0.0f; data[i++]= 0.0f;

data[i++]= 0.0f; data[i++]= +1.0f; data[i++]= 0.0f;

data[i++]= +0.5f; data[i++]= +0.75f; data[i++]= -0.25f;//5

data[i++]= +2.0f; data[i++]= 0.75f; data[i++]= -0.25f;

data[i++]= +1.0f; data[i++]= +0.5f; data[i++]= 0.0f;

data[i++]= +2.0f; data[i++]= 0.0f; data[i++]= 0.0f;

data[i++]= +3.0f; data[i++]= -0.5f; data[i++]= 0.0f;

data[i++]= +2.5f; data[i++]= -1.0f; data[i++]= 0.0f;//10

data[i++]= +2.5f; data[i++]= -1.0f; data[i++]= -1.0f;

data[i++]= +3.0f; data[i++]= - 0.5f; data[i++]= -1.0f;

data[i++]= +2.0f; data[i++]= 0.0f; data[i++]= -1.0f;

data[i++]= +1.0f; data[i++]= +0.5f; data[i++]= -1.0f;

data[i++]= +2.0f; data[i++]= +0.75f; data[i++]= -.75f;//15

data[i++]= +0.5f; data[i++]= 0.75f; data[i++]= +0.75f;

data[i++]= 0.0f; data[i++]= +1.0f; data[i++]= -1.0f;

data[i++]= -1.0f; data[i++]= 0.0f; data[i++]= -1.0f;

data[i++]= -1.5f; data[i++]= -0.5f; data[i++]= -1.0f;

data[i++]= - 1.0f; data[i++]= -1.0f; data[i++]= -1.0f;//20

return data;

}

public BranchGroup createSceneGraph()

{

// Create the root of the branch graph

BranchGroup objRoot = new BranchGroup();

objTrans = new TransformGroup();

objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

objRoot.addChild(objTrans);

//I changed this

GeometryInfo gi = createTank();//GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY );

Shape3D shape = new Shape3D();

Geometry geom = (Geometry) gi.getGeometryArray();

shape.setGeometry(geom);

Appearance app = createWireFrameAppearance();

shape.setAppearance(app);

objTrans = new TransformGroup();

objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

Transform3D pos1 = new Transform3D();

//pos1.setTranslation(new Vector3f(xloc,yloc,zloc));

pos1.setTranslation(new Vector3f(0.0f,0.0f,-5.0f));

objTrans.setTransform(pos1);

//objTrans.addChild(part);//?

objTrans.addChild(shape);

objRoot.addChild(objTrans);

BoundingSphere bounds = new BoundingSphere(new Point3d( 0.0,0.0,0.0), 100.0);// ?

// Let Java 3D perform optimizations on this scene graph.

objRoot.compile();

return objRoot;

}

public GeometryInfo createTank()

{

int total = 0;

float[] coordinateData = null;

coordinateData = createCoordinateData();

int[] stripCount = {9,6,7,20};

GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY);

gi.setStripCounts(stripCount);

gi.setCoordinates(coordinateData);

gi.recomputeIndices();

new NormalGenerator().generateNormals(gi);

gi.recomputeIndices();

new Stripifier().stripify(gi);

gi.recomputeIndices();

GeometryArray ga = gi.getGeometryArray();

ga.setCapability(Geometry.ALLOW_INTERSECT);

//gi.setGeometry(ga);

Shape3D part=new Shape3D();

part.setGeometry(gi.getGeometryArray());

createWireFrameAppearance();

BranchGroup contentRoot = new BranchGroup();

return gi;

}

public Appearance createWireFrameAppearance()

{

Appearance materialAppear = new Appearance();

PolygonAttributes polyAttrib = new PolygonAttributes();

polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);

materialAppear.setPolygonAttributes (polyAttrib);

ColoringAttributes greenColoring = new ColoringAttributes();

greenColoring.setColor(0.0f, 1.0f, 0.0f);

materialAppear.setColoringAttributes(greenColoring);

return materialAppear;

}

public void keyPressed(KeyEvent e) {

//Invoked when a key has been pressed.

if (e.getKeyChar()=='a')

{

xloc = xloc - .1f;

}

if ( e.getKeyChar()=='d')

{

xloc = xloc + .1f;

}

if (e.getKeyChar()=='w')

{

yloc = yloc + .1f;

}

if (e.getKeyChar()=='s')

{

yloc = yloc - .1f;

}

if (e.getKeyChar()=='b')

{

zloc = zloc - .1f;

}

if (e.getKeyChar()=='f')

{

zloc = zloc + .1f;

}

trans.set(new Vector3d(xloc,yloc,zloc));

objTrans.setTransform(trans);

System.out.println("X "+xloc+"Y "+yloc+"Z "+zloc);

}

public void keyReleased(KeyEvent e){}

public void keyTyped(KeyEvent e){}

public void actionPerformed(ActionEvent e ){}

}

messengersa at 2007-7-15 > top of java,Security,Cryptography...
# 2

Thanks for replying, after a LOT of Googling I found that you need at least one light in a scene to make an object appear, but I didn't think I'd need it as I don't even have any solid surfaces.

Just to clarify the changes for myself and anyone else having the same problem: In the above code the Shape3D part variable can be removed as you only need one and in this case it only needs to have a local scope. The Bounding Sphere in doLights() has already been declared in createSceneGraph() so one of them can safely be removed, and because its not a solid object the two directional lights can be omitted if desired. Now, about those co-ordinates... Oh well, it should be far easier now I can actually see how they're displaying. Thanks messengers for your help I was really stuck here.

Hard_Wireda at 2007-7-15 > top of java,Security,Cryptography...