Ciao, stò cercando di disegnare degli edifici in 3d usando delle coordinate x,y,z reali
Il problema è che non riesco a visualizzarle nello schermo in quanto le coordinate sono tanto grandi...come faccio per ridimensionare il contenuto in modo da riuscire e vedere gli oggetti nello shermo?
Grazie
import java.awt.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.geometry.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import javax.swing.*;
public class GeomInfoAppMOD extends JFrame
{
public GeomInfoAppMOD()
{
//Recupera le configurazioni grafiche del computer
GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration();
//Crea il Canvas3D e lo aggiunge al frame
Canvas3D canvas3D=new Canvas3D(config);
this.getContentPane().add(canvas3D,BorderLayout.CENTER);
//Crea la scena
BranchGroup scene=createSceneGraph();
//Crea il SimpleUniverse
SimpleUniverse simpleU=new SimpleUniverse(canvas3D);
//Questo comando serve per spostare leggermente indietro il sistema di riferimento
simpleU.getViewingPlatform().setNominalViewingTransform();
//Compila la scena (subito prima di renderla viva)
scene.compile();
//Aggiunge la scena all'universo
simpleU.addBranchGraph(scene);
}
//Crea la scena
public BranchGroup createSceneGraph()
{
//Crea la radice del branch graph
BranchGroup objRoot=new BranchGroup();
//Crea un gruppo per le trasformazioni affini
TransformGroup objSpin=new TransformGroup();
//Imposta la capacita' di scrivere la trasformazione
objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
BoundingSphere mouseBounds = new BoundingSphere(new Point3d(), 1000.0);
MouseRotate myMouseRotate = new MouseRotate();
myMouseRotate.setTransformGroup(objSpin);
myMouseRotate.setSchedulingBounds(mouseBounds);
objRoot.addChild(myMouseRotate);
MouseTranslate myMouseTranslate = new MouseTranslate();
myMouseTranslate.setTransformGroup(objSpin);
myMouseTranslate.setSchedulingBounds(mouseBounds);
objRoot.addChild(myMouseTranslate);
MouseZoom myMouseZoom = new MouseZoom();
myMouseZoom.setTransformGroup(objSpin);
myMouseZoom.setSchedulingBounds(mouseBounds);
objRoot.addChild(myMouseZoom);
//Aggiunge al gruppo l'automobile
this.addEdif(objSpin);
BoundingSphere bounds=new BoundingSphere();
//Aggiunge alla radice il gruppo
objRoot.addChild(objSpin);
//Aggiunge uno sfondo
Background background=new Background();
background.setColor(1.0f,1.0f,1.0f);
background.setApplicationBounds(bounds);
objRoot.addChild(background);
//Aggiunge una luce direzionale
DirectionalLight lightD=new DirectionalLight();
lightD.setDirection(new Vector3f(0.0f,-0.7f,-0.7f));
lightD.setInfluencingBounds(bounds);
objRoot.addChild(lightD);
//Aggiunge una luce ambientale
AmbientLight lightA=new AmbientLight();
lightA.setInfluencingBounds(bounds);
objRoot.addChild(lightA);
return objRoot;
}
private Appearance createAppearance()
{
//Crea l'aspetto dell'automobile
Appearance materialAppear=new Appearance();
//Attiva sia la rasterizzazione interna sia quella esterna
PolygonAttributes polyAttrib=new PolygonAttributes();
polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);
materialAppear.setPolygonAttributes(polyAttrib);
//Attiva un colore per le illuminazioni
Material material=new Material();
material.setDiffuseColor(new Color3f(1.0f,0.0f,0.0f));
materialAppear.setMaterial(material);
return materialAppear;
}
public void addEdif(Group g)
{
//Crea le coordinate del poligono
float[] coordinateData=this.createCoordinateData();
//Imposta lo strip count dei vari poligoni
int[] stripCount={7};
//Crea una GeometryInfo (il Triangulator viene creato automaticamente dalla GeometryInfo)
GeometryInfo gi=new GeometryInfo(GeometryInfo.POLYGON_ARRAY);
//Imposta le coordinate del poligono (ed attiva la triangolazione)
gi.setCoordinates(coordinateData);
//Imposta lo strip count
gi.setStripCounts(stripCount);
//Calcola le normali del poligono (servono per l'illuminazione)
NormalGenerator ng=new NormalGenerator();
ng.generateNormals(gi);
gi.recomputeIndices();
//Semplifica la figura raggruppando i triangoli
Stripifier st=new Stripifier();
st.stripify(gi);
gi.recomputeIndices();
//Crea lo shape impostando forma ed aspetto
Shape3D edif=new Shape3D();
edif.setAppearance(this.createAppearance());
edif.setGeometry(gi.getGeometryArray());
g.addChild(edif);
//Aggunge anche un contorno a tutta la forma per rendere piu' visibili i punti da cui si e'
//partiti nella creazione della forma
LineStripArray lineArray=new LineStripArray(69,LineArray.COORDINATES,stripCount);
//Imposta le coordinate
lineArray.setCoordinates(0,coordinateData);
//Crea un aspetto (colore e spessore delle linee)
Appearance blueColorAppearance=new Appearance();
ColoringAttributes blueColoring=new ColoringAttributes();
blueColoring.setColor(0.0f,0.0f,1.0f);
blueColorAppearance.setColoringAttributes(blueColoring);
LineAttributes lineAttrib=new LineAttributes();
lineAttrib.setLineWidth(2.0f);
blueColorAppearance.setLineAttributes(lineAttrib);
g.addChild(new Shape3D(lineArray,blueColorAppearance));
}
//Crea l'array delle coordinata (il codice e' irrilevante)
private float[] createCoordinateData()
{
float[] data = new float[3*7];
int i = 0;
data[i++]= 2279248.0200805664f; data[i++] = 4653171.650085449f; data[i++] = 34.937132596262515f;
data[i++]= 2279244.210083008f; data[i++] = 4653175.455078125f; data[i++] = 34.9095127190779f;
data[i++]= 2279240.400085449f; data[i++] = 4653179.260070801f; data[i++] = 34.83166936693065f;
data[i++]= 2279244.8900756836f; data[i++] = 4653183.890075684f; data[i++] = 35.042577340309236f;
data[i++]= 2279248.705078125f; data[i++] = 4653180.225097656f; data[i++] = 35.12231819204961f;
data[i++]= 2279252.5200805664f; data[i++] = 4653176.560119629f; data[i++] = 35.19422259835226f;
data[i++]= 2279248.0200805664f; data[i++] = 4653171.650085449f; data[i++] = 34.937132596262515f;
return data;
}
public static void main(String[] args)
{
GeomInfoAppMOD edif=new GeomInfoAppMOD();
edif.setTitle("Car");
edif.setSize(300,300);
edif.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
edif.setVisible(true);
}
}