OSDN Git Service

[更新]NyARToolkit/nyatlaブランチ
[nyartoolkit-and/nyartoolkit-and.git] / sample / jogl / jp / nyatla / nyartoolkit / jogl / sample / JavaSimpleLite.java
1 /* \r
2  * PROJECT: NyARToolkit JOGL 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.jogl.sample;\r
28 \r
29 import java.awt.event.WindowAdapter;\r
30 import java.awt.event.WindowEvent;\r
31 import java.awt.*;\r
32 \r
33 import javax.media.Buffer;\r
34 \r
35 import javax.media.opengl.GL;\r
36 import javax.media.opengl.GLAutoDrawable;\r
37 import javax.media.opengl.GLEventListener;\r
38 import javax.media.opengl.GLCanvas;\r
39 \r
40 import com.sun.opengl.util.Animator;\r
41 \r
42 import jp.nyatla.nyartoolkit.core.NyARCode;\r
43 \r
44 import jp.nyatla.nyartoolkit.jmf.utils.JmfCameraCapture;\r
45 import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureListener;\r
46 import jp.nyatla.nyartoolkit.jogl.utils.*;\r
47 /**\r
48  * simpleLiteと同じようなテストプログラム\r
49  * 出来る限りARToolKitのサンプルと似せて作ってあります。\r
50  * 最も一致する"Hiro"マーカーを一つ選択して、その上に立方体を表示します。\r
51  * \r
52  */\r
53 public class JavaSimpleLite implements GLEventListener, JmfCaptureListener\r
54 {\r
55         private final String CARCODE_FILE = "../../Data/patt.hiro";\r
56 \r
57         private final String PARAM_FILE = "../../Data/camera_para.dat";\r
58 \r
59         private final static int SCREEN_X = 320;\r
60 \r
61         private final static int SCREEN_Y = 240;\r
62 \r
63         private Animator _animator;\r
64 \r
65         private GLNyARRaster_RGB _cap_image;\r
66 \r
67         private JmfCameraCapture _capture;\r
68 \r
69         private GL _gl;\r
70 \r
71         private NyARGLUtil _glnya;\r
72 \r
73         //NyARToolkit関係\r
74         private GLNyARSingleDetectMarker _nya;\r
75 \r
76         private GLNyARParam _ar_param;\r
77 \r
78         /**\r
79          * 立方体を書く\r
80          *\r
81          */\r
82         void drawCube()\r
83         {\r
84                 // Colour cube data.\r
85                 int polyList = 0;\r
86                 float fSize = 0.5f;//マーカーサイズに対して0.5倍なので、4cmの立方体\r
87                 int f, i;\r
88                 float[][] cube_vertices = new float[][] { { 1.0f, 1.0f, 1.0f }, { 1.0f, -1.0f, 1.0f }, { -1.0f, -1.0f, 1.0f }, { -1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, -1.0f }, { 1.0f, -1.0f, -1.0f }, { -1.0f, -1.0f, -1.0f }, { -1.0f, 1.0f, -1.0f } };\r
89                 float[][] cube_vertex_colors = new float[][] { { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 1.0f }, { 1.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } };\r
90                 int cube_num_faces = 6;\r
91                 short[][] cube_faces = new short[][] { { 3, 2, 1, 0 }, { 2, 3, 7, 6 }, { 0, 1, 5, 4 }, { 3, 0, 4, 7 }, { 1, 2, 6, 5 }, { 4, 5, 6, 7 } };\r
92 \r
93                 if (polyList == 0) {\r
94                         polyList = _gl.glGenLists(1);\r
95                         _gl.glNewList(polyList, GL.GL_COMPILE);\r
96                         _gl.glBegin(GL.GL_QUADS);\r
97                         for (f = 0; f < cube_num_faces; f++)\r
98                                 for (i = 0; i < 4; i++) {\r
99                                         _gl.glColor3f(cube_vertex_colors[cube_faces[f][i]][0], cube_vertex_colors[cube_faces[f][i]][1], cube_vertex_colors[cube_faces[f][i]][2]);\r
100                                         _gl.glVertex3f(cube_vertices[cube_faces[f][i]][0] * fSize, cube_vertices[cube_faces[f][i]][1] * fSize, cube_vertices[cube_faces[f][i]][2] * fSize);\r
101                                 }\r
102                         _gl.glEnd();\r
103                         _gl.glColor3f(0.0f, 0.0f, 0.0f);\r
104                         for (f = 0; f < cube_num_faces; f++) {\r
105                                 _gl.glBegin(GL.GL_LINE_LOOP);\r
106                                 for (i = 0; i < 4; i++)\r
107                                         _gl.glVertex3f(cube_vertices[cube_faces[f][i]][0] * fSize, cube_vertices[cube_faces[f][i]][1] * fSize, cube_vertices[cube_faces[f][i]][2] * fSize);\r
108                                 _gl.glEnd();\r
109                         }\r
110                         _gl.glEndList();\r
111                 }\r
112 \r
113                 _gl.glPushMatrix(); // Save world coordinate system.\r
114                 _gl.glTranslatef(0.0f, 0.0f, 0.5f); // Place base of cube on marker surface.\r
115                 _gl.glRotatef(0.0f, 0.0f, 0.0f, 1.0f); // Rotate about z axis.\r
116                 _gl.glDisable(GL.GL_LIGHTING); // Just use colours.\r
117                 _gl.glCallList(polyList); // Draw the cube.\r
118                 _gl.glPopMatrix(); // Restore world coordinate system.\r
119 \r
120         }\r
121 \r
122         public JavaSimpleLite()\r
123         {\r
124                 Frame frame = new Frame("Java simpleLite with NyARToolkit");\r
125 \r
126                 // 3Dを描画するコンポーネント\r
127                 GLCanvas canvas = new GLCanvas();\r
128                 frame.add(canvas);\r
129                 canvas.addGLEventListener(this);\r
130                 frame.addWindowListener(new WindowAdapter() {\r
131                         public void windowClosing(WindowEvent e)\r
132                         {\r
133                                 System.exit(0);\r
134                         }\r
135                 });\r
136 \r
137                 frame.setVisible(true);\r
138                 Insets ins = frame.getInsets();\r
139                 frame.setSize(SCREEN_X + ins.left + ins.right, SCREEN_Y + ins.top + ins.bottom);\r
140                 canvas.setBounds(ins.left, ins.top, SCREEN_X, SCREEN_Y);\r
141         }\r
142 \r
143         public void init(GLAutoDrawable drawable)\r
144         {\r
145                 _gl = drawable.getGL();\r
146                 _gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);\r
147                 //NyARToolkitの準備\r
148                 try {\r
149                         //キャプチャの準備\r
150                         _capture = new JmfCameraCapture(SCREEN_X, SCREEN_Y, 15f, JmfCameraCapture.PIXEL_FORMAT_RGB);\r
151                         _capture.setCaptureListener(this);\r
152                         //NyARToolkitの準備\r
153                         _ar_param = new GLNyARParam();\r
154                         NyARCode ar_code = new NyARCode(16, 16);\r
155                         _ar_param.loadARParamFromFile(PARAM_FILE);\r
156                         _ar_param.changeScreenSize(SCREEN_X, SCREEN_Y);\r
157                         _nya = new GLNyARSingleDetectMarker(_ar_param, ar_code, 80.0);\r
158                         _nya.setContinueMode(false);//ここをtrueにすると、transMatContinueモード(History計算)になります。\r
159                         ar_code.loadFromARFile(CARCODE_FILE);\r
160                         //NyARToolkit用の支援クラス\r
161                         _glnya = new NyARGLUtil(_gl);\r
162                         //GL対応のRGBラスタオブジェクト\r
163                         _cap_image = new GLNyARRaster_RGB(_ar_param);\r
164                         //キャプチャ開始\r
165                         _capture.start();\r
166                 } catch (Exception e) {\r
167                         e.printStackTrace();\r
168                 }\r
169                 _animator = new Animator(drawable);\r
170 \r
171                 _animator.start();\r
172 \r
173         }\r
174 \r
175         public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)\r
176         {\r
177                 _gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);\r
178                 _gl.glViewport(0, 0, width, height);\r
179 \r
180                 //視体積の設定\r
181                 _gl.glMatrixMode(GL.GL_PROJECTION);\r
182                 _gl.glLoadIdentity();\r
183                 //見る位置\r
184                 _gl.glMatrixMode(GL.GL_MODELVIEW);\r
185                 _gl.glLoadIdentity();\r
186         }\r
187 \r
188         public void display(GLAutoDrawable drawable)\r
189         {\r
190 \r
191                 try {\r
192                         if (!_cap_image.hasData()) {\r
193                                 return;\r
194                         }\r
195                         _gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.          \r
196                         //画像チェックしてマーカー探して、背景を書く\r
197                         boolean is_marker_exist;\r
198                         synchronized (_cap_image) {\r
199                                 is_marker_exist = _nya.detectMarkerLite(_cap_image, 110);\r
200                                 //背景を書く\r
201                                 _glnya.drawBackGround(_cap_image, 1.0);\r
202                         }\r
203                         //あったら立方体を書く\r
204                         if (is_marker_exist) {\r
205                                 //マーカーの一致度を調査するならば、ここでnya.getConfidence()で一致度を調べて下さい。\r
206                                 // Projection transformation.\r
207                                 _gl.glMatrixMode(GL.GL_PROJECTION);\r
208                                 _gl.glLoadMatrixd(_ar_param.getCameraFrustumRH(), 0);\r
209                                 _gl.glMatrixMode(GL.GL_MODELVIEW);\r
210                                 // Viewing transformation.\r
211                                 _gl.glLoadIdentity();\r
212                                 _gl.glLoadMatrixd(_nya.getCameraViewRH(), 0);\r
213 \r
214                                 // All other lighting and geometry goes here.\r
215                                 drawCube();\r
216                         }\r
217                         Thread.sleep(1);//タスク実行権限を一旦渡す\r
218                 } catch (Exception e) {\r
219                         e.printStackTrace();\r
220                 }\r
221 \r
222         }\r
223         public void onUpdateBuffer(Buffer i_buffer)\r
224         {\r
225                 try {\r
226                         synchronized (_cap_image) {\r
227                                 _cap_image.setBuffer(i_buffer, true);\r
228                         }\r
229                 } catch (Exception e) {\r
230                         e.printStackTrace();\r
231                 }\r
232         }\r
233 \r
234         public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged)\r
235         {\r
236         }\r
237 \r
238         public static void main(String[] args)\r
239         {\r
240                 new JavaSimpleLite();\r
241         }\r
242 }\r