Come da titolo mi son dedicato a spaciugare un pò con le java 3D api per capirne meglio il funzionamento.
Per ora ho fatto riferimento a questa guida http://www.redbaron85.com/corso-guida-java3d?start=30 e alla documentazione
Java 3D 1.4.0.
Come prova ho voluto prendere un esempio e modificarlo un pò , in particolare ho trovato quest'esempio che mi è piaciuto
http://www.redksr.com/~talos/JAVA/JA...l%20Java3D.pdf
(il link punta ad un tutorial al cui interno è presente il codice)
e l'ho modificato di modo che visualizzasse una texture come sfondo con una singola sfera al centro.
(Chiarisco che mi ha intrigato proprio quell'esempio perchè mostra come disegnare delle sfere e muovercisi intorno , settando opportunamente le luci , ed io volevo realizzare un modello del sistema solare)
Per i miei scopi ho costruito una classe (non del tutto completa , dato che manca la parte che regola le luci ... ma a quello ci penso dopo) per disegnare sfere in modo più semplice (raggruppa la calsse Sphere , Transform3D , texture , apparence e a breve anche la gestione delle luci (di modo da avere delle sfere adatte al mio obbiettivo e di facile costruzione)
Questo è il mio codice :
Classe principale con l'universo
Classe ausiliarla usata per creare sfere (chiamata appunto Sfera)codice:import java.applet.Applet ; import com.sun.j3d.utils.universe.* ; import com.sun.j3d.utils.applet.MainFrame ; import javax.media.j3d.* ; import javax.vecmath.* ; import java.awt.* ; import com.sun.j3d.utils.behaviors.keyboard.KeyNavigatorBehavior ; public class Naviga extends Applet { /** * */ private static final long serialVersionUID = 1L; // crea l’universo public void init() { setLayout(new BorderLayout()) ; GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration() ; canvas = new Canvas3D(config) ; group = new BranchGroup() ; group.addChild(luce()) ; group.addChild(luce2()) ; Sfera mioSfondo = new Sfera(0.0f,0.0f,0.0f,1000,100, "C:\\m45.jpg") ; mioSfondo.setTextured(true) ; mioSfondo.setNormalOriented(false) ; group.addChild( mioSfondo.getSfera(TextureAttributes.MODULATE) ) ; universe = new SimpleUniverse(canvas) ; add("Center",canvas) ; universe.getViewingPlatform().setNominalViewingTransform() ; TransformGroup all = universe.getViewingPlatform().getViewPlatformTransform() ; // abilita lo spostamento della telecamera (cioé di tutta la scena...) KeyNavigatorBehavior keyNav = new KeyNavigatorBehavior(all) ; keyNav.setSchedulingBounds(new BoundingSphere(new Point3d(),1000.0)) ; group.addChild(keyNav) ; group.compile() ; universe.addBranchGraph(group) ; } // aggiunge la luce all’ambiente public DirectionalLight luce() { Color3f colore = new Color3f(.1f,.6f,.6f) ; // la fonte di luce illumina per 200 metri dall’origine BoundingSphere raggio = new BoundingSphere(new Point3d(.0,.0,.0),1000.0) ; Vector3f direzione = new Vector3f(-1.0f,-2.5f,-5.0f) ; DirectionalLight nuovaLuce = new DirectionalLight(colore,direzione) ; nuovaLuce.setInfluencingBounds(raggio) ; return nuovaLuce ; } // aggiunge la luce all’ambiente public DirectionalLight luce2() { Color3f colore = new Color3f(1.0f,.0f,.0f) ; // la fonte di luce illumina per 200 metri dall’origine BoundingSphere raggio = new BoundingSphere(new Point3d(.0,.0,.0),1000.0) ; Vector3f direzione = new Vector3f(3.0f,-2.5f,-3.0f) ; DirectionalLight nuovaLuce = new DirectionalLight(colore,direzione) ; nuovaLuce.setInfluencingBounds(raggio) ; return nuovaLuce ; } // attributi private SimpleUniverse universe; private BranchGroup group; private Canvas3D canvas; // main public static void main(String args[]) { new MainFrame(new Naviga(),400,400) ; } }
Ora , al momento mi aspetterei almeno di vedere il mio sfondo nella prima guida che citavo e che uso come riferimento c'è scritto che è possibile usare come sfondo una sfera enorme , con una texture rivolta verso l'interno e che per rivolgere la texture all'interno bisogna usare l'attributo GENERATE_NORMALS_INWARD che è esattamente quello che uso io ... eppure io non vedo assolutamente nulla (solo lo sfondo nero ovunque) ... dunque che cosa stò sbagliando ?codice:import java.applet.Applet ; import javax.media.j3d.* ; import javax.vecmath.* ; import com.sun.j3d.utils.geometry.Sphere ; import com.sun.j3d.utils.image.* ; public class Sfera extends Applet { public final static int LUCE_DIREZIONALE = 0 ; public final static int LUCE_OMNIDIREZIONALE = 1 ; public final static int LUCE_AMBIENTALE = 2 ; public final static int LUCE_CONEIFORME = 4 ; public final static int LUCE_ASSENTE = 5 ; private float x = 0 ; private float y = 0 ; private float z = 0 ; private int r = 10 ; private int sezioni = 4 ; private int luce = LUCE_ASSENTE ; private String nome = "Default_Name" ; private boolean isTextured = false ; private boolean isMaterial = false ; private boolean isNormalOriented = true ; private String texturePath ; private Material materiale = null ; private static final long serialVersionUID = 1L; public float getMyX() { return x; } public void setX(float x) { this.x = x; } public float getMyY() { return y; } public void setY(float y) { this.y = y; } public float getMyZ() { return z; } public void setZ(float z) { this.z = z; } public int getR() { return r; } public void setR(int r) { this.r = r; } public int getSezioni() { return sezioni; } public void setSezioni(int sezioni) { this.sezioni = sezioni; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public boolean isTextured() { return isTextured; } public void setTextured(boolean isTextured) { this.isTextured = isTextured; } public String getTexturePath() { return texturePath; } public void setTexturePath(String texturePath) { this.texturePath = texturePath; } public int getLuce() { return luce; } public void setLuce(int luce) { this.luce = luce; } public Material getMateriale() { return materiale; } public void setMateriale(Material materiale) { this.materiale = materiale; } public boolean isNormalOriented() { return isNormalOriented; } public void setNormalOriented(boolean isNormalOriented) { this.isNormalOriented = isNormalOriented; } public boolean isMaterial() { return isMaterial; } public void setMaterial(boolean isMaterial) { this.isMaterial = isMaterial; } public Sfera ( float _x , float _y , float _z) { x = _x ; y = _y ; z = _z ; } public Sfera ( float _x , float _y , float _z , int _r, int _sezioni) { x = _x ; y = _y ; z = _z ; r = _r ; sezioni = _sezioni ; } public Sfera ( float _x , float _y , float _z , int _r, int _sezioni, String _texturePath) { x = _x ; y = _y ; z = _z ; r = _r ; sezioni = _sezioni ; isTextured = true ; texturePath = _texturePath ; } public Sfera ( float _x , float _y , float _z , int _r, int _sezioni, Material _materiale) { x = _x ; y = _y ; z = _z ; r = _r ; sezioni = _sezioni ; isMaterial = true ; materiale = _materiale ; } public TransformGroup getSfera(int _textureAttr) { Sphere sfera = null ; Appearance apparenza = new Appearance() ; if (isMaterial) { apparenza.setMaterial( materiale ) ; } if (isTextured) { Texture texture = (new TextureLoader( texturePath ,this)).getTexture() ; apparenza.setTexture(texture) ; TextureAttributes tattr = new TextureAttributes() ; tattr.setTextureMode(_textureAttr) ; apparenza.setTextureAttributes(tattr) ; if (isNormalOriented) { sfera = new Sphere( r ,Sphere.GENERATE_TEXTURE_COORDS, sezioni , apparenza) ; sfera.setAppearance(apparenza) ; } else { sfera = new Sphere( r ,Sphere.GENERATE_TEXTURE_COORDS | Sphere.GENERATE_NORMALS_INWARD, sezioni , apparenza) ; sfera.setAppearance(apparenza) ; } } else { sfera = new Sphere( r , sezioni , apparenza) ; sfera.setAppearance( apparenza ) ; } Transform3D transf = new Transform3D() ; TransformGroup tg = new TransformGroup() ; Vector3f posizione = new Vector3f( x , y , z ) ; transf.setTranslation(posizione) ; tg.setTransform(transf) ; tg.addChild(sfera) ; return tg ; } }
Ps :
Io con Java non sono molto pratico , e proprio per questo che mi stò impratichendo , quindi se notate errori concettuali che esulano dal problema specifico non eistate a farmelo presente.
Grazie anticipatamente

Rispondi quotando