package examples;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.MouseBehavior;
import com.sun.j3d.utils.behaviors.vp.*;
import com.sun.j3d.utils.image.*;
import javax.swing.JFrame;
public class TextureExample extends JFrame
{
//Der Canvas, auf den gezeichnet wird.
public Canvas3D myCanvas3D;
public TextureExample()
{
//Mechanismus zum Schliessen des Fensters und beenden des Programms
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Standardeinstellung fuer das Betrachteruniversum
myCanvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
//Aufbau des SimpleUniverse:
//Zuerst Erzeugen zusammen mit dem Canvas
SimpleUniverse simpUniv = new SimpleUniverse(myCanvas3D);
//Standardpositionierung des Betrachters
simpUniv.getViewingPlatform().setNominalViewingTransform();
//Die Szene wird in dieser Methode erzeugt.
createSceneGraph(simpUniv);
//Hinzufuegen von Licht
addLight(simpUniv);
//Hierdurch kann man mit der Maus den Betrachterstandpunkt veraendern
OrbitBehavior ob = new OrbitBehavior(myCanvas3D);
ob.setSchedulingBounds(new BoundingSphere(new Point3d(0.0,0.0,0.0),Double.MAX_VALUE));
simpUniv.getViewingPlatform().setViewPlatformBehavior(ob);
//Darstellung des Canvas/Fensters:
setTitle("Textur auf Sphere");
setSize(1000,1000);
getContentPane().add("Center", myCanvas3D);
setVisible(true);
}
public static void main(String[] args)
{
TextureExample texam = new TextureExample();
}
//In dieser Methode werden die Objekte der Szene aufgebaut und dem
//SimpleUniverse su hinzugefuegt.
public void createSceneGraph(SimpleUniverse su)
{
//Laden der Textur
Texture textureLoad = new TextureLoader("C:/Workspace/SphereSim/bin/examples/myPicture.gif",null).getTexture();
textureLoad.setBoundaryModeT(Texture.WRAP);
//textureLoad.setBoundaryModeS(Texture.CLAMP_TO_EDGE);
//Erzeugung eines skalierten Bildes aus der Textur. Hoehe und Breite
//muessen Zweierpotenzen sein.
//ImageComponent2D textureIm = textureLoad.getScaledImage(64,512);
//Erzeugung der Textur
//Texture2D aTexture = new Texture2D(Texture2D.BASE_LEVEL,Texture2D.RGB,
// textureIm.getWidth(),
// textureIm.getHeight());
//aTexture.setImage(0,textureIm);
//Eine Appearance, die die Textur verwendet.
Appearance textureApp = new Appearance();
textureApp.setTexture(textureLoad);
TextureAttributes textureAttr = new TextureAttributes();
textureAttr.setTextureMode(TextureAttributes.REPLACE); // MODULATE, DECAL, BLEND, REPLACE, or COMBINE
textureApp.setTextureAttributes(textureAttr);
Material mat = new Material();
mat.setShininess(40.0f);
textureApp.setMaterial(mat);
TexCoordGeneration tcg = new TexCoordGeneration(TexCoordGeneration.OBJECT_LINEAR,
TexCoordGeneration.TEXTURE_COORDINATE_2);
textureApp.setTexCoordGeneration(tcg);
//Ein Objekt (Kugel), das die Appearance, d.h. die Texture verwendet.
Sphere tSphere = new Sphere(1.0f, Sphere.GENERATE_NORMALS |
Sphere.GENERATE_NORMALS_INWARD |
Sphere.GENERATE_TEXTURE_COORDS |
Sphere.GENERATE_TEXTURE_COORDS_Y_UP, 45,textureApp);
//stolen from http://www.java.net/node/689498
PolygonAttributes pa = new PolygonAttributes( PolygonAttributes.POLYGON_FILL,
PolygonAttributes.CULL_FRONT, 0.01f );
pa.setCullFace(PolygonAttributes.CULL_NONE);
pa.setBackFaceNormalFlip(true);
Color3f c = new Color3f(new Color3f( 0.0f, 0.0f, 0.8f ));
Material m = new Material(c, c, c, c, 64.0f);
textureApp.setPolygonAttributes(pa);
//Die TRansformationsgruppe fuer die Kugel
Transform3D t3d = new Transform3D();
t3d.setScale(1.0f);
//t3d.
TransformGroup tgSphere = new TransformGroup(t3d);
tgSphere.addChild(tSphere);
//Fuege alles zur Szene hinzu.
BranchGroup theScene = new BranchGroup();
theScene.addChild(tgSphere);
theScene.compile();
//Hinzufuegen der Szene
su.addBranchGraph(theScene);
}
//Hier wird etwas Licht zu der Szene hinzugefuegt.
public void addLight(SimpleUniverse su)
{
BranchGroup bgLight = new BranchGroup();
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), Double.MAX_VALUE);
Color3f lightColour1 = new Color3f(1.0f,1.0f,1.0f);
Vector3f lightDir1 = new Vector3f(0.2f,-0.1f,-1.0f);
DirectionalLight light1 = new DirectionalLight(lightColour1, lightDir1);
light1.setInfluencingBounds(bounds);
bgLight.addChild(light1);
su.addBranchGraph(bgLight);
}
}