2 * simpleLiteと同じようなテストプログラム
\r
3 * 最も一致する"Hiro"マーカーを一つ選択して、その上に立方体を表示します。
\r
4 * (c)2008 A虎@nyatla.jp
\r
5 * airmail(at)ebony.plala.or.jp
\r
8 package jp.nyatla.nyartoolkit.jogl.sample;
\r
10 import java.awt.event.WindowAdapter;
\r
11 import java.awt.event.WindowEvent;
\r
14 import javax.media.Buffer;
\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
21 import com.sun.opengl.util.Animator;
\r
23 import jp.nyatla.nyartoolkit.core.NyARCode;
\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
30 public class JavaSimpleLite implements GLEventListener,JmfCaptureListener
\r
32 private final String CARCODE_FILE ="../../Data/patt.hiro";
\r
33 private final String PARAM_FILE ="../../Data/camera_para.dat";
\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
40 private JmfCameraCapture capture;
\r
42 private NyARGLUtil glnya;
\r
46 private GLNyARSingleDetectMarker nya;
\r
47 private GLNyARParam ar_param;
\r
54 // Colour cube data.
\r
56 float fSize = 0.5f;//マーカーサイズに対して0.5倍なので、4cmのナタデココ
\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
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
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
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
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
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
102 public JavaSimpleLite()
\r
104 Frame frame = new Frame("Java simpleLite with NyARToolkit");
\r
108 GLCanvas canvas = new GLCanvas();
\r
110 canvas.addGLEventListener(this);
\r
111 frame.addWindowListener(new WindowAdapter() {
\r
112 public void windowClosing(WindowEvent e) {
\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
123 public void init(GLAutoDrawable drawable) {
\r
124 gl = drawable.getGL();
\r
125 gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
\r
129 capture=new JmfCameraCapture(SCREEN_X,SCREEN_Y,15f,JmfCameraCapture.PIXEL_FORMAT_RGB);
\r
130 capture.setCaptureListener(this);
\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
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,110);
\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 Thread.sleep(1);//タスク実行権限を一旦渡す
\r
200 }catch(Exception e){
\r
201 e.printStackTrace();
\r
205 public void onUpdateBuffer(Buffer i_buffer)
\r
208 synchronized(cap_image){
\r
209 cap_image.setBuffer(i_buffer, 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