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
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) ;
}
}
Classe ausiliarla usata per creare sfere (chiamata appunto Sfera)
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 ;
}
}
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 ?
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