/*--------------*/ /* Ja74.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 com.sun.j3d.utils.behaviors.mouse.*; //Mouse import com.sun.j3d.utils.image.TextureLoader; //TextureLoader import javax.vecmath.*; //Point3f,Color3f import java.awt.event.*; //Checkbox public class Ja74 extends Applet implements ItemListener{ private SimpleUniverse simpleU; private BoundingSphere bounds = new BoundingSphere(new Point3d(), 10.0); TextureAttributes texAttrib; //ラジオボタン------- CheckboxGroup radio; Checkbox radio1, radio2, radio3, radio4; 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()); //GUIの作成 createGUI(); } public BranchGroup createSceneGraph() { BranchGroup branchG0 = new BranchGroup(); //背景色の設定(設定が無い場合は黒) Background background = new Background(new Color3f(0.3f, 0.3f, 0.3f)); background.setApplicationBounds(bounds); branchG0.addChild(background); //マウス操作用のノード TransformGroup transG0 = new TransformGroup(); branchG0.addChild(transG0); //Appearanceを作成 Appearance ap = new Appearance(); ColoringAttributes ca = new ColoringAttributes(); ca.setColor(new Color3f( 0.0f, 0.0f, 1.0f)); ap.setColoringAttributes(ca); //テクスチャ java.net.URL texFile = null; try{ texFile = new java.net.URL(getCodeBase().toString() + "diamond32.gif"); }catch(java.net.MalformedURLException ex){ System.out.println(ex.getMessage()); } TextureLoader loader = new TextureLoader(texFile, this); ap.setTexture(loader.getTexture()); //テクスチャ属性 texAttrib = new TextureAttributes(); texAttrib.setTextureMode(TextureAttributes.REPLACE); //REPLACE texAttrib.setTextureBlendColor(1.0f, 1.0f, 0.0f, 1.0f); //BLEND色(黄) ap.setTextureAttributes(texAttrib); //四角形ポリゴンの頂点座標・テクスチャ座標設定 Point3f[] vertex = new Point3f[4]; vertex[0] = new Point3f( 0.7f, 0.7f, 0.0f); vertex[1] = new Point3f( -0.7f, 0.7f, 0.0f); vertex[2] = new Point3f( -0.7f, -0.7f, 0.0f); vertex[3] = new Point3f( 0.7f, -0.7f, 0.0f); TexCoord2f[] texCoord = new TexCoord2f[4]; texCoord[0] = new TexCoord2f( 5.0f, 5.0f); texCoord[1] = new TexCoord2f( 0.0f, 5.0f); texCoord[2] = new TexCoord2f( 0.0f, 0.0f); texCoord[3] = new TexCoord2f( 5.0f, 0.0f); //四角形ポリゴンの生成 QuadArray quadA = new QuadArray(vertex.length, GeometryArray.COORDINATES | GeometryArray.TEXTURE_COORDINATE_2); quadA.setCoordinates(0, vertex); quadA.setTextureCoordinates(0, 0, texCoord); Shape3D quad3D = new Shape3D(quadA, ap); transG0.addChild(quad3D); //Capability設定 texAttrib.setCapability(TextureAttributes.ALLOW_MODE_WRITE); //マウスによる物体移動 transG0.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); transG0.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); MouseZoom mouseZoom = new MouseZoom(transG0); mouseZoom.setSchedulingBounds(bounds); transG0.addChild(mouseZoom); branchG0.compile(); return branchG0; } //GUIの作成 private void createGUI(){ radio = new CheckboxGroup(); radio1 = new Checkbox("REPLACE", true, radio); radio2 = new Checkbox("MODULATE", false, radio); radio3 = new Checkbox("DECAL", false, radio); radio4 = new Checkbox("BLEND", false, radio); Panel panel = new Panel(); panel.add(radio1); panel.add(radio2); panel.add(radio3); panel.add(radio4); radio1.addItemListener(this); radio2.addItemListener(this); radio3.addItemListener(this); radio4.addItemListener(this); add(panel, BorderLayout.SOUTH); } //ラジオボタンイベント処理 public void itemStateChanged(ItemEvent e){ if(e.getItemSelectable()==radio1){ texAttrib.setTextureMode(TextureAttributes.REPLACE); }else if(e.getItemSelectable()==radio2){ texAttrib.setTextureMode(TextureAttributes.MODULATE); }else if(e.getItemSelectable()==radio3){ texAttrib.setTextureMode(TextureAttributes.DECAL); }else if(e.getItemSelectable()==radio4){ texAttrib.setTextureMode(TextureAttributes.BLEND); } } public void destroy(){ simpleU.cleanup(); } public static void main(String[] args){ //Application MainFrame frame = new MainFrame(new Ja74(), 512, 512); } }