OSDN Git Service

[更新]NyARToolkit
[nyartoolkit-and/nyartoolkit-and.git] / 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 static final long serialVersionUID = -8472866262481865377L;\r
51 \r
52         private final String CARCODE_FILE = "../../Data/patt.hiro";\r
53 \r
54         private final String PARAM_FILE = "../../Data/camera_para.dat";\r
55 \r
56         //NyARToolkit関係\r
57         private NyARSingleMarkerBehaviorHolder nya_behavior;\r
58 \r
59         private J3dNyARParam ar_param;\r
60 \r
61         //universe関係\r
62         private Canvas3D canvas;\r
63 \r
64         private Locale locale;\r
65 \r
66         private VirtualUniverse universe;\r
67 \r
68         public static void main(String[] args)\r
69         {\r
70                 try {\r
71                         NyARJava3D frame = new NyARJava3D();\r
72 \r
73                         frame.setVisible(true);\r
74                         Insets ins = frame.getInsets();\r
75                         frame.setSize(320 + ins.left + ins.right, 240 + ins.top + ins.bottom);\r
76                         frame.startCapture();\r
77                         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r
78                 } catch (Exception e) {\r
79                         e.printStackTrace();\r
80                 }\r
81         }\r
82 \r
83         public void onUpdate(boolean i_is_marker_exist, Transform3D i_transform3d)\r
84         {\r
85                 /*\r
86                  * TODO:Please write your behavior operation code here.\r
87                  * マーカーの姿勢を元に他の3Dオブジェクトを操作するときは、ここに処理を書きます。*/\r
88 \r
89         }\r
90 \r
91         public void startCapture() throws Exception\r
92         {\r
93                 nya_behavior.start();\r
94         }\r
95 \r
96         public NyARJava3D() throws Exception\r
97         {\r
98                 super("Java3D Example NyARToolkit");\r
99 \r
100                 //NyARToolkitの準備\r
101                 NyARCode ar_code = new NyARCode(16, 16);\r
102                 ar_code.loadARPattFromFile(CARCODE_FILE);\r
103                 ar_param = new J3dNyARParam();\r
104                 ar_param.loadARParamFromFile(PARAM_FILE);\r
105                 ar_param.changeScreenSize(320, 240);\r
106 \r
107                 //localeの作成とlocateとviewの設定\r
108                 universe = new VirtualUniverse();\r
109                 locale = new Locale(universe);\r
110                 canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());\r
111                 View view = new View();\r
112                 ViewPlatform viewPlatform = new ViewPlatform();\r
113                 view.attachViewPlatform(viewPlatform);\r
114                 view.addCanvas3D(canvas);\r
115                 view.setPhysicalBody(new PhysicalBody());\r
116                 view.setPhysicalEnvironment(new PhysicalEnvironment());\r
117 \r
118                 //視界の設定(カメラ設定から取得)\r
119                 Transform3D camera_3d = ar_param.getCameraTransform();\r
120                 view.setCompatibilityModeEnable(true);\r
121                 view.setProjectionPolicy(View.PERSPECTIVE_PROJECTION);\r
122                 view.setLeftProjection(camera_3d);\r
123 \r
124                 //視点設定(0,0,0から、Y軸を180度回転してZ+方向を向くようにする。)\r
125                 TransformGroup viewGroup = new TransformGroup();\r
126                 Transform3D viewTransform = new Transform3D();\r
127                 viewTransform.rotY(Math.PI);\r
128                 viewTransform.setTranslation(new Vector3d(0.0, 0.0, 0.0));\r
129                 viewGroup.setTransform(viewTransform);\r
130                 viewGroup.addChild(viewPlatform);\r
131                 BranchGroup viewRoot = new BranchGroup();\r
132                 viewRoot.addChild(viewGroup);\r
133                 locale.addBranchGraph(viewRoot);\r
134 \r
135                 //バックグラウンドの作成\r
136                 Background background = new Background();\r
137                 BoundingSphere bounds = new BoundingSphere();\r
138                 bounds.setRadius(10.0);\r
139                 background.setApplicationBounds(bounds);\r
140                 background.setImageScaleMode(Background.SCALE_FIT_ALL);\r
141                 background.setCapability(Background.ALLOW_IMAGE_WRITE);\r
142                 BranchGroup root = new BranchGroup();\r
143                 root.addChild(background);\r
144 \r
145                 //TransformGroupで囲ったシーングラフの作成\r
146                 TransformGroup transform = new TransformGroup();\r
147                 transform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);\r
148                 transform.addChild(createSceneGraph());\r
149                 root.addChild(transform);\r
150 \r
151                 //NyARToolkitのBehaviorを作る。(マーカーサイズはメートルで指定すること)\r
152                 nya_behavior = new NyARSingleMarkerBehaviorHolder(ar_param, 30f, ar_code, 0.08);\r
153                 //Behaviorに連動するグループをセット\r
154                 nya_behavior.setTransformGroup(transform);\r
155                 nya_behavior.setBackGround(background);\r
156 \r
157                 //出来たbehaviorをセット\r
158                 root.addChild(nya_behavior.getBehavior());\r
159                 nya_behavior.setUpdateListener(this);\r
160 \r
161                 //表示ブランチをLocateにセット\r
162                 locale.addBranchGraph(root);\r
163 \r
164                 //ウインドウの設定\r
165                 setLayout(new BorderLayout());\r
166                 add(canvas, BorderLayout.CENTER);\r
167         }\r
168 \r
169         /**\r
170          * シーングラフを作って、そのノードを返す。\r
171          * このノードは40mmの色つき立方体を表示するシーン。z軸を基準に20mm上に浮かせてる。\r
172          * @return\r
173          */\r
174         private Node createSceneGraph()\r
175         {\r
176                 TransformGroup tg = new TransformGroup();\r
177                 Transform3D mt = new Transform3D();\r
178                 mt.setTranslation(new Vector3d(0.00, 0.0, 20 * 0.001));\r
179                 // 大きさ 40mmの色付き立方体を、Z軸上で20mm動かして配置)\r
180                 tg.setTransform(mt);\r
181                 tg.addChild(new ColorCube(20 * 0.001));\r
182                 return tg;\r
183         }\r
184 }\r