/*------------*/ /* Ja61.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.behaviors.mouse.*; //Mouse import javax.vecmath.*; //Point3f,Color3f public class Ja61 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(0.3f, 0.3f, 0.3f)); background.setApplicationBounds(bounds); branchG0.addChild(background); //光源を追加 branchG0.addChild(createDirectionalLight()); //マウス操作用のノード TransformGroup transG0 = new TransformGroup(); branchG0.addChild(transG0); //四角形ポリゴンのAppearanceを作成 Appearance ap = new Appearance(); PolygonAttributes pa = new PolygonAttributes(); pa.setCullFace(PolygonAttributes.CULL_NONE); //裏面も表示する pa.setBackFaceNormalFlip(true); //裏面にも法線設定 ap.setPolygonAttributes(pa); ColoringAttributes ca = new ColoringAttributes(); ca.setColor(new Color3f( 0.0f, 0.0f, 1.0f)); //青色 ap.setColoringAttributes(ca); Material ma = new Material(); //Materialを作成 ap.setMaterial(ma); //デフォルト白色 //四角形ポリゴンの頂点座標設定 Point3f[] vertex = new Point3f[4]; vertex[0] = new Point3f( 0.5f, 0.5f, 0.0f); vertex[1] = new Point3f(-0.5f, 0.5f, 0.0f); vertex[2] = new Point3f(-0.5f, -0.5f, 0.0f); vertex[3] = new Point3f( 0.5f, -0.5f, 0.0f); QuadArray quadA = new QuadArray(vertex.length, GeometryArray.COORDINATES | GeometryArray.NORMALS); //法線情報追加 quadA.setCoordinates(0, vertex); Vector3f normal = new Vector3f(0.0f, 0.0f, 1.0f); //頂点の法線を設定する normal.normalize(); //規格化 for(int i=0; i<4; i++){ //各頂点に法線を設定する quadA.setNormal(i, normal); } Shape3D quad3D = new Shape3D(quadA, ap); transG0.addChild(quad3D); //参考の為に法線を書く transG0.addChild(drawNormal(new Point3f(0.0f, 0.0f, 0.0f), normal)); //マウスによる物体移動 transG0.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); transG0.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); MouseRotate mouseRot = new MouseRotate(transG0); mouseRot.setSchedulingBounds(bounds); transG0.addChild(mouseRot); branchG0.compile(); return branchG0; } //平行光源を作成する private Light createDirectionalLight(){ DirectionalLight lightD = new DirectionalLight(); //デフォルトの平行光源 lightD.setInfluencingBounds(bounds); //光が影響する範囲 return lightD; } //法線を作成する private Shape3D drawNormal(Point3f point1, Vector3f vec){ Point3f point2 = new Point3f(point1); Point3f[] vertex = new Point3f[2]; Color3f[] color = new Color3f[2]; vec.scale(0.5f); point2.add(vec); vertex[0] = point1; vertex[1] = point2; color[0] = new Color3f( 1.0f, 1.0f, 0.0f); color[1] = new Color3f( 1.0f, 1.0f, 0.0f); LineArray lineA = new LineArray(vertex.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3); lineA.setCoordinates(0, vertex); lineA.setColors(0, color); Shape3D line3D = new Shape3D(lineA); return line3D; } public void destroy(){ simpleU.cleanup(); } public static void main(String[] args){ //Application MainFrame frame = new MainFrame(new Ja61(), 512, 512); } }