/*------------------*/ /* ApCylinder.java */ /*------------------*/ import java.applet.Applet; import java.awt.*; //BorderLayout,GraphicsConfiguration,event import javax.media.j3d.*; //Java3d import com.sun.j3d.utils.applet.MainFrame; //MainFrame import com.sun.j3d.utils.universe.*; //SimpleUniverse import com.sun.j3d.utils.geometry.*; //Primitive import javax.vecmath.*; //Point3f,Color3f public class ApCylinder extends Applet{ private SimpleUniverse simpleU; private BoundingSphere bounds = new BoundingSphere(new Point3d(), 10.0); public void init(){ //アプレットの中央にCanvas3Dを追加 setLayout(new BorderLayout()); Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); add(canvas, BorderLayout.CENTER); //シーングラフの生成 simpleU = new SimpleUniverse(canvas); simpleU.getViewingPlatform().setNominalViewingTransform(); //シーングラフの作成 simpleU.addBranchGraph(createSceneGraph()); } private BranchGroup createSceneGraph(){ BranchGroup branchG0 = new BranchGroup(); //背景色の設定(設定が無い場合は黒) Background background = new Background(new Color3f(1.0f, 1.0f, 1.0f)); background.setApplicationBounds(bounds); branchG0.addChild(background); branchG0.addChild(createDirectionalLight()); //ライトを追加 Transform3D rotationX = new Transform3D(); Transform3D rotationY = new Transform3D(); rotationX.rotX(Math.PI/6); //30度回転 rotationY.rotY(-Math.PI/9); //20度回転 rotationX.mul(rotationY); //合成 TransformGroup transG0 = new TransformGroup(rotationX); branchG0.addChild(transG0); createAxis(transG0); //座標軸の作成 //原点のAppearanceを設定 Appearance ap = new Appearance(); Material ma = new Material(); ma.setDiffuseColor(new Color3f( 0.0f, 1.0f, 1.0f)); ap.setMaterial(ma); //原点に物体を作成 Cylinder cylinder = new Cylinder(0.5f, 1.0f, ap); transG0.addChild(cylinder); branchG0.compile(); return branchG0; } //分かりやすいように座標軸を書く private void createAxis(TransformGroup tg){ Point3f[] vertex = new Point3f[6]; vertex[0] = new Point3f(-1.0f, 0.0f, 0.0f); vertex[1] = new Point3f( 1.0f, 0.0f, 0.0f); vertex[2] = new Point3f( 0.0f,-1.0f, 0.0f); vertex[3] = new Point3f( 0.0f, 1.0f, 0.0f); vertex[4] = new Point3f( 0.0f, 0.0f,-1.0f); vertex[5] = new Point3f( 0.0f, 0.0f, 1.0f); Appearance ap = new Appearance(); ColoringAttributes ca = new ColoringAttributes(); ca.setColor(new Color3f(0.0f, 0.0f, 0.0f)); ap.setColoringAttributes(ca); //2組の点からなる線を引く LineArray LineA = new LineArray(vertex.length, GeometryArray.COORDINATES); LineA.setCoordinates(0, vertex); Shape3D line3D = new Shape3D(LineA, ap); tg.addChild(line3D); //座標名表示位置 Vector3f[] vector = new Vector3f[3]; vector[0] = new Vector3f( 0.8f, 0.0f, 0.0f); vector[1] = new Vector3f( 0.05f, 0.8f, 0.0f); vector[2] = new Vector3f(-0.05f, 0.0f, 0.8f); String[] axis = {"x","y","z"}; Transform3D trans = new Transform3D(); for(int i=0;i<3;i++){ trans.setTranslation(vector[i]); TransformGroup transG = new TransformGroup(trans); Text2D text2d = new Text2D(axis[i], //作成文字 new Color3f(0.0f, 0.0f, 0.0f), //フォント色 "Serif", 30, Font.BOLD); //フォント情報 transG.addChild(text2d); tg.addChild(transG); } } //平行光源を作成する private Light createDirectionalLight(){ DirectionalLight lightD = new DirectionalLight(); //デフォルトの平行光源 lightD.setInfluencingBounds(bounds); //光が影響する範囲 return lightD; } public void destroy(){ simpleU.cleanup(); } public static void main(String[] args){ //Application MainFrame frame = new MainFrame(new ApCylinder(), 256, 256); } }