OSDN Git Service

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