2 * simpleLiteと同じようなテストプログラム
\r
3 * マーカーの一致度の最低値をチェックするところを抜いたので、同じマーカーを大量に
\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 JavaSimpleLite implements GLEventListener,JmfCaptureListener
\r
33 private final String CARCODE_FILE ="../../Data/patt.hiro";
\r
34 private final String PARAM_FILE ="../../Data/camera_para.dat";
\r
36 private final static int SCREEN_X=320;
\r
37 private final static int SCREEN_Y=240;
\r
38 private Animator animator;
\r
39 private GLNyARRaster_RGB cap_image;
\r
41 private JmfCameraCapture capture;
\r
43 private NyARGLUtil glnya;
\r
47 private GLNyARSingleDetectMarker nya;
\r
48 private GLNyARParam ar_param;
\r
55 // Colour cube data.
\r
57 float fSize = 0.5f;//マーカーサイズに対して0.5倍なので、4cmのナタデココ
\r
59 float[][] cube_vertices=new float[][]{
\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 {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 float[][] cube_vertex_colors=new float[][]{
\r
64 {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
65 {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 int cube_num_faces = 6;
\r
68 short[][] cube_faces =new short[][]{
\r
69 {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
73 polyList = gl.glGenLists (1);
\r
74 gl.glNewList(polyList, GL.GL_COMPILE);
\r
75 gl.glBegin(GL.GL_QUADS);
\r
76 for (f = 0; f < cube_num_faces; f++)
\r
77 for (i = 0; i < 4; i++) {
\r
78 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
79 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
82 gl.glColor3f(0.0f, 0.0f, 0.0f);
\r
83 for (f = 0; f < cube_num_faces; f++) {
\r
84 gl.glBegin (GL.GL_LINE_LOOP);
\r
85 for (i = 0; i < 4; i++)
\r
86 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
92 gl.glPushMatrix(); // Save world coordinate system.
\r
93 gl.glTranslatef(0.0f, 0.0f, 0.5f); // Place base of cube on marker surface.
\r
94 gl.glRotatef(0.0f, 0.0f, 0.0f, 1.0f); // Rotate about z axis.
\r
95 gl.glDisable(GL.GL_LIGHTING); // Just use colours.
\r
96 gl.glCallList(polyList); // Draw the cube.
\r
97 gl.glPopMatrix(); // Restore world coordinate system.
\r
103 public JavaSimpleLite()
\r
105 Frame frame = new Frame("Java simpleLite with NyARToolkit");
\r
109 GLCanvas canvas = new GLCanvas();
\r
111 canvas.addGLEventListener(this);
\r
112 frame.addWindowListener(new WindowAdapter() {
\r
113 public void windowClosing(WindowEvent e) {
\r
118 frame.setVisible(true);
\r
119 Insets ins=frame.getInsets();
\r
120 frame.setSize(SCREEN_X+ins.left+ins.right,SCREEN_Y+ins.top+ins.bottom);
\r
121 canvas.setBounds(ins.left,ins.top,SCREEN_X,SCREEN_Y);
\r
124 public void init(GLAutoDrawable drawable) {
\r
125 gl = drawable.getGL();
\r
126 gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
\r
130 capture=new JmfCameraCapture(SCREEN_X,SCREEN_Y,15f,JmfCameraCapture.PIXEL_FORMAT_RGB);
\r
131 capture.setCaptureListener(this);
\r
133 ar_param=new GLNyARParam();
\r
134 NyARCode ar_code =new NyARCode(16,16);
\r
135 ar_param.loadFromARFile(PARAM_FILE);
\r
136 ar_param.changeSize(SCREEN_X,SCREEN_Y);
\r
137 nya=new GLNyARSingleDetectMarker(ar_param,ar_code,80.0);
\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
145 }catch(Exception e){
\r
146 e.printStackTrace();
\r
148 animator = new Animator(drawable);
\r
154 public void reshape(GLAutoDrawable drawable,
\r
156 int width, int height)
\r
158 gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
\r
159 gl.glViewport(0, 0, width, height);
\r
162 gl.glMatrixMode(GL.GL_PROJECTION);
\r
163 gl.glLoadIdentity();
\r
165 gl.glMatrixMode(GL.GL_MODELVIEW);
\r
166 gl.glLoadIdentity();
\r
169 public void display(GLAutoDrawable drawable)
\r
173 if(!cap_image.hasData()){
\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,100);
\r
182 glnya.drawBackGround(cap_image, 1.0);
\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
196 // All other lighting and geometry goes here.
\r
199 }catch(Exception e){
\r
200 e.printStackTrace();
\r
203 public void onUpdateBuffer(Buffer i_buffer)
\r
206 synchronized(cap_image){
\r
207 cap_image.setBuffer(i_buffer, true);
\r
209 }catch(Exception e){
\r
210 e.printStackTrace();
\r
214 public void displayChanged(GLAutoDrawable drawable,
\r
215 boolean modeChanged,
\r
216 boolean deviceChanged) {}
\r
218 public static void main(String[] args) {
\r
219 new JavaSimpleLite();
\r