A példaprogramok nagy része ugyanarra a sémára épül, nevezetesen a színtér-gráf felépítésére. Mivel ezt minden esetben el kell végezni, a példaprogramok első látásra nagynak tűnnek. A programok a CD-ről is futtathatók.
Egy 3 dimezniós kockát fogunk megjeleníteni egy Canvas3D vásznon. Egy
minimális színtér-gráfot fogunk felépíteni. A színes kockát külön
osztályként definiáljuk.
import java.awt.*; import javax.vecmath.*; import javax.media.j3d.*; // ezek minden példaprogramhoz kellenek VirtualUniverse universe = new VirtualUniverse(); locale = new Locale(universe); // a Locale így kapcsolódik az Univerzumhoz View view = new View(); view.addCanvas3D(c); view.setPhysicalBody(body); view.setPhysicalEnvironment(environment); view.attachViewPlatform(viewPlatform); // A View mezőit fel kell paraméterezniA teljes program: HelloUniverse.java |
Pontokat rajzol a vászonra.
PointArray points= new PointArray(8, PointArray.COORDINATES| PointArray.COLOR_3); points.setCoordinates(0,verts); points.setColors(0,colors); shape = new Shape3D(points, new Appearance());A teljes program: PointArrayDemo.java |
Több vonal rajzolása a képernyőre.
LineArray lines = new LineArray(8, LineArray.COORDINATES | LineArray.COLOR_3); lines.setCoordinates(0, verts); lines.setColors(0, colors); shape = new Shape3D(lines, new Appearance());A teljes program: LineArrayDemo.java |
Többszörös törtvonalat razjol a képernyőre.
LineStripArray lines = new LineStripArray(8, LineStripArray.COORDINATES| LineStripArray.COLOR_3,stripVertex); lines.setCoordinates(0, verts); lines.setColors(0, colors); shape = new Shape3D(lines, new Appearance());A teljes program: LineStripArrayDemo.java |
Háromszögeket razjolunk a képernyőre.
TriangleArray triangle = new TriangleArray(12, TriangleArray.COORDINATES | TriangleArray.COLOR_3 ); triangle.setCoordinates(0, verts); triangle.setColors(0, colors); shape = new Shape3D(triangle, new Appearance());A teljes program: TriangleArrayDemo.java |
Legyezőt razjolunk a képernyőre.
TriangleFanArray triangle = new TriangleFanArray(10, TriangleFanArray.COORDINATES | TriangleFanArray.COLOR_3,strips ); triangle.setCoordinates(0, verts); triangle.setColors(0, colors); PolygonAttributes polygonAttributes = new PolygonAttributes(); polygonAttributes.setPolygonMode(PolygonAttributes.POLYGON_LINE); Appearance appearance = new Appearance(); appearance.setPolygonAttributes(polygonAttributes); shape = new Shape3D(triangle, appearance);A teljes program: TriangleFanArrayDemo.java |
Egymáshoz kapcsolódó háromszögalakzatot rajzol a képernyőre.
TriangleStripArray triangle = new TriangleStripArray(9, TriangleStripArray.COORDINATES | TriangleStripArray.COLOR_3,strips ); triangle.setCoordinates(0, verts); triangle.setColors(0, colors); PolygonAttributes polygonAttributes = new PolygonAttributes(); polygonAttributes.setPolygonMode(PolygonAttributes.POLYGON_LINE); Appearance appearance = new Appearance(); appearance.setPolygonAttributes(polygonAttributes); shape = new Shape3D(triangle, appearance);A teljes program: TriangleStripArrayDemo.java |
Négyszögeket tudunk rajzoltatni a képernyőre. A négyszögnek
síkbelinek és konvexnel kell lennie.
QuadArray quads = new QuadArray(8, QuadArray.COORDINATES | QuadArray.COLOR_3); quads.setCoordinates(0, verts); quads.setColors(0, colors); shape = new Shape3D(quads, new Appearance());A teljes program: TriangleStripArrayDemo.java |
Egy 2 dimenziós Font-tal és egy Shape kihúzási alakakkal
egy 3 dimenziós betütípust készítünk. Ezzel és egy sztringgel
létrehozunk egy Text3D objektumot.
Font3D font3d = new Font3D(new Font("TestFont", Font.PLAIN, 1), new FontExtrusion()); Text3D text3D = new Text3D(font3d, new String("TEXT3D"),new Point3f(0.0f, -1.0f, 0.0f),Text3D.ALIGN_CENTER,Text3D.PATH_DOWN); Shape3D shape3D = new Shape3D(text3D);A teljes program: Text3DDemo.java |
A test anyagának, színének változtatása mellett, átlátszóságot
állítunk az Appearance osztály TransparencyAttributes
komponensének segítségével.
TransparencyAttributes transparency3 = new TransparencyAttributes(); transparency3.setTransparency(0.6f); transparency3.setTransparencyMode(TransparencyAttributes.BLENDED); appearance3.setTransparencyAttributes(transparency3);A teljes program: AppearanceDemo.java |
Trasnform3D transzformációkat TransformGroup csomópontokba
kell ágyaznunk. Ezt aztán a színtér-gráf megfelelő helyére be
kell szúrnunk.
Transform3D t = new Transform3D(); Transform3D t2 = new Transform3D(); t2.setEuler( new Vector3d(-35.0*(Math.PI/180.0),45.0*(Math.PI/180.0),0.0)); t.set(4,new Vector3d(6.0,5.0,6.0)); t.mul(t,t2); TransformGroup viewPlatformTransformGroup = new TransformGroup(t);A teljes program: TransformDemo.java |
A textúrázandó képet egy BufferedImage-be kell beolvasni, majd ezt lehet
egy Texture2D struktúrának átadni. Fontos megjegyeznünk, hogy a textúrakép
szélessége és magassága 2 valamilyen egész kitevős hatványával egyezen meg.
Toolkit toolkit = Toolkit.getDefaultToolkit(); Image image = toolkit.getImage(fname); BufferedImage bImage = new BufferedImage(w, h, format1); int[] intPixels =((DataBufferInt)bImage.getRaster().getDataBuffer()).getData(); PixelGrabber pg = new PixelGrabber(image, 0, 0, w, h, intPixels, 0, w); try { pg.grabPixels(); } catch (InterruptedException e) {;} imageComponent2D = new ImageComponent2D(format2, bImage); imageComponent2D.setCapability(ImageComponent.ALLOW_SIZE_READ); imageComponent2D.setCapability(ImageComponent.ALLOW_FORMAT_READ); imageComponent2D.setCapability(ImageComponent.ALLOW_IMAGE_READ); ... Texture2D texture2D = new Texture2D(Texture.BASE_LEVEL,Texture.RGB,width,height); texture2D.setCapability(Texture.ALLOW_BOUNDARY_MODE_READ); texture2D.setImage(0,myImage.getImageComponent2D()); appearance.setTexture(texture2D);A teljes program: TextureDemo.java |
A Group csomópont származtatott osztályai közul itt a Switch
osztály alkalmazására mutatunk példát.
Switch sw = new Switch(); BitSet mask = new BitSet(3); mask.set( 0 ); // 0. és 2. elem lesz bekapcsolva mask.set( 2 ); sw.setWhichChild( Switch.CHILD_MASK ); sw.setChildMask( mask );A teljes program: SwitchDemo.java |
Egy ImageComponent2D-be kell betölteni a kirajzolandó képet.
Raster raster1 = new Raster(new Point3f(1.0f,1.0f,-1.0f), Raster.RASTER_COLOR, 0, 0,width1,height1, myImage1.getImageComponent2D(), null);A teljes program: RasterDemo.java |
A Behavior csomópont initialize() és processStimulus metódusait
kell átírnunk.
class RotateBehavior extends Behavior { public void initialize() { WakeupCriterion[] mouseEvents = new WakeupCriterion[2]; mouseEvents[0] = new WakeupOnAWTEvent(MouseEvent.MOUSE_DRAGGED); mouseEvents[1] = new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED); mouseCriterion = new WakeupOr(mouseEvents); wakeupOn (mouseCriterion); } public void processStimulus (Enumeration criteria) { ... wakeupOn(mouseCriterion); } }A teljes program: BehaviorDemo.java |
Interpolátor definiálásához egy Alpha objektumot kell készítenünk. Nem
szabad elfelejtenünk az Interpolator-nak egy megfelelően nagy
ütemezési tartományt adni.
Transform3D yAxis = new Transform3D(); Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 4000, 0, 0, 0, 0, 0); RotationInterpolator rotationInterpolator = new RotationInterpolator (rotationAlpha, transformGroup, yAxis, 0.0f, (float) Math.PI*2.0f); rotationInterpolator.setSchedulingBounds(bounds);A teljes program: InterpolatorDemo.java |
Példánkban az egérrel fogunk kijelölni egy testet a színtérben.
int x = ((MouseEvent)event[i]).getX(); int y = ((MouseEvent)event[i]).getY(); PickRay pickRay = generatePickRay(x,y); SceneGraphPath sceneGraphPath = branchGroup.pickAny(pickRay); Shape3D actualShape3D = (Shape3D)sceneGraphPath.getObject();A teljes program: PickingDemo.java |
Példaprogramban ambiens, irányított és pontszerű fényforrásokat
definiáltunk. Nézzük hogy kell felparaméterezni egy irányított fényforrást.
redDirectional.setEnable( redDirectionalOn ); redDirectional.setColor( new Color3f( 1.0f, 0.0f, 0.0f ) ); redDirectional.setDirection( new Vector3f( 1.0f, -0.5f, -0.5f ) ); redDirectional.setCapability( AmbientLight.ALLOW_STATE_WRITE ); redDirectional.setInfluencingBounds( bounds );A teljes program: LightingDemo.java |
Egy képet teszünk a háttérbe. A képet egy ImageComponent2D-be kell
betölteni és így kell átadni a Background csomópontnak.
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); Background background = new Background(myImage.getImageComponent2D()); background.setApplicationBounds(bounds);A teljes program: BackgroundDemo.java |
Meg kell adnunk a köd színét és paraméterét. Egy megfelelően nagy
hatástartományt is meg kell adni, ahol a köd el fog helyezkedni a
színtérben.
ExponentialFog exponentialFog = new ExponentialFog(fogColor3f,12.0f); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 1000.0); exponentialFog.setInfluencingBounds(bounds); branchGroup.addChild(exponentialFog);A teljes program: FogDemo.java |