OSDN Git Service

[リリース]NyARToolkit 0.5
[nyartoolkit-and/nyartoolkit-and.git] / sample / jogl / JavaSimpleLite.java
1 /**\r
2  * simpleLiteと同じようなテストプログラム\r
3  * マーカーの一致度の最低値をチェックするところを抜いたので、同じマーカーを大量に\r
4  * 検出すると面白いことになります。\r
5  * (c)2008 R.iizuka\r
6  * airmail(at)ebony.plala.or.jp\r
7  * http://nyatla.jp/\r
8  */\r
9 import java.awt.event.WindowAdapter;\r
10 import java.awt.event.WindowEvent;\r
11 import java.awt.*;\r
12 \r
13 import javax.media.Buffer;\r
14 \r
15 import javax.media.opengl.GL;\r
16 import javax.media.opengl.GLAutoDrawable;\r
17 import javax.media.opengl.GLEventListener;\r
18 import javax.media.opengl.GLCanvas;\r
19 \r
20 import com.sun.opengl.util.Animator;\r
21 \r
22 import jp.nyatla.nyartoolkit.core.NyARCode;\r
23 \r
24 import jp.nyatla.nyartoolkit.jmf.JmfCameraCapture;\r
25 import jp.nyatla.nyartoolkit.jmf.JmfCaptureListener;\r
26 import jp.nyatla.nyartoolkit.gutil.*;\r
27 \r
28 \r
29 public class JavaSimpleLite implements GLEventListener,JmfCaptureListener\r
30 {\r
31     private final String CARCODE_FILE ="../../Data/patt.hiro";\r
32     private final String PARAM_FILE   ="../../Data/camera_para.dat";\r
33        \r
34     \r
35     private Animator animator;\r
36     private GLNyARRaster_RGB cap_image;\r
37     \r
38     private JmfCameraCapture capture;\r
39     private GL gl;\r
40     //NyARToolkit関係\r
41     private GLNyARSingleDetectMarker nya;\r
42     private GLNyARParam ar_param;\r
43     /**\r
44      * 立方体を書く\r
45      *\r
46      */\r
47     void drawCube()\r
48     {\r
49         // Colour cube data.\r
50         int polyList = 0;\r
51         float fSize = 0.5f;\r
52         int f, i;       \r
53         float[][] cube_vertices=new float[][]{\r
54                 {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
55                 {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
56         };\r
57         float[][] cube_vertex_colors=new float[][]{\r
58         {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
59         {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
60         };\r
61         int cube_num_faces = 6;\r
62         short[][] cube_faces =new short[][]{\r
63         {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
64         };\r
65         \r
66         if (polyList==0) {\r
67             polyList = gl.glGenLists (1);\r
68             gl.glNewList(polyList, GL.GL_COMPILE);\r
69             gl.glBegin(GL.GL_QUADS);\r
70             for (f = 0; f < cube_num_faces; f++)\r
71                 for (i = 0; i < 4; i++) {\r
72                     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
73                     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
74                 }\r
75             gl.glEnd();\r
76             gl.glColor3f(0.0f, 0.0f, 0.0f);\r
77             for (f = 0; f < cube_num_faces; f++) {\r
78                 gl.glBegin (GL.GL_LINE_LOOP);\r
79                 for (i = 0; i < 4; i++)\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                 gl.glEnd ();\r
82             }\r
83             gl.glEndList ();\r
84         }\r
85         \r
86         gl.glPushMatrix(); // Save world coordinate system.\r
87         gl.glTranslatef(0.0f, 0.0f, 0.5f); // Place base of cube on marker surface.\r
88         gl.glRotatef(0.0f, 0.0f, 0.0f, 1.0f); // Rotate about z axis.\r
89         gl.glDisable(GL.GL_LIGHTING);   // Just use colours.\r
90         gl.glCallList(polyList);        // Draw the cube.\r
91         gl.glPopMatrix();       // Restore world coordinate system.\r
92         \r
93     }\r
94     \r
95     \r
96     \r
97     public JavaSimpleLite()\r
98     {\r
99         Frame frame = new Frame("Java simpleLite with NyARToolkit");\r
100 \r
101 \r
102         // 3Dを描画するコンポーネント\r
103         GLCanvas canvas = new GLCanvas();\r
104         frame.add(canvas);\r
105         canvas.addGLEventListener(this);\r
106         frame.addWindowListener(new WindowAdapter() {\r
107                 public void windowClosing(WindowEvent e) {\r
108                     System.exit(0);\r
109                 }\r
110             });\r
111 \r
112         frame.setVisible(true);\r
113         Insets ins=frame.getInsets();\r
114         frame.setSize(320+ins.left+ins.right,240+ins.top+ins.bottom);\r
115         canvas.setBounds(ins.left,ins.top,320,240);\r
116     }\r
117 \r
118     public void init(GLAutoDrawable drawable) {\r
119         gl = drawable.getGL();\r
120         gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);\r
121         //NyARToolkitの準備\r
122         try{\r
123             //キャプチャの準備\r
124             capture=new JmfCameraCapture(320,240,30f,JmfCameraCapture.PIXCEL_FORMAT_RGB);\r
125             capture.setCaptureListener(this);\r
126             capture.start();\r
127             //NyARToolkitの準備\r
128             ar_param=new GLNyARParam();\r
129             NyARCode ar_code  =new NyARCode(16,16);\r
130             ar_param.loadFromARFile(PARAM_FILE);\r
131             ar_param.changeSize(320,240);\r
132             nya=new GLNyARSingleDetectMarker(ar_param,ar_code,80.0);\r
133             ar_code.LoadFromARFile(CARCODE_FILE);\r
134             //GL対応のRGBラスタオブジェクト\r
135             cap_image=new GLNyARRaster_RGB(gl,ar_param,320,240);\r
136 \r
137        }catch(Exception e){\r
138             e.printStackTrace();\r
139         }\r
140         animator = new Animator(drawable);\r
141 \r
142         animator.start();\r
143 \r
144     }\r
145 \r
146     public void reshape(GLAutoDrawable drawable,\r
147         int x, int y,\r
148         int width, int height)\r
149     {\r
150         float ratio = (float)height / (float)width;\r
151         gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);\r
152         gl.glViewport(0, 0,  width, height);\r
153 \r
154         //視体積の設定\r
155         gl.glMatrixMode(GL.GL_PROJECTION);\r
156         gl.glLoadIdentity();\r
157         gl.glFrustum(-1.0f, 1.0f, -ratio, ratio,\r
158                      5.0f, 40.0f);\r
159         //見る位置\r
160         gl.glMatrixMode(GL.GL_MODELVIEW);\r
161         gl.glLoadIdentity();\r
162         gl.glTranslatef(0.0f, 0.0f, -10.0f);\r
163     }\r
164 \r
165     public void display(GLAutoDrawable drawable)\r
166     {\r
167         \r
168         try{\r
169             gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.\r
170           \r
171     \r
172             //キャプチャしたイメージを加工\r
173             Buffer b=capture.readBuffer();\r
174             //BufferToImage b2i=new BufferToImage((VideoFormat)b.getFormat());\r
175             if(b.getData()==null){\r
176                 return;\r
177             }else{\r
178                 //画像準備OK\r
179             }\r
180             //画像チェックしてマーカー探して、背景を書く\r
181             boolean is_marker_exist;\r
182             synchronized(cap_image){\r
183                 is_marker_exist=nya.detectMarkerLite(cap_image,100);\r
184                 //背景を書く\r
185                 cap_image.glDispImage(1.0);\r
186             }\r
187             //あったら立方体を書く\r
188             if(is_marker_exist){\r
189                 // Projection transformation.\r
190                 gl.glMatrixMode(GL.GL_PROJECTION);\r
191                 gl.glLoadMatrixd(ar_param.getCameraFrustumRH(),0);\r
192                 gl.glMatrixMode(GL.GL_MODELVIEW);\r
193                 // Viewing transformation.\r
194                 gl.glLoadIdentity();\r
195                 gl.glLoadMatrixd(nya.getCameraViewRH(),0);\r
196 \r
197             \r
198                 // All other lighting and geometry goes here.\r
199                 drawCube();\r
200             }\r
201         }catch(Exception e){\r
202             e.printStackTrace();\r
203         }\r
204     }\r
205     public void onUpdateBuffer(Buffer i_buffer)\r
206     {\r
207         try{\r
208             synchronized(cap_image){\r
209                 cap_image.setRawData((byte[])i_buffer.getData(), true);\r
210             }\r
211         }catch(Exception e){\r
212             e.printStackTrace();\r
213         }        \r
214     }\r
215 \r
216     public void displayChanged(GLAutoDrawable drawable,\r
217                                boolean modeChanged,\r
218                                boolean deviceChanged) {}\r
219 \r
220     public static void main(String[] args) {\r
221         new JavaSimpleLite();\r
222     }\r
223 }\r
224 \r