OSDN Git Service

[TAG]1.3.1
[nyartoolkit-and/nyartoolkit-and.git] / tags / 1.3.0 / sample / java3d / jp / nyatla / nyartoolkit / java3d / sample / NyARJava3D.java
1 /**\r
2  * Java3Dサンプルプログラム\r
3  * シングルマーカー追跡用のBehaviorを使って、背景と1個のマーカーに連動したTransformGroup\r
4  * を動かします。\r
5  * (c)2008 A虎@nyatla.jp\r
6  * airmail@ebony.plala.or.jp\r
7  * http://nyatla.jp/\r
8  */\r
9 package jp.nyatla.nyartoolkit.java3d.sample;\r
10 \r
11 import java.awt.BorderLayout;\r
12 import javax.media.j3d.*;\r
13 \r
14 import com.sun.j3d.utils.universe.*;\r
15 import java.awt.*;\r
16 import javax.swing.JFrame;\r
17 import javax.vecmath.*;\r
18 \r
19 import jp.nyatla.nyartoolkit.core.*;\r
20 import jp.nyatla.nyartoolkit.java3d.utils.*;\r
21 \r
22 import com.sun.j3d.utils.geometry.ColorCube;\r
23 \r
24 public class NyARJava3D extends JFrame implements NyARSingleMarkerBehaviorListener \r
25 {\r
26     private final String CARCODE_FILE ="../../Data/patt.hiro";\r
27     private final String PARAM_FILE   ="../../Data/camera_para.dat";\r
28     //NyARToolkit関係\r
29     private NyARSingleMarkerBehaviorHolder nya_behavior;\r
30     private J3dNyARParam ar_param;\r
31     //universe関係\r
32     private Canvas3D canvas;\r
33     private Locale locale;\r
34     private VirtualUniverse universe;\r
35     public static void main(String[] args)\r
36     {\r
37         try{\r
38             NyARJava3D frame = new NyARJava3D();\r
39                 \r
40             frame.setVisible(true);\r
41             Insets ins=frame.getInsets();\r
42             frame.setSize(320+ins.left+ins.right,240+ins.top+ins.bottom);\r
43             frame.startCapture();\r
44             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r
45         }catch(Exception e){\r
46             e.printStackTrace();\r
47         }\r
48     }\r
49     public void onUpdate(boolean i_is_marker_exist,Transform3D i_transform3d)\r
50     {\r
51         /*\r
52          * TODO:Please write your behavior operation code here.\r
53          * マーカーの姿勢を元に他の3Dオブジェクトを操作するときは、ここに処理を書きます。*/\r
54         \r
55     }\r
56     public void startCapture() throws Exception\r
57     {\r
58         nya_behavior.start();           \r
59     }\r
60     public NyARJava3D() throws Exception\r
61     {\r
62         super("Java3D Example NyARToolkit");\r
63 \r
64         //NyARToolkitの準備\r
65         NyARCode ar_code  =new NyARCode(16,16);\r
66         ar_code.loadFromARFile(CARCODE_FILE);\r
67         ar_param=new J3dNyARParam();\r
68         ar_param.loadFromARFile(PARAM_FILE);\r
69         ar_param.changeSize(320,240);\r
70         \r
71         //localeの作成とlocateとviewの設定\r
72         universe = new VirtualUniverse();\r
73         locale = new Locale( universe );\r
74         canvas=new Canvas3D( SimpleUniverse.getPreferredConfiguration());\r
75         View view = new View();\r
76         ViewPlatform viewPlatform = new ViewPlatform();\r
77         view.attachViewPlatform( viewPlatform );\r
78         view.addCanvas3D(canvas);\r
79         view.setPhysicalBody( new PhysicalBody() );\r
80         view.setPhysicalEnvironment( new PhysicalEnvironment());\r
81 \r
82         //視界の設定(カメラ設定から取得)\r
83         Transform3D camera_3d=ar_param.getCameraTransform();\r
84         view.setCompatibilityModeEnable(true);\r
85         view.setProjectionPolicy(View.PERSPECTIVE_PROJECTION);\r
86         view.setLeftProjection(camera_3d);\r
87         \r
88         //視点設定(0,0,0から、Y軸を180度回転してZ+方向を向くようにする。)\r
89         TransformGroup viewGroup = new TransformGroup();\r
90         Transform3D viewTransform = new Transform3D();\r
91         viewTransform.rotY(Math.PI);\r
92         viewTransform.setTranslation(new Vector3d(0.0,0.0,0.0));\r
93         viewGroup.setTransform( viewTransform );\r
94         viewGroup.addChild( viewPlatform );\r
95         BranchGroup viewRoot = new BranchGroup();\r
96         viewRoot.addChild( viewGroup );\r
97         locale.addBranchGraph( viewRoot );\r
98 \r
99         \r
100         //バックグラウンドの作成\r
101         Background background =new Background();\r
102         BoundingSphere bounds = new BoundingSphere();\r
103         bounds.setRadius( 10.0 ); \r
104         background.setApplicationBounds(bounds);\r
105         background.setImageScaleMode(Background.SCALE_FIT_ALL);\r
106         background.setCapability(Background.ALLOW_IMAGE_WRITE);\r
107         BranchGroup root = new BranchGroup();\r
108         root.addChild(background);\r
109         \r
110         //TransformGroupで囲ったシーングラフの作成\r
111         TransformGroup transform=new TransformGroup();\r
112         transform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);\r
113         transform.addChild(createSceneGraph());\r
114         root.addChild(transform);\r
115                 \r
116         //NyARToolkitのBehaviorを作る。(マーカーサイズはメートルで指定すること)\r
117         nya_behavior=new NyARSingleMarkerBehaviorHolder(ar_param,30f,ar_code,0.08);\r
118         //Behaviorに連動するグループをセット\r
119         nya_behavior.setTransformGroup(transform);\r
120         nya_behavior.setBackGround(background);\r
121         \r
122         //出来たbehaviorをセット\r
123         root.addChild(nya_behavior.getBehavior());\r
124         nya_behavior.setUpdateListener(this);\r
125         \r
126         //表示ブランチをLocateにセット\r
127         locale.addBranchGraph(root);\r
128       \r
129         //ウインドウの設定\r
130         setLayout(new BorderLayout());\r
131         add(canvas,BorderLayout.CENTER);\r
132     }\r
133     /**\r
134      * シーングラフを作って、そのノードを返す。\r
135      * このノードは40mmの色つきナタデココを表示するシーン。z軸を基準に20mm上に浮かせてる。\r
136      * @return\r
137      */\r
138     private Node createSceneGraph()\r
139     {\r
140         TransformGroup tg=new TransformGroup();\r
141         Transform3D mt=new Transform3D();\r
142         mt.setTranslation(new Vector3d(0.00,0.0,20*0.001));\r
143         // 大きさ 40mmの色付き立方体を、Z軸上で20mm動かして配置)\r
144         tg.setTransform(mt);\r
145         tg.addChild(new ColorCube(20*0.001));\r
146         return tg;\r
147     }\r
148 }\r