2 * simpleLiteの複数マーカー同時認識バージョン
\r
3 * "Hiro"のマーカーと"人"のマーカーの混在環境で、Hiroのマーカー全てに
\r
5 * (c)2008 A虎@nyatla.jp
\r
6 * airmail(at)ebony.plala.or.jp
\r
9 package jp.nyatla.nyartoolkit.jogl.sample;
\r
11 import java.awt.event.WindowAdapter;
\r
12 import java.awt.event.WindowEvent;
\r
15 import javax.media.Buffer;
\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
22 import com.sun.opengl.util.Animator;
\r
24 import jp.nyatla.nyartoolkit.core.NyARCode;
\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
31 public class JavaSimpleLite2 implements GLEventListener,JmfCaptureListener
\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
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
42 private JmfCameraCapture capture;
\r
44 private NyARGLUtil glnya;
\r
48 private GLNyARDetectMarker nya;
\r
49 private GLNyARParam ar_param;
\r
56 // Colour cube data.
\r
58 float fSize = 0.5f;//マーカーサイズに対して0.5倍なので、4cmのナタデココ
\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
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
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
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
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
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
104 public JavaSimpleLite2()
\r
106 Frame frame = new Frame("Java simpleLite with NyARToolkit");
\r
110 GLCanvas canvas = new GLCanvas();
\r
112 canvas.addGLEventListener(this);
\r
113 frame.addWindowListener(new WindowAdapter() {
\r
114 public void windowClosing(WindowEvent e) {
\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
125 public void init(GLAutoDrawable drawable) {
\r
126 gl = drawable.getGL();
\r
127 gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
\r
131 capture=new JmfCameraCapture(SCREEN_X,SCREEN_Y,15f,JmfCameraCapture.PIXEL_FORMAT_RGB);
\r
132 capture.setCaptureListener(this);
\r
134 ar_param=new GLNyARParam();
\r
135 ar_param.loadFromARFile(PARAM_FILE);
\r
136 ar_param.changeSize(SCREEN_X,SCREEN_Y);
\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
153 }catch(Exception e){
\r
154 e.printStackTrace();
\r
156 animator = new Animator(drawable);
\r
162 public void reshape(GLAutoDrawable drawable,
\r
164 int width, int height)
\r
166 gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
\r
167 gl.glViewport(0, 0, width, height);
\r
170 gl.glMatrixMode(GL.GL_PROJECTION);
\r
171 gl.glLoadIdentity();
\r
173 gl.glMatrixMode(GL.GL_MODELVIEW);
\r
174 gl.glLoadIdentity();
\r
177 public void display(GLAutoDrawable drawable)
\r
181 if(!cap_image.hasData()){
\r
184 gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.
\r
185 //画像チェックしてマーカー探して、背景を書く
\r
187 synchronized(cap_image){
\r
188 found_markers=nya.detectMarkerLite(cap_image,110);
\r
190 glnya.drawBackGround(cap_image, 1.0);
\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
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
210 // All other lighting and geometry goes here.
\r
213 Thread.sleep(1);//タスク実行権限を一旦渡す
\r
214 }catch(Exception e){
\r
215 e.printStackTrace();
\r
218 public void onUpdateBuffer(Buffer i_buffer)
\r
221 synchronized(cap_image){
\r
222 cap_image.setBuffer(i_buffer, true);
\r
224 }catch(Exception e){
\r
225 e.printStackTrace();
\r
229 public void displayChanged(GLAutoDrawable drawable,
\r
230 boolean modeChanged,
\r
231 boolean deviceChanged) {}
\r
233 public static void main(String[] args) {
\r
234 new JavaSimpleLite2();
\r