2 * simpleLiteと同じようなテストプログラム
\r
3 * マーカーの一致度の最低値をチェックするところを抜いたので、同じマーカーを大量に
\r
6 * airmail(at)ebony.plala.or.jp
\r
9 import java.awt.event.WindowAdapter;
\r
10 import java.awt.event.WindowEvent;
\r
13 import javax.media.Buffer;
\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
20 import com.sun.opengl.util.Animator;
\r
22 import jp.nyatla.nyartoolkit.core.NyARCode;
\r
24 import jp.nyatla.nyartoolkit.jmf.JmfCameraCapture;
\r
25 import jp.nyatla.nyartoolkit.jmf.JmfCaptureListener;
\r
26 import jp.nyatla.nyartoolkit.gutil.*;
\r
29 public class JavaSimpleLite implements GLEventListener,JmfCaptureListener
\r
31 private final String CARCODE_FILE ="../../Data/patt.hiro";
\r
32 private final String PARAM_FILE ="../../Data/camera_para.dat";
\r
35 private Animator animator;
\r
36 private GLNyARRaster_RGB cap_image;
\r
38 private JmfCameraCapture capture;
\r
41 private GLNyARSingleDetectMarker nya;
\r
42 private GLNyARParam ar_param;
\r
49 // Colour cube data.
\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
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
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
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
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
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
97 public JavaSimpleLite()
\r
99 Frame frame = new Frame("Java simpleLite with NyARToolkit");
\r
103 GLCanvas canvas = new GLCanvas();
\r
105 canvas.addGLEventListener(this);
\r
106 frame.addWindowListener(new WindowAdapter() {
\r
107 public void windowClosing(WindowEvent e) {
\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
118 public void init(GLAutoDrawable drawable) {
\r
119 gl = drawable.getGL();
\r
120 gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
\r
124 capture=new JmfCameraCapture(320,240,15f,JmfCameraCapture.PIXCEL_FORMAT_RGB);
\r
125 capture.setCaptureListener(this);
\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
137 }catch(Exception e){
\r
138 e.printStackTrace();
\r
140 animator = new Animator(drawable);
\r
146 public void reshape(GLAutoDrawable drawable,
\r
148 int width, int height)
\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
155 gl.glMatrixMode(GL.GL_PROJECTION);
\r
156 gl.glLoadIdentity();
\r
157 gl.glFrustum(-1.0f, 1.0f, -ratio, ratio,
\r
160 gl.glMatrixMode(GL.GL_MODELVIEW);
\r
161 gl.glLoadIdentity();
\r
162 gl.glTranslatef(0.0f, 0.0f, -10.0f);
\r
165 public void display(GLAutoDrawable drawable)
\r
169 gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.
\r
173 Buffer b=capture.readBuffer();
\r
174 //BufferToImage b2i=new BufferToImage((VideoFormat)b.getFormat());
\r
175 if(b.getData()==null){
\r
180 //画像チェックしてマーカー探して、背景を書く
\r
181 boolean is_marker_exist;
\r
182 synchronized(cap_image){
\r
183 is_marker_exist=nya.detectMarkerLite(cap_image,100);
\r
185 cap_image.glDispImage(1.0);
\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
198 // All other lighting and geometry goes here.
\r
201 }catch(Exception e){
\r
202 e.printStackTrace();
\r
205 public void onUpdateBuffer(Buffer i_buffer)
\r
208 synchronized(cap_image){
\r
209 cap_image.setRawData((byte[])i_buffer.getData(), true);
\r
211 }catch(Exception e){
\r
212 e.printStackTrace();
\r
216 public void displayChanged(GLAutoDrawable drawable,
\r
217 boolean modeChanged,
\r
218 boolean deviceChanged) {}
\r
220 public static void main(String[] args) {
\r
221 new JavaSimpleLite();
\r