Erreur d'execution: java.lang.NullPointerException

Signaler
Messages postés
1
Date d'inscription
lundi 6 janvier 2003
Statut
Membre
Dernière intervention
24 mai 2003
-
Messages postés
890
Date d'inscription
lundi 8 avril 2002
Statut
Membre
Dernière intervention
29 juillet 2004
-
A la compilation d'un projet java3D j'obtient le message d'erreur suivant :

Exception in thread "main" java.lang.NullPointerException
at javax.vecmath.Tuple2f.<Tuple2f.java:66>
at javax.vecmath.TexCoord2f.<TexCoord2f.java:64>
at com.sun.j3d.utils.geometry.GeometryInfo.setTextureCoordinates<GeometryInfo.java:1001>
at hopSimu.ShapeImmeuble.ConstruireImmeuble<ShapeImmeuble.java:104>
at hopSimu.ShapeImmeuble.<ShapeImmeuble.java:31>
at hop3D.HopWorld.<HopWorld.java:44>
at GSimu3D.<GSimu3D.java:31>
at GSimu3D.main<GSimu3D.java:124>

C'est un programme de simulation de déplacement de voiture dans une ville avec des immeubles en 3D.

Voici ShapeImmeuble.java:

package hopSimu;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GraphicsConfiguration;
import javax.swing.JFrame;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.image.TextureLoader;

import mathog.* ;
import hop3D.*;

public class ShapeImmeuble extends Shape3D
{
private GGraphe immeuble;
private Point3f[] pointsimmeuble;
private int[] TIndices;
private GeometryInfo immeubleGI;
private float hauteur;
private Hop3D hop;

//constructor
public ShapeImmeuble(GGraphe im, Hop3D h)
{
immeuble=im;
hop = h;
ConstruireImmeuble();
}

public GGraphe getImmeuble(){ return immeuble;}

//accesseur aux points qui définissent le toit de l'immeuble
public Point3f getPointsToitImmeuble(int i) {return pointsimmeuble[immeuble.getNbrSommets()+i];}

//method
public void ConstruireImmeuble()
{
int PointsFondation = immeuble.getNbrSommets() ; //on récupère le nb de sommets enregistrés
int NbrPoints = 2 * PointsFondation; // a chaque sommet correspond un point en hauteur
int NbrQuad = immeuble.getNbrArcs(); //a chaque arc correspond un pan de mur
int NbrIndices = 4 * NbrQuad; // 4 points par surface
Point2f[] texCoords;

hauteur = 20 + 80 * (float)java.lang.Math.random();

// on rempli le tableau de point dont les indices vont nous servir pour construir le tIndices
pointsimmeuble = new Point3f[NbrPoints];

texCoords = new Point2f[NbrIndices];

//on reference les point au sol
for (int i=0; i < PointsFondation ;i++)
{
pointsimmeuble[i] = new Point3f((float)immeuble.getSommet(i).getX(), 0.0f, (float)immeuble.getSommet(i).getY());
}
//on réference les points du toit
for (int i = PointsFondation; i < NbrPoints; i++)
{
pointsimmeuble[i] = new Point3f((float)immeuble.getSommet(i-PointsFondation).getX(), hauteur, (float)immeuble.getSommet(i-PointsFondation).getY());
}

//on construit Tindice qui va grouper 4 par 4 les points pour en faire des surfaces
// a chaque valeur de i correspond 4 point faisant une face
TIndices = new int[NbrIndices];

int j=0;
// traitement des premieres faces
for (int i=0; i<NbrQuad-1 ; i++)
{
TIndices[j]= i;
TIndices[j+1]=i+1;
TIndices[j+2]=PointsFondation+i+1;
TIndices[j+3]=PointsFondation+i;
j+=4;
}

// traitement de la derniere face
TIndices[j] = PointsFondation - 1;
TIndices[j+1] = 0;
TIndices[j+2] = PointsFondation;
TIndices[j+3] = NbrPoints - 1;

immeubleGI = new GeometryInfo(GeometryInfo.QUAD_ARRAY);

immeubleGI.setCoordinateIndices(TIndices);
immeubleGI.setCoordinates(pointsimmeuble);

// we compute the normals
NormalGenerator ng = new NormalGenerator();
ng.generateNormals(immeubleGI);

// we want triangle strips (again for optimization)
Stripifier st = new Stripifier();
st.stripify(immeubleGI);

this.setGeometry(immeubleGI.getGeometryArray());

// texture coordinate assignments fof the first plane
immeubleGI.setTextureCoordinates(texCoords);

Appearance app = new Appearance();

// create the material
//Color3f color = new Color3f((float)java.lang.Math.random(),(float)java.lang.Math.random(), (float)java.lang.Math.random());

//Material mat = new Material(color, new Color3f(0.0f, 0.0f, 0.0f), color, color, 0.0f);
Material mat = new Material();

/*TextureLoader loader=new TextureLoader("stone.jpg", hop.getHopViz().getCanvas3D());
ImageComponent2D image=loader.getImage();

Texture2D texture=new Texture2D(Texture.BASE_LEVEL,Texture.RGBA,image.getWidth(),image.getHeight());
texture.setImage(0, image);
texture.setEnable(true);
texture.setMagFilter(Texture.BASE_LEVEL_LINEAR);
texture.setMinFilter(Texture.BASE_LEVEL_LINEAR);

app.setTexture(texture);
app.setTextureAttributes(new TextureAttributes());

immeubleGI.getGeometryArray().setTextureCoordinateIndex(0,0,0);*/

app.setMaterial(mat);

this.setAppearance(app);
}
}

