Marbury
14-02-2008, 14:36
salve, ho un problema che non riesco a risolvere, in pratica disegno un cubo che non è altro che tanti Box inseriti vicini e vorrei far ruotare il sistema però non ci riesco, posto il codice e spiego perchè:
public class Cubo extends TransformGroup{
private Box box;
private static TextureLoader loader=new TextureLoader("red.jpg",null);
private static TextureLoader loader2=new TextureLoader("green.jpg",null);
public Cubo(float x, float y, float z){
super();
//System.out.println("CREA CUBO");
Transform3D transform = new Transform3D();
Vector3f vector = new Vector3f(x,y,z);
transform.setTranslation(vector);
setTransform(transform);
Appearance a = new Appearance();
a.setTexture(loader.getTexture());
TextureAttributes texAttr = new TextureAttributes();
texAttr.setTextureMode(TextureAttributes.MODULATE);
a.setTextureAttributes(texAttr);
/* Material mat = new Material();
mat.setDiffuseColor(new Color3f(1.0f, 0.0f, 0.0f));
//mat.setSpecularColor(new Color3f(1.0f, 0.0f, 0.0f));
mat.setShininess(1.0f);
a.setMaterial(mat);*/
box = new Box(0.1f, 0.1f, 0.1f, Box.GENERATE_TEXTURE_COORDS, a);
box.setAppearance(a);
addChild(box);
}
Qui disegno tutti i cubi e se inserisco il codice per la rotazione qui mi da il problema che invece di far ruotare il sistema "centralmente" ruota attorno all'ultimo cubo inserito
class GruppoCubo extends TransformGroup{
//Memorizza puntatori alle matrici che contengono i cubi
private Vector<Cubo[][]> facce = null;
private int numCubiRiga = 0;
public GruppoCubo(int n, float x, float y, float z){
numCubiRiga = n;
Cubo[][] faccia = null;
float indiceZ = 0.0f; float indiceY = 0.0f; float indiceX = 0.0f;
int i = 0; int j = 0; //mi servono per calcolare gli indici dove salvare i cubi
while(indiceZ > (-n*0.23f)){
//System.out.println("indiceZ, n = " + (-n*0.1f) + " "+indiceZ);
i = 0; j = 0;
faccia = new Cubo[n][n];
while(indiceY > (-n*0.23f)){
//System.out.println("indiceY, n = "+ (-n*0.1f)+ " " + indiceY);
while(indiceX < (n*0.23f)){
//System.out.println("indiceX, n= " + (-n*0.1f)+" " + indiceX);
faccia[i][j] = new Cubo(indiceX, indiceY, indiceZ);
if(indiceX == 0.0f) (faccia[i][j]).coloraCubo(1);
addChild(faccia[i][j]);
indiceX = indiceX + 0.23f;
i += 1;
}
indiceX=0;
i=0; j = j+1;
indiceY = indiceY - 0.23f;
}
indiceY=0;
indiceZ = indiceZ -0.23f;
}
System.out.println("OUT");
Vector3f vector = null;
Transform3D transform = new Transform3D();
transform.setScale(1);
vector = new Vector3f(x,y,z);
transform.setTranslation(vector);
setTransform(transform);
setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
//Crea il behavior per ruotare il cubo
/* RotazioneCubo rc = new RotazioneCubo(/*cuboGrafico*///);
/* RotazioneMouse myMouseRotate2= new RotazioneMouse(this,rc);
myMouseRotate2.setSchedulingBounds(new BoundingSphere());
addChild(myMouseRotate2);*/
}
Questa classe estende simpleUniverse e se lo scrivo qua non ruota proprio nulla!!! Credevo fosse quest'ultima soluzione quella giusta e invece... qualcuno ha qualche idea da darmi? Grazie mille
public class DrawCubo extends SimpleUniverse{
private GruppoCubo cubo;
private BranchGroup root = null;
//Riceve come parametro il num elementi di una riga
public DrawCubo(int n, Canvas3D canvas){
super(canvas);
switch (n){
case 5: cubo = new GruppoCubo(n, 0f, 0.2f, -2f);
break;
case 10: cubo = new GruppoCubo(n, 0f, 0.1f, -10f);
break;
case 15: cubo = new GruppoCubo(n, 0f, -0.1f, -19f);
break;
case 7: cubo = new GruppoCubo(n, 0f, 0.2f, -5f);
break;
case 14: cubo = new GruppoCubo(n, 0f, 0.0f, -17f);
break;
case 21: cubo = new GruppoCubo(n, 0f, -0.2f, -29f);
break;
case 9: cubo = new GruppoCubo(n, 0f, 0.2f, -9f);
break;
case 18: cubo = new GruppoCubo(n, 0f, -0.15f, -24f);
break;
case 27: cubo = new GruppoCubo(n, 0f, -0.3f, -39f);
break;
}
root = new BranchGroup();
root.addChild(cubo);
getViewingPlatform().setNominalViewingTransform();
/*
TextureLoader loader=new TextureLoader("sfondo.jpg",null);
ImageComponent2D image=loader.getImage();
Background bg = new Background(image);
BoundingSphere infinity = new BoundingSphere(new Point3d(), Double.POSITIVE_INFINITY);
bg.setApplicationBounds(infinity);
root.addChild(bg);*/
//Crea un gruppo per le trasformazioni affini
TransformGroup objRotate=new TransformGroup();
objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
//Crea il behavior per ruotare il cubo
RotazioneCubo rc = new RotazioneCubo(/*cuboGrafico*/);
RotazioneMouse myMouseRotate2= new RotazioneMouse(objRotate,rc);
myMouseRotate2.setSchedulingBounds(new BoundingSphere());
root.addChild(myMouseRotate2);
root.addChild(objRotate);
root.compile();
addBranchGraph(root);
public class Cubo extends TransformGroup{
private Box box;
private static TextureLoader loader=new TextureLoader("red.jpg",null);
private static TextureLoader loader2=new TextureLoader("green.jpg",null);
public Cubo(float x, float y, float z){
super();
//System.out.println("CREA CUBO");
Transform3D transform = new Transform3D();
Vector3f vector = new Vector3f(x,y,z);
transform.setTranslation(vector);
setTransform(transform);
Appearance a = new Appearance();
a.setTexture(loader.getTexture());
TextureAttributes texAttr = new TextureAttributes();
texAttr.setTextureMode(TextureAttributes.MODULATE);
a.setTextureAttributes(texAttr);
/* Material mat = new Material();
mat.setDiffuseColor(new Color3f(1.0f, 0.0f, 0.0f));
//mat.setSpecularColor(new Color3f(1.0f, 0.0f, 0.0f));
mat.setShininess(1.0f);
a.setMaterial(mat);*/
box = new Box(0.1f, 0.1f, 0.1f, Box.GENERATE_TEXTURE_COORDS, a);
box.setAppearance(a);
addChild(box);
}
Qui disegno tutti i cubi e se inserisco il codice per la rotazione qui mi da il problema che invece di far ruotare il sistema "centralmente" ruota attorno all'ultimo cubo inserito
class GruppoCubo extends TransformGroup{
//Memorizza puntatori alle matrici che contengono i cubi
private Vector<Cubo[][]> facce = null;
private int numCubiRiga = 0;
public GruppoCubo(int n, float x, float y, float z){
numCubiRiga = n;
Cubo[][] faccia = null;
float indiceZ = 0.0f; float indiceY = 0.0f; float indiceX = 0.0f;
int i = 0; int j = 0; //mi servono per calcolare gli indici dove salvare i cubi
while(indiceZ > (-n*0.23f)){
//System.out.println("indiceZ, n = " + (-n*0.1f) + " "+indiceZ);
i = 0; j = 0;
faccia = new Cubo[n][n];
while(indiceY > (-n*0.23f)){
//System.out.println("indiceY, n = "+ (-n*0.1f)+ " " + indiceY);
while(indiceX < (n*0.23f)){
//System.out.println("indiceX, n= " + (-n*0.1f)+" " + indiceX);
faccia[i][j] = new Cubo(indiceX, indiceY, indiceZ);
if(indiceX == 0.0f) (faccia[i][j]).coloraCubo(1);
addChild(faccia[i][j]);
indiceX = indiceX + 0.23f;
i += 1;
}
indiceX=0;
i=0; j = j+1;
indiceY = indiceY - 0.23f;
}
indiceY=0;
indiceZ = indiceZ -0.23f;
}
System.out.println("OUT");
Vector3f vector = null;
Transform3D transform = new Transform3D();
transform.setScale(1);
vector = new Vector3f(x,y,z);
transform.setTranslation(vector);
setTransform(transform);
setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
//Crea il behavior per ruotare il cubo
/* RotazioneCubo rc = new RotazioneCubo(/*cuboGrafico*///);
/* RotazioneMouse myMouseRotate2= new RotazioneMouse(this,rc);
myMouseRotate2.setSchedulingBounds(new BoundingSphere());
addChild(myMouseRotate2);*/
}
Questa classe estende simpleUniverse e se lo scrivo qua non ruota proprio nulla!!! Credevo fosse quest'ultima soluzione quella giusta e invece... qualcuno ha qualche idea da darmi? Grazie mille
public class DrawCubo extends SimpleUniverse{
private GruppoCubo cubo;
private BranchGroup root = null;
//Riceve come parametro il num elementi di una riga
public DrawCubo(int n, Canvas3D canvas){
super(canvas);
switch (n){
case 5: cubo = new GruppoCubo(n, 0f, 0.2f, -2f);
break;
case 10: cubo = new GruppoCubo(n, 0f, 0.1f, -10f);
break;
case 15: cubo = new GruppoCubo(n, 0f, -0.1f, -19f);
break;
case 7: cubo = new GruppoCubo(n, 0f, 0.2f, -5f);
break;
case 14: cubo = new GruppoCubo(n, 0f, 0.0f, -17f);
break;
case 21: cubo = new GruppoCubo(n, 0f, -0.2f, -29f);
break;
case 9: cubo = new GruppoCubo(n, 0f, 0.2f, -9f);
break;
case 18: cubo = new GruppoCubo(n, 0f, -0.15f, -24f);
break;
case 27: cubo = new GruppoCubo(n, 0f, -0.3f, -39f);
break;
}
root = new BranchGroup();
root.addChild(cubo);
getViewingPlatform().setNominalViewingTransform();
/*
TextureLoader loader=new TextureLoader("sfondo.jpg",null);
ImageComponent2D image=loader.getImage();
Background bg = new Background(image);
BoundingSphere infinity = new BoundingSphere(new Point3d(), Double.POSITIVE_INFINITY);
bg.setApplicationBounds(infinity);
root.addChild(bg);*/
//Crea un gruppo per le trasformazioni affini
TransformGroup objRotate=new TransformGroup();
objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
//Crea il behavior per ruotare il cubo
RotazioneCubo rc = new RotazioneCubo(/*cuboGrafico*/);
RotazioneMouse myMouseRotate2= new RotazioneMouse(objRotate,rc);
myMouseRotate2.setSchedulingBounds(new BoundingSphere());
root.addChild(myMouseRotate2);
root.addChild(objRotate);
root.compile();
addBranchGraph(root);