OSDN Git Service

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