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 ){}
}
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 ){}
}