VOICI HopWorld.java:

package hop3D;

import javax.media.j3d.*;
import javax.vecmath.Vector3d;
import javax.vecmath.Point3d;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import mathog.*;
import hopSimu.*;

public class HopWorld
{
private BranchGroup worldBG;
private TransformGroup worldTG;
private GImmeubles worldImmeubles;
private Shape3D shapeIm;

public HopWorld(Hop3D hop, GGraphe g)
{
worldBG = new BranchGroup();
worldTG = new TransformGroup();

worldBG.addChild(worldTG);

// we build the streets
worldTG.addChild(new Routes(g));

// we build the ground
worldTG.addChild(new ShapeSol(g, hop));

// we build the buildings
worldImmeubles = new GImmeubles();
worldImmeubles.lireFichier("res_immeubles.txt");

for (int i=0; i<worldImmeubles.getNbrImmeubles(); i++)
{
shapeIm = new ShapeImmeuble(worldImmeubles.getImmeuble(i), hop);
worldTG.addChild(shapeIm);
worldTG.addChild(new ShapeToit((ShapeImmeuble)shapeIm));
}

//worldTG.addChild(new ShapeVoiture(5));

hop.getHopVolBG().addChild(worldBG);
}
}

VOICI GSimu3D.java:

import hop3D.*;
import mathog.*;
import hopSimu.*;
import javax.vecmath.*;
import java.util.*;

public class GSimu3D implements Runnable
{
private GSimu simu;
private Hop3D hop3dDevice;
private HopCamera cam;
private HopWorld hopWorld;

private Random random ;
private Thread thread ;

private int animSpeed ;
private int frameWidth=500, frameHeight=500 ;

private int nbVoitures;

public GSimu3D()
{
simu = new GSimu();
random = new Random() ;
hop3dDevice = new Hop3D();
thread = null ;
animSpeed = 10 ;
//cam = new HopCamera(new Point3d(25.0, 30.0, 100.0), new Point3d(25.0, 10.0, 10.0));

hopWorld = new HopWorld(hop3dDevice, (GGraphe)simu);

nbVoitures = 0;
HopVehicules testVehicules = new HopVehicules(hop3dDevice);

for (;;)
{
if (nbVoitures < 5)
{
GVehicule vehicule = new GVehicule();
GSommet somSource, somPuit;
somSource = ((GGraphe)simu).getRandomSommet();
somPuit = somSource;

while (somPuit == somSource)
somPuit = ((GGraphe)simu).getRandomSommet();

Vector tmpVec = vehicule.computeRandomPath((GGraphe)simu, somSource, somPuit);

if (tmpVec != null)
{
Hop3DVehicule tmpVehicule = new Hop3DVehicule(tmpVec, (float)java.lang.Math.random()*2.0f);
testVehicules.addVehicule(tmpVehicule);
nbVoitures++;
}
}
}

//hop3dDevice.setCamera(cam);
//hop3dDevice.updateCamera();
}

// get
public GSimu getSimu () { return simu ; }
public int getAnimSpeed () { return animSpeed ; }

// set
public void setAnimSpeed (int as) { animSpeed = as ; }

public void run()
{
while (true)
{
try { thread.sleep(animSpeed) ; } catch (Exception e) {}

// Generation des vehicules
if (random.nextDouble() < 0.05 )
{
GVehicule v = new GVehicule(simu.getSommet(0)) ;
v.definirCible(simu) ;
simu.getVehicules().add(v) ;
}

// Avancement des vehicules
for (int i=0 ; i<simu.getVehicules().size() ; i++)
{
GVehicule v = (GVehicule)simu.getVehicules().elementAt(i) ;
if (!v.deplace())
{
if (v.getSommetFin() == simu.getSommet(simu.getNbrSommets()-1))
{
// destruction
simu.getVehicules().removeElementAt (i) ;
}
else
v.definirCible (simu) ;
}
}
}
}

public void startAnim()
{
if (thread==null)
{
thread = new Thread(this) ;
thread.start() ;
}
}

public void stopAnim()
{
if (thread!=null)
{
thread.stop () ;
thread = null ;
}
}

public static void main(String[] args)
{
GSimu3D pouet;

pouet = new GSimu3D();
//pouet.startAnim();
}
}

J'aurais voulu joindre le projet en entier mais cela n'est pas possible.
UN GRAND MERCI à ceux qui me sauveront car j'en ai grand besoin !!

AmjaD.

1 réponse

Messages postés
890
Date d'inscription
lundi 8 avril 2002
Statut
Membre
Dernière intervention
29 juillet 2004
12
salut,
visiblement c est cette ligne qui fait tout foirer :
immeubleGI.setTextureCoordinates(texCoords);
est ce que tu as bien initialisé ton tableau ????
(ou rempli)
Duss