OSDN Git Service

[TAG]NyARToolkit-2.0.0
[nyartoolkit-and/nyartoolkit-and.git] / tags / 2.0.0 / sample / java3d / jp / nyatla / nyartoolkit / java3d / sample / NyARJava3D.java
1 /* \r
2  * PROJECT: NyARToolkit Java3d sample program.\r
3  * --------------------------------------------------------------------------------\r
4  * The MIT License\r
5  * Copyright (c) 2008 nyatla\r
6  * airmail(at)ebony.plala.or.jp\r
7  * http://nyatla.jp/nyartoolkit/\r
8  * \r
9  * Permission is hereby granted, free of charge, to any person obtaining a copy\r
10  * of this software and associated documentation files (the "Software"), to deal\r
11  * in the Software without restriction, including without limitation the rights\r
12  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
13  * copies of the Software, and to permit persons to whom the Software is\r
14  * furnished to do so, subject to the following conditions:\r
15  * The above copyright notice and this permission notice shall be included in\r
16  * all copies or substantial portions of the Software.\r
17  * \r
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
21  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
23  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
24  * THE SOFTWARE.\r
25  * \r
26  */\r
27 package jp.nyatla.nyartoolkit.java3d.sample;\r
28 \r
29 import java.awt.BorderLayout;\r
30 import javax.media.j3d.*;\r
31 \r
32 import com.sun.j3d.utils.universe.*;\r
33 import java.awt.*;\r
34 import javax.swing.JFrame;\r
35 import javax.vecmath.*;\r
36 \r
37 import jp.nyatla.nyartoolkit.core.*;\r
38 import jp.nyatla.nyartoolkit.java3d.utils.*;\r
39 \r
40 import com.sun.j3d.utils.geometry.ColorCube;\r
41 \r
42 /**\r
43  * Java3Dサンプルプログラム\r
44  * 単一マーカー追跡用のBehaviorを使って、背景と1個のマーカーに連動した\r
45  * TransformGroupを動かします。\r
46  *\r
47  */\r
48 public class NyARJava3D extends JFrame implements NyARSingleMarkerBehaviorListener\r
49 {\r
50         private final String CARCODE_FILE = "../../Data/patt.hiro";\r
51 \r
52         private final String PARAM_FILE = "../../Data/camera_para.dat";\r
53 \r
54         //NyARToolkit関係\r
55         private NyARSingleMarkerBehaviorHolder nya_behavior;\r
56 \r
57         private J3dNyARParam ar_param;\r
58 \r
59         //universe関係\r
60         private Canvas3D canvas;\r
61 \r
62         private Locale locale;\r
63 \r
64         private VirtualUniverse universe;\r
65 \r
66         public static void main(String[] args)\r
67         {\r
68                 try {\r
69                         NyARJava3D frame = new NyARJava3D();\r
70 \r
71                         frame.setVisible(true);\r
72                         Insets ins = frame.getInsets();\r
73                         frame.setSize(320 + ins.left + ins.right, 240 + ins.top + ins.bottom);\r
74                         frame.startCapture();\r
75                         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r
76                 } catch (Exception e) {\r
77                         e.printStackTrace();\r
78                 }\r
79         }\r
80 \r
81         public void onUpdate(boolean i_is_marker_exist, Transform3D i_transform3d)\r
82         {\r
83                 /*\r
84                  * TODO:Please write your behavior operation code here.\r
85                  * マーカーの姿勢を元に他の3Dオブジェクトを操作するときは、ここに処理を書きます。*/\r
86 \r
87         }\r
88 \r
89         public void startCapture() throws Exception\r
90         {\r
91                 nya_behavior.start();\r
92         }\r
93 \r
94         public NyARJava3D() throws Exception\r
95         {\r
96                 super("Java3D Example NyARToolkit");\r
97 \r
98                 //NyARToolkitの準備\r
99                 NyARCode ar_code = new NyARCode(16, 16);\r
100                 ar_code.loadARPattFromFile(CARCODE_FILE);\r
101                 ar_param = new J3dNyARParam();\r
102                 ar_param.loadARParamFromFile(PARAM_FILE);\r
103                 ar_param.changeScreenSize(320, 240);\r
104 \r
105                 //localeの作成とlocateとviewの設定\r
106                 universe = new VirtualUniverse();\r
107                 locale = new Locale(universe);\r
108                 canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());\r
109                 View view = new View();\r
110                 ViewPlatform viewPlatform = new ViewPlatform();\r
111                 view.attachViewPlatform(viewPlatform);\r
112                 view.addCanvas3D(canvas);\r
113                 view.setPhysicalBody(new PhysicalBody());\r
114                 view.setPhysicalEnvironment(new PhysicalEnvironment());\r
115 \r
116                 //視界の設定(カメラ設定から取得)\r
117                 Transform3D camera_3d = ar_param.getCameraTransform();\r
118                 view.setCompatibilityModeEnable(true);\r
119                 view.setProjectionPolicy(View.PERSPECTIVE_PROJECTION);\r
120                 view.setLeftProjection(camera_3d);\r
121 \r
122                 //視点設定(0,0,0から、Y軸を180度回転してZ+方向を向くようにする。)\r
123                 TransformGroup viewGroup = new TransformGroup();\r
124                 Transform3D viewTransform = new Transform3D();\r
125                 viewTransform.rotY(Math.PI);\r
126                 viewTransform.setTranslation(new Vector3d(0.0, 0.0, 0.0));\r
127                 viewGroup.setTransform(viewTransform);\r
128                 viewGroup.addChild(viewPlatform);\r
129                 BranchGroup viewRoot = new BranchGroup();\r
130                 viewRoot.addChild(viewGroup);\r
131                 locale.addBranchGraph(viewRoot);\r
132 \r
133                 //バックグラウンドの作成\r
134                 Background background = new Background();\r
135                 BoundingSphere bounds = new BoundingSphere();\r
136                 bounds.setRadius(10.0);\r
137                 background.setApplicationBounds(bounds);\r
138                 background.setImageScaleMode(Background.SCALE_FIT_ALL);\r
139                 background.setCapability(Background.ALLOW_IMAGE_WRITE);\r
140                 BranchGroup root = new BranchGroup();\r
141                 root.addChild(background);\r
142 \r
143                 //TransformGroupで囲ったシーングラフの作成\r
144                 TransformGroup transform = new TransformGroup();\r
145                 transform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);\r
146                 transform.addChild(createSceneGraph());\r
147                 root.addChild(transform);\r
148 \r
149                 //NyARToolkitのBehaviorを作る。(マーカーサイズはメートルで指定すること)\r
150                 nya_behavior = new NyARSingleMarkerBehaviorHolder(ar_param, 30f, ar_code, 0.08);\r
151                 //Behaviorに連動するグループをセット\r
152                 nya_behavior.setTransformGroup(transform);\r
153                 nya_behavior.setBackGround(background);\r
154 \r
155                 //出来たbehaviorをセット\r
156                 root.addChild(nya_behavior.getBehavior());\r
157                 nya_behavior.setUpdateListener(this);\r
158 \r
159                 //表示ブランチをLocateにセット\r
160                 locale.addBranchGraph(root);\r
161 \r
162                 //ウインドウの設定\r
163                 setLayout(new BorderLayout());\r
164                 add(canvas, BorderLayout.CENTER);\r
165         }\r
166 \r
167         /**\r
168          * シーングラフを作って、そのノードを返す。\r
169          * このノードは40mmの色つき立方体を表示するシーン。z軸を基準に20mm上に浮かせてる。\r
170          * @return\r
171          */\r
172         private Node createSceneGraph()\r
173         {\r
174                 TransformGroup tg = new TransformGroup();\r
175                 Transform3D mt = new Transform3D();\r
176                 mt.setTranslation(new Vector3d(0.00, 0.0, 20 * 0.001));\r
177                 // 大きさ 40mmの色付き立方体を、Z軸上で20mm動かして配置)\r
178                 tg.setTransform(mt);\r
179                 tg.addChild(new ColorCube(20 * 0.001));\r
180                 return tg;\r
181         }\r
182 }\r