OSDN Git Service

[tag]NyARToolkit/2.5.1
[nyartoolkit-and/nyartoolkit-and.git] / tags / 2.5.1 / sample / sandbox / jp / nyatla / nyartoolkit / sandbox / x2 / JavaSimpleLite_X2.java
diff --git a/tags/2.5.1/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/x2/JavaSimpleLite_X2.java b/tags/2.5.1/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/x2/JavaSimpleLite_X2.java
new file mode 100644 (file)
index 0000000..f023aa6
--- /dev/null
@@ -0,0 +1,253 @@
+/* \r
+ * PROJECT: NyARToolkit JOGL sample program.\r
+ * --------------------------------------------------------------------------------\r
+ * The MIT License\r
+ * Copyright (c) 2008 nyatla\r
+ * airmail(at)ebony.plala.or.jp\r
+ * http://nyatla.jp/nyartoolkit/\r
+ * \r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to deal\r
+ * in the Software without restriction, including without limitation the rights\r
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+ * copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ * \r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+ * THE SOFTWARE.\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.sandbox.x2;\r
+\r
+import java.awt.event.WindowAdapter;\r
+import java.awt.event.WindowEvent;\r
+import java.awt.*;\r
+\r
+import javax.media.Buffer;\r
+\r
+import javax.media.opengl.GL;\r
+import javax.media.opengl.GLAutoDrawable;\r
+import javax.media.opengl.GLEventListener;\r
+import javax.media.opengl.GLCanvas;\r
+\r
+import com.sun.opengl.util.Animator;\r
+\r
+import jp.nyatla.nyartoolkit.core.NyARCode;\r
+import jp.nyatla.nyartoolkit.core.param.*;\r
+import jp.nyatla.nyartoolkit.core.transmat.NyARTransMatResult;\r
+import jp.nyatla.nyartoolkit.jmf.utils.*;\r
+import jp.nyatla.nyartoolkit.jogl.utils.*;\r
+/**\r
+ * simpleLiteと同じようなテストプログラム\r
+ * 出来る限りARToolKitのサンプルと似せて作ってあります。\r
+ * 最も一致する"Hiro"マーカーを一つ選択して、その上に立方体を表示します。\r
+ * \r
+ */\r
+public class JavaSimpleLite_X2 implements GLEventListener, JmfCaptureListener\r
+{\r
+       private final String CARCODE_FILE = "../../Data/patt.hiro";\r
+\r
+       private final String PARAM_FILE = "../../Data/camera_para.dat";\r
+\r
+       private final static int SCREEN_X = 320;\r
+\r
+       private final static int SCREEN_Y = 240;\r
+\r
+       private Animator _animator;\r
+\r
+       private GLNyARRaster_RGB _cap_image;\r
+\r
+       private JmfCaptureDevice _capture;\r
+\r
+       private GL _gl;\r
+\r
+       private NyARGLUtil _glnya;\r
+\r
+       //NyARToolkit関係\r
+       private NyARSingleDetectMarker_X2 _nya;\r
+\r
+       private NyARParam _ar_param;\r
+\r
+       /**\r
+        * 立方体を書く\r
+        *\r
+        */\r
+       void drawCube()\r
+       {\r
+               // Colour cube data.\r
+               int polyList = 0;\r
+               float fSize = 0.5f;//マーカーサイズに対して0.5倍なので、4cmの立方体\r
+               int f, i;\r
+               float[][] cube_vertices = new float[][] { { 1.0f, 1.0f, 1.0f }, { 1.0f, -1.0f, 1.0f }, { -1.0f, -1.0f, 1.0f }, { -1.0f, 1.0f, 1.0f }, { 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
+               float[][] cube_vertex_colors = new float[][] { { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 1.0f }, { 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
+               int cube_num_faces = 6;\r
+               short[][] cube_faces = new short[][] { { 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
+\r
+               if (polyList == 0) {\r
+                       polyList = _gl.glGenLists(1);\r
+                       _gl.glNewList(polyList, GL.GL_COMPILE);\r
+                       _gl.glBegin(GL.GL_QUADS);\r
+                       for (f = 0; f < cube_num_faces; f++)\r
+                               for (i = 0; i < 4; i++) {\r
+                                       _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
+                                       _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
+                               }\r
+                       _gl.glEnd();\r
+                       _gl.glColor3f(0.0f, 0.0f, 0.0f);\r
+                       for (f = 0; f < cube_num_faces; f++) {\r
+                               _gl.glBegin(GL.GL_LINE_LOOP);\r
+                               for (i = 0; i < 4; i++)\r
+                                       _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
+                               _gl.glEnd();\r
+                       }\r
+                       _gl.glEndList();\r
+               }\r
+\r
+               _gl.glPushMatrix(); // Save world coordinate system.\r
+               _gl.glTranslatef(0.0f, 0.0f, 0.5f); // Place base of cube on marker surface.\r
+               _gl.glRotatef(0.0f, 0.0f, 0.0f, 1.0f); // Rotate about z axis.\r
+               _gl.glDisable(GL.GL_LIGHTING); // Just use colours.\r
+               _gl.glCallList(polyList); // Draw the cube.\r
+               _gl.glPopMatrix(); // Restore world coordinate system.\r
+\r
+       }\r
+\r
+       public JavaSimpleLite_X2()\r
+       {\r
+               NyMath.initialize();\r
+               Frame frame = new Frame("Java simpleLite with NyARToolkit");\r
+\r
+               // 3Dを描画するコンポーネント\r
+               GLCanvas canvas = new GLCanvas();\r
+               frame.add(canvas);\r
+               canvas.addGLEventListener(this);\r
+               frame.addWindowListener(new WindowAdapter() {\r
+                       public void windowClosing(WindowEvent e)\r
+                       {\r
+                               System.exit(0);\r
+                       }\r
+               });\r
+\r
+               frame.setVisible(true);\r
+               Insets ins = frame.getInsets();\r
+               frame.setSize(SCREEN_X + ins.left + ins.right, SCREEN_Y + ins.top + ins.bottom);\r
+               canvas.setBounds(ins.left, ins.top, SCREEN_X, SCREEN_Y);\r
+       }\r
+\r
+       public void init(GLAutoDrawable drawable)\r
+       {\r
+               _gl = drawable.getGL();\r
+               _gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);\r
+               //NyARToolkitの準備\r
+               try {\r
+                       //キャプチャの準備\r
+                       JmfCaptureDeviceList list=new JmfCaptureDeviceList();\r
+                       _capture=list.getDevice(0);\r
+                       _capture.setCaptureFormat(SCREEN_X, SCREEN_Y, 15f);\r
+                       _capture.setOnCapture(this);\r
+                       //NyARToolkitの準備\r
+                       _ar_param = new NyARParam();\r
+                       NyARCode ar_code = new NyARCode(16, 16);\r
+                       _ar_param.loadARParamFromFile(PARAM_FILE);\r
+                       _ar_param.changeScreenSize(SCREEN_X, SCREEN_Y);\r
+                       ar_code.loadARPattFromFile(CARCODE_FILE);\r
+                       //NyARToolkit用の支援クラス\r
+                       _glnya = new NyARGLUtil(_gl);\r
+                       //GL対応のRGBラスタオブジェクト\r
+                       _cap_image = new GLNyARRaster_RGB(_ar_param,_capture.getCaptureFormat());\r
+                       _nya = new NyARSingleDetectMarker_X2(_ar_param, ar_code, 80.0,this._cap_image.getBufferType());\r
+                       _nya.setContinueMode(false);//ここをtrueにすると、transMatContinueモード(History計算)になります。\r
+                       //キャプチャ開始\r
+                       _capture.start();\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+               //カメラパラメータの計算\r
+               _glnya.toCameraFrustumRH(_ar_param,_camera_projection);\r
+               _animator = new Animator(drawable);\r
+\r
+               _animator.start();\r
+\r
+       }\r
+\r
+       public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)\r
+       {\r
+               _gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);\r
+               _gl.glViewport(0, 0, width, height);\r
+\r
+               //視体積の設定\r
+               _gl.glMatrixMode(GL.GL_PROJECTION);\r
+               _gl.glLoadIdentity();\r
+               //見る位置\r
+               _gl.glMatrixMode(GL.GL_MODELVIEW);\r
+               _gl.glLoadIdentity();\r
+       }\r
+       private double[] _camera_projection=new double[16];\r
+       private NyARTransMatResult __display_transmat_result=new NyARTransMatResult();\r
+       private double[] __display_wk=new double[16];\r
+       public void display(GLAutoDrawable drawable)\r
+       {\r
+               NyARTransMatResult transmat_result=__display_transmat_result;\r
+               try {\r
+                       if (!_cap_image.hasBuffer()) {\r
+                               return;\r
+                       }\r
+                       _gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.          \r
+                       //画像チェックしてマーカー探して、背景を書く\r
+                       boolean is_marker_exist;\r
+                       synchronized (_cap_image) {\r
+                               is_marker_exist = _nya.detectMarkerLite(_cap_image, 110);\r
+                               //背景を書く\r
+                               _glnya.drawBackGround(_cap_image, 1.0);\r
+                       }\r
+                       //マーカーがあれば、立方体を描画\r
+                       if (is_marker_exist) {\r
+                               //マーカーの一致度を調査するならば、ここでnya.getConfidence()で一致度を調べて下さい。\r
+                               // Projection transformation.\r
+                               _gl.glMatrixMode(GL.GL_PROJECTION);\r
+                               _gl.glLoadMatrixd(_camera_projection, 0);\r
+                               _gl.glMatrixMode(GL.GL_MODELVIEW);\r
+                               // Viewing transformation.\r
+                               _gl.glLoadIdentity();\r
+                               //変換行列を取得\r
+                               _nya.getTransmationMatrix(transmat_result);\r
+                               //変換行列をOpenGL形式に変換\r
+                               _glnya.toCameraViewRH(transmat_result, __display_wk);\r
+                               _gl.glLoadMatrixd(__display_wk, 0);\r
+\r
+                               // All other lighting and geometry goes here.\r
+                               drawCube();\r
+                       }\r
+                       Thread.sleep(1);//タスク実行権限を一旦渡す\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+\r
+       }\r
+       public void onUpdateBuffer(Buffer i_buffer)\r
+       {\r
+               try {\r
+                       synchronized (_cap_image) {\r
+                               _cap_image.setBuffer(i_buffer);\r
+                       }\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+       }\r
+\r
+       public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged)\r
+       {\r
+       }\r
+\r
+       public static void main(String[] args)\r
+       {\r
+               new JavaSimpleLite_X2();\r
+       }\r
+}\r