ARToolkit Java class library NyARToolkit.\r
Copyright (C)2008 R.Iizuka\r
\r
-version Alpha 0.7.20080406.0\r
+version Alpha 0.8.20080412.0\r
\r
http://nyatla.jp/\r
airmail(at)ebony.plala.or.jp\r
\r
\r
\r
-・基本構成\r
+・構成\r
\r
-+-----------------------------+\r
-| Application |\r
-+-------+-------+-------------+\r
-|NyARJMF| NyARJogl| |\r
-+-------+---------+ |\r
-| JMF | JOGL |NyARToolkit|\r
-+-------+---------+ |\r
-|Camera | 3D | |\r
-------------------------------+\r
++-------------------------------------------+\r
+| Application |\r
++-------+---------+-------+-----------------+\r
+|NyARJMF| NyARJogl|NyARJ3d| |\r
++-------+---------+-------+ |\r
+| JMF | JOGL |Java3D |Java3DNyARToolkit|\r
++-------+---------+-------+ |\r
+|Camera | 3D | |\r
+--------------------------------------------+\r
\r
-映像キャプチャにはJMFを使用し、3D描画にはJoglを使用しています。\r
-NyARJMFとNyJoglは、これらのエクステンションをApplicationやNyARToolKit\r
-から使いやすくするためのラッパーです。\r
+映像キャプチャにはJMFを使用し、3D描画にはJOGL又はJava3Dを使用しています。\r
+NyARJMFとNyJogl,NyJ3dは、これらのエクステンションをApplicationや\r
+NyARToolKitから使いやすくするためのラッパーです。\r
\r
これらとNyARToolkitは完全に分離していますので、入力・出力ともに容易に\r
差し替えが出来ると思います。\r
\r
・サンプルなど\r
\r
-動作させる前に、JMFとJOGLをインストールしてください。\r
+å\8b\95ä½\9cã\81\95ã\81\9bã\82\8bå\89\8dã\81«ã\80\81JMFã\81¨JOGLã\81\8bJava3Dã\82\92ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82\r
動作確認したバージョンと入手先はこちらです。\r
\r
JMF JavaTM Media Framework 2.1.1e\r
http://java.sun.com/products/java-media/jmf/index.jsp\r
\r
-jogl-1.1.1-pre-20080328-windows-i586.zip\r
+jogl-1.1.1-pre-20080328-xxxx-i586.zip\r
https://jogl.dev.java.net/\r
\r
+java3d-1_5_1-xxxx-i586.exe\r
+https://java3d.dev.java.net/binary-builds.html\r
+\r
+\r
\r
サンプルは以下のディレクトリにあります。\r
\r
./src\r
-NyARToolkitのEclipseプロジェクトがあります。\r
-jp.nyatla.nyartoolkit.sampleパッケージに、Rawイメージから\r
-変換行列を求めるサンプルがあります。\r
+ NyARToolkitのEclipseプロジェクトがあります。\r
+ jp.nyatla.nyartoolkit.sampleパッケージに、Rawイメージから\r
+ 変換行列を求めるサンプルがあります。\r
\r
./sample\r
NyARToolkitのアプリケーションサンプルEclipseプロジェクトがあります。\r
-NyARJMFにはビデオキャプチャの試験プログラムと、マーカー検出プログラムがあります。\r
-NyARJOGLにはARToolkitのsimpleLite相当のサンプルがあります。\r
\r
-NyARJMFのプロジェクトはNyARToolKitに依存し、NyARJOGLのプロジェクトはNyARToolKit\r
-とNyARJMFに依存しています。\r
+ jmf\r
+ jp.nyatla.nyartoolkit.jmf.sample\r
+ ビデオキャプチャの試験プログラム と、マーカー検出プログラムがあります。\r
+\r
+ jogl\r
+ jp.nyatla.nyartoolkit.jogl.sample\r
+ ARToolkitのsimpleLite相当のサンプルがあります。\r
+\r
+ java3d\r
+ jp.nyatla.nyartoolkit.java3d.sample\r
+ simpleLiteのようなものをJava3Dで動かすサンプルがあります。\r
+\r
+\r
+NyARJMFのプロジェクトはNyARToolKitに依存し、NyARJOGLとJava3Dのプロジェクトは\r
+NyARToolKitとNyARJMFに依存しています。\r
zipを展開すると多分参照関係が壊れてますので、再設定してください。\r
\r
\r
\r
+・サンプル内のパッケージ注意点\r
+sampleディレクトリ以下にあるソースはAPIは仕様が固まっていないので、\r
+時々APIそのものを変更しています。\r
+\r
+自前のプロジェクトの部品として使われる場合は、パッケージをコピーして\r
+使用することをお勧めします。\r
+\r
+\r
\r
・NyARToolkitとオリジナルの差分\r
\r
\r
ではでは、楽しく遊んでくださいネ。\r
\r
-2008.03.29 R.Iizuka nyatla.jp\r
+2008.03.29 R.Iizuka A虎@nyatla.jp\r
/**
* VFMキャプチャテストプログラム
- * (c)2008 R.iizuka
+ * (c)2008 A虎@nyatla.jp
* airmail@ebony.plala.or.jp
* http://nyatla.jp/
*/
+package jp.nyatla.nyartoolkit.jmf.sample;
+
import javax.media.*;
import javax.media.util.BufferToImage;
import javax.media.format.*;
-
import jp.nyatla.nyartoolkit.NyARException;
-import jp.nyatla.nyartoolkit.jmf.*;
+import jp.nyatla.nyartoolkit.jmf.utils.*;
+
import java.awt.*;
/**
* VFM+ARToolkitテストプログラム
* カメラから取り込んだデータからマーカーを検出して、一致度と変換行列を表示します。
- * (c)2008 R.iizuka
+ * (c)2008 A虎@nyatla.jp
* airmail(at)ebony.plala.or.jp
* http://nyatla.jp/
*/
+package jp.nyatla.nyartoolkit.jmf.sample;
+
import javax.media.*;
import javax.media.util.BufferToImage;
import javax.media.format.*;
import jp.nyatla.nyartoolkit.NyARException;
-import jp.nyatla.nyartoolkit.jmf.*;
-import jp.nyatla.nyartoolkit.jmfutil.*;
+import jp.nyatla.nyartoolkit.jmf.utils.*;
+
import java.awt.*;
import jp.nyatla.nyartoolkit.core.*;
import jp.nyatla.nyartoolkit.detector.*;
-import jp.nyatla.nyartoolkit.core.raster.*;
+
/**\r
* JMFお手軽キャプチャクラス\r
- * (c)2008 R.Iizuka\r
+ * (c)2008 A虎@nyatla.jp\r
* airmail@ebony.plala.or.jp\r
* http://nyatla.jp/\r
*/\r
-package jp.nyatla.nyartoolkit.jmf;\r
+package jp.nyatla.nyartoolkit.jmf.utils;\r
\r
\r
\r
/**\r
* JMFお手軽キャプチャ用リスナ\r
- * (c)2008 R.Iizuka\r
+ * (c)2008 A虎@nyatla.jp\r
* airmail@ebony.plala.or.jp\r
* http://nyatla.jp/\r
*/\r
-package jp.nyatla.nyartoolkit.jmf;\r
+package jp.nyatla.nyartoolkit.jmf.utils;\r
\r
import javax.media.Buffer;\r
\r
/**\r
* RGB形式のJMFバッファをラップするNyARRasterです。\r
- * 複数のピクセルの並び順に対応してます。\r
- * (c)2008 R.iizuka\r
+ * JMFから得たラスタデータのピクセル並び順を考慮します。\r
+ * (c)2008 A虎@nyatla.jp\r
* airmail(at)ebony.plala.or.jp\r
* http://nyatla.jp/\r
*/\r
-package jp.nyatla.nyartoolkit.jmfutil;\r
+package jp.nyatla.nyartoolkit.jmf.utils;\r
\r
\r
import javax.media.format.RGBFormat;\r
height=i_height;\r
}\r
/**\r
- * javax.media.Bufferを分析して、その分析結果をNyARRasterに適合する形で保持します。\r
- * 関数実行後に外部でi_bufferの内容変更した場合には、再度setBuffer関数を呼び出してください。\r
+ * フォーマットを解析して、インスタンスのフォーマットプロパティを初期化します。\r
+ * \r
* @param i_buffer\r
- * RGB形式のデータを格納したjavax.media.Bufferオブジェクトを指定してください。\r
- * @return\r
- * i_bufferをラップしたオブジェクトを返します。\r
* @throws NyARException\r
*/\r
- public void setBuffer(javax.media.Buffer i_buffer) throws NyARException\r
+ protected void initFormatProperty(RGBFormat i_fmt) throws NyARException\r
{\r
- RGBFormat fmt=(RGBFormat)i_buffer.getFormat();\r
//データサイズの確認\r
- Dimension s=fmt.getSize();\r
+ Dimension s=i_fmt.getSize();\r
if(width!=s.width || height !=s.height){\r
throw new NyARException();\r
}\r
//データ配列の確認\r
- red_idx =fmt.getRedMask()-1;\r
- green_idx=fmt.getGreenMask()-1;\r
- blue_idx =fmt.getBlueMask()-1;\r
+ red_idx =i_fmt.getRedMask()-1;\r
+ green_idx=i_fmt.getGreenMask()-1;\r
+ blue_idx =i_fmt.getBlueMask()-1;\r
\r
//色配列の特定\r
if(red_idx==0 && blue_idx==2){\r
}else{\r
throw new NyARException("Unknown pixel order.");\r
} \r
+ }\r
+ /**\r
+ * javax.media.Bufferを分析して、その分析結果をNyARRasterに適合する形で保持します。\r
+ * 関数実行後に外部でi_bufferの内容変更した場合には、再度setBuffer関数を呼び出してください。\r
+ * @param i_buffer\r
+ * RGB形式のデータを格納したjavax.media.Bufferオブジェクトを指定してください。\r
+ * @return\r
+ * i_bufferをラップしたオブジェクトを返します。\r
+ * @throws NyARException\r
+ */\r
+ public void setBuffer(javax.media.Buffer i_buffer) throws NyARException\r
+ {\r
+ initFormatProperty((RGBFormat)i_buffer.getFormat());\r
ref_buf=(byte[])i_buffer.getData();\r
}\r
public int getPixelTotal(int i_x,int i_y)\r
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/
-package jp.nyatla.nyartoolkit.jmf;
+package jp.nyatla.nyartoolkit.jmf.utils;
import javax.media.*;
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/
-package jp.nyatla.nyartoolkit.jmf;
+package jp.nyatla.nyartoolkit.jmf.utils;
+++ /dev/null
-/**\r
- * NyARRaster_RGBにOpenGL向け関数を追加したものです。\r
- * \r
- * (c)2008 R.iizuka\r
- * airmail(at)ebony.plala.or.jp\r
- * http://nyatla.jp/\r
- */\r
-package jp.nyatla.nyartoolkit.gutil;\r
-\r
-import java.nio.ByteBuffer;\r
-import java.nio.IntBuffer;\r
-\r
-import javax.media.opengl.GL;\r
-import javax.media.opengl.glu.GLU;\r
-\r
-import jp.nyatla.nyartoolkit.NyARException;\r
-import jp.nyatla.nyartoolkit.core.NyARParam;\r
-import jp.nyatla.nyartoolkit.jmfutil.*;\r
-\r
-public class GLNyARRaster_RGB extends JmfNyARRaster_RGB\r
-{\r
- private NyARParam cparam;\r
- private GL ref_gl;\r
- private GLU glu;\r
- private byte[] gl_buf;\r
- private int gl_flag;\r
-\r
- public GLNyARRaster_RGB(GL i_ref_gl,NyARParam i_cparam)\r
- {\r
- super(i_cparam.getX(),i_cparam.getY());\r
- gl_flag=GL.GL_RGB;\r
- cparam=i_cparam;\r
- ref_gl=i_ref_gl;\r
- glu=new GLU();\r
- this.gl_buf=new byte[width*height*3];\r
- }\r
- public void setBuffer(javax.media.Buffer i_buffer,boolean i_is_reverse) throws NyARException\r
- {\r
- super.setBuffer(i_buffer);\r
- //メモ:この時点では、ref_dataにはi_bufferの参照値が入ってる。\r
- \r
- //GL用のデータを準備\r
- if(i_is_reverse){\r
- int length=width*3;\r
- int src_idx=0;\r
- int dest_idx=(height-1)*length;\r
- for(int i=0;i<height;i++){\r
- System.arraycopy(ref_buf,src_idx,gl_buf,dest_idx,length);\r
- src_idx+=length;\r
- dest_idx-=length;\r
- }\r
- }else{\r
- System.arraycopy(ref_buf,0,gl_buf,0,this.ref_buf.length);\r
- }\r
- //GLのフラグ設定\r
- switch(this.pix_type){\r
- case GLNyARRaster_RGB.PIXEL_ORDER_BGR:\r
- gl_flag=GL.GL_BGR;\r
- break;\r
- case GLNyARRaster_RGB.PIXEL_ORDER_RGB:\r
- gl_flag=GL.GL_RGB;\r
- break;\r
- default:\r
- throw new NyARException();\r
- }\r
- //ref_bufをgl_bufに差し替える\r
- ref_buf=gl_buf;\r
- }\r
- /**\r
- * 保持してるイメージをGLに出力する。\r
- * @param image\r
- * @param zoom\r
- */\r
- public void glDispImage(double zoom)\r
- {\r
- IntBuffer texEnvModeSave=IntBuffer.allocate(1); \r
- boolean lightingSave;\r
- boolean depthTestSave;\r
-\r
- // Prepare an orthographic projection, set camera position for 2D drawing, and save GL state.\r
- ref_gl.glGetTexEnviv(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, texEnvModeSave); // Save GL texture environment mode.\r
- if (texEnvModeSave.array()[0] != GL.GL_REPLACE){\r
- ref_gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);\r
- }\r
- lightingSave = ref_gl.glIsEnabled(GL.GL_LIGHTING); // Save enabled state of lighting.\r
- if (lightingSave == true){\r
- ref_gl.glDisable(GL.GL_LIGHTING);\r
- }\r
- depthTestSave = ref_gl.glIsEnabled(GL.GL_DEPTH_TEST); // Save enabled state of depth test.\r
- if (depthTestSave == true){\r
- ref_gl.glDisable(GL.GL_DEPTH_TEST);\r
- }\r
- ref_gl.glMatrixMode(GL.GL_PROJECTION);\r
- ref_gl.glPushMatrix();\r
- ref_gl.glLoadIdentity();\r
- glu.gluOrtho2D(0.0,0.0,cparam.getX(),cparam.getY());\r
- ref_gl.glMatrixMode(GL.GL_MODELVIEW);\r
- ref_gl.glPushMatrix();\r
- ref_gl.glLoadIdentity();\r
- ref_gl.glRotatef(0.0f,0.0f,180f,0f);\r
- arglDispImageStateful(zoom);\r
-\r
-\r
- // Restore previous projection, camera position, and GL state.\r
- ref_gl.glMatrixMode(GL.GL_PROJECTION);\r
- ref_gl.glPopMatrix();\r
- ref_gl.glMatrixMode(GL.GL_MODELVIEW);\r
- ref_gl.glPopMatrix();\r
- if (depthTestSave){\r
- ref_gl.glEnable(GL.GL_DEPTH_TEST); // Restore enabled state of depth test.\r
- }\r
- if (lightingSave){\r
- ref_gl.glEnable(GL.GL_LIGHTING); // Restore enabled state of lighting.\r
- }\r
- if (texEnvModeSave.get(0) != GL.GL_REPLACE){\r
- ref_gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, texEnvModeSave.get(0)); // Restore GL texture environment mode.\r
- }\r
- ref_gl.glEnd();\r
- }\r
- /**\r
- * arglDispImageStateful関数モドキ\r
- * @param image\r
- * @param zoom\r
- */\r
- private void arglDispImageStateful(double zoom)\r
- {\r
- float zoomf;\r
- IntBuffer params=IntBuffer.allocate(4);\r
- zoomf = (float)zoom;\r
- ref_gl.glDisable(GL.GL_TEXTURE_2D);\r
- ref_gl.glGetIntegerv(GL.GL_VIEWPORT,params);\r
- ref_gl.glPixelZoom(zoomf * ((float)(params.get(2)) / (float)width),-zoomf * ((float)(params.get(3)) / (float)height));\r
- ref_gl.glRasterPos2i(-1,1);\r
- ref_gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);\r
- ByteBuffer buf=ByteBuffer.wrap(ref_buf);\r
- ref_gl.glDrawPixels(width,height,gl_flag,GL.GL_UNSIGNED_BYTE,buf);\r
- } \r
-}\r
* simpleLiteと同じようなテストプログラム\r
* マーカーの一致度の最低値をチェックするところを抜いたので、同じマーカーを大量に\r
* 検出すると面白いことになります。\r
- * (c)2008 R.iizuka\r
+ * (c)2008 A虎@nyatla.jp\r
* airmail(at)ebony.plala.or.jp\r
* http://nyatla.jp/\r
*/\r
+package jp.nyatla.nyartoolkit.jogl.sample;\r
+\r
import java.awt.event.WindowAdapter;\r
import java.awt.event.WindowEvent;\r
import java.awt.*;\r
\r
import jp.nyatla.nyartoolkit.core.NyARCode;\r
\r
-import jp.nyatla.nyartoolkit.jmf.JmfCameraCapture;\r
-import jp.nyatla.nyartoolkit.jmf.JmfCaptureListener;\r
-import jp.nyatla.nyartoolkit.gutil.*;\r
+import jp.nyatla.nyartoolkit.jmf.utils.JmfCameraCapture;\r
+import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureListener;\r
+import jp.nyatla.nyartoolkit.jogl.utils.*;\r
\r
\r
public class JavaSimpleLite implements GLEventListener,JmfCaptureListener\r
private final String CARCODE_FILE ="../../Data/patt.hiro";\r
private final String PARAM_FILE ="../../Data/camera_para.dat";\r
\r
- \r
+ private final static int SCREEN_X=320;\r
+ private final static int SCREEN_Y=240;\r
private Animator animator;\r
private GLNyARRaster_RGB cap_image;\r
\r
private JmfCameraCapture capture;\r
- private GL gl;\r
+ private GL gl;\r
+ private NyARGLUtil glnya;\r
+\r
+\r
//NyARToolkit関係\r
private GLNyARSingleDetectMarker nya;\r
private GLNyARParam ar_param;\r
{\r
// Colour cube data.\r
int polyList = 0;\r
- float fSize = 0.5f;\r
+ float fSize = 0.5f;//マーカーサイズに対して0.5倍なので、4cmのナタデココ\r
int f, i; \r
float[][] cube_vertices=new float[][]{\r
{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
\r
frame.setVisible(true);\r
Insets ins=frame.getInsets();\r
- frame.setSize(320+ins.left+ins.right,240+ins.top+ins.bottom);\r
- canvas.setBounds(ins.left,ins.top,320,240);\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
ar_param=new GLNyARParam();\r
NyARCode ar_code =new NyARCode(16,16);\r
ar_param.loadFromARFile(PARAM_FILE);\r
- ar_param.changeSize(320,240);\r
+ ar_param.changeSize(SCREEN_X,SCREEN_Y);\r
nya=new GLNyARSingleDetectMarker(ar_param,ar_code,80.0);\r
ar_code.loadFromARFile(CARCODE_FILE);\r
+ //NyARToolkit用の支援クラス\r
+ glnya=new NyARGLUtil(gl,ar_param);\r
//GL対応のRGBラスタオブジェクト\r
cap_image=new GLNyARRaster_RGB(gl,ar_param);\r
//キャプチャ開始\r
int x, int y,\r
int width, int height)\r
{\r
- float ratio = (float)height / (float)width;\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
- gl.glFrustum(-1.0f, 1.0f, -ratio, ratio,\r
- 5.0f, 40.0f);\r
//見る位置\r
gl.glMatrixMode(GL.GL_MODELVIEW);\r
gl.glLoadIdentity();\r
- gl.glTranslatef(0.0f, 0.0f, -10.0f);\r
}\r
\r
public void display(GLAutoDrawable drawable)\r
synchronized(cap_image){\r
is_marker_exist=nya.detectMarkerLite(cap_image,100);\r
//背景を書く\r
- cap_image.glDispImage(1.0);\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(ar_param.getCameraFrustumRH(),0);\r
/**\r
* NyARParamにOpenGL向け関数を追加したもの\r
- * (c)2008 R.iizuka\r
+ * (c)2008 A虎@nyatla.jp\r
* airmail(at)ebony.plala.or.jp\r
* http://nyatla.jp/\r
*/\r
-package jp.nyatla.nyartoolkit.gutil;\r
+package jp.nyatla.nyartoolkit.jogl.utils;\r
\r
import jp.nyatla.nyartoolkit.core.*;\r
public class GLNyARParam extends NyARParam\r
--- /dev/null
+/**\r
+ * NyARRaster_RGBにOpenGL用のデータ変換機能を追加したものです。\r
+ * \r
+ * (c)2008 A虎@nyatla.jp\r
+ * airmail(at)ebony.plala.or.jp\r
+ * http://nyatla.jp/\r
+ */\r
+package jp.nyatla.nyartoolkit.jogl.utils;\r
+\r
+import javax.media.format.RGBFormat;\r
+import javax.media.opengl.GL;\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.jmf.utils.*;\r
+import jp.nyatla.nyartoolkit.core.*;\r
+\r
+public class GLNyARRaster_RGB extends JmfNyARRaster_RGB\r
+{\r
+ private byte[] gl_buf;\r
+ private int gl_flag;\r
+\r
+ public GLNyARRaster_RGB(GL i_ref_gl,NyARParam i_param)\r
+ {\r
+ super(i_param.getX(),i_param.getY());\r
+ this.gl_flag=GL.GL_RGB;\r
+ this.gl_buf=new byte[this.width*this.height*3];\r
+ }\r
+ public void setBuffer(javax.media.Buffer i_buffer,boolean i_is_reverse) throws NyARException\r
+ {\r
+ //JMFデータでフォーマットプロパティを初期化\r
+ initFormatProperty((RGBFormat)i_buffer.getFormat());\r
+ \r
+ byte[] src_buf=(byte[])i_buffer.getData();\r
+ //GL用のデータを準備\r
+ if(i_is_reverse){\r
+ int length=this.width*3;\r
+ int src_idx=0;\r
+ int dest_idx=(this.height-1)*length;\r
+ for(int i=0;i<this.height;i++){\r
+ System.arraycopy(src_buf,src_idx,this.gl_buf,dest_idx,length);\r
+ src_idx+=length;\r
+ dest_idx-=length;\r
+ }\r
+ }else{\r
+ System.arraycopy(src_buf,0,gl_buf,0,src_buf.length);\r
+ }\r
+ //GLのフラグ設定\r
+ switch(this.pix_type){\r
+ case GLNyARRaster_RGB.PIXEL_ORDER_BGR:\r
+ this.gl_flag=GL.GL_BGR;\r
+ break;\r
+ case GLNyARRaster_RGB.PIXEL_ORDER_RGB:\r
+ this.gl_flag=GL.GL_RGB;\r
+ break;\r
+ default:\r
+ throw new NyARException();\r
+ }\r
+ //ref_bufをgl_bufに差し替える\r
+ ref_buf=gl_buf;\r
+ }\r
+ /**\r
+ * GLでそのまま描画できるRGBバッファを返す。\r
+ * @return\r
+ */\r
+ public byte[] getGLRgbArray()\r
+ {\r
+ return this.ref_buf;\r
+ }\r
+ /**\r
+ * GL用のRGBバッファのバイト並びタイプを返す。\r
+ * @return\r
+ */\r
+ public int getGLPixelFlag()\r
+ {\r
+ return this.gl_flag;\r
+ }\r
+}\r
/**\r
* NyARSingleDetectMarkerにOpenGL向け関数を追加したもの\r
- * (c)2008 R.iizuka\r
+ * (c)2008 A虎@nyatla.jp\r
* airmail(at)ebony.plala.or.jp\r
* http://nyatla.jp/\r
*/\r
-package jp.nyatla.nyartoolkit.gutil;\r
+package jp.nyatla.nyartoolkit.jogl.utils;\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
import jp.nyatla.nyartoolkit.core.NyARCode;\r
--- /dev/null
+/**\r
+ * NyARToolkit用のJOGL支援関数群\r
+ * (c)2008 A虎@nyatla.jp\r
+ * airmail(at)ebony.plala.or.jp\r
+ * http://nyatla.jp/\r
+ */\r
+package jp.nyatla.nyartoolkit.jogl.utils;\r
+import java.nio.ByteBuffer;\r
+import java.nio.IntBuffer;\r
+\r
+import javax.media.opengl.GL;\r
+import javax.media.opengl.glu.GLU;\r
+\r
+import jp.nyatla.nyartoolkit.core.*;\r
+\r
+public class NyARGLUtil\r
+{\r
+ private NyARParam ar_param;\r
+ private javax.media.opengl.GL gl;\r
+ private javax.media.opengl.glu.GLU glu;\r
+ public NyARGLUtil(javax.media.opengl.GL i_gl,NyARParam i_camera_param)\r
+ {\r
+ this.ar_param=i_camera_param;\r
+ this.gl=i_gl;\r
+ this.glu=new GLU();\r
+ }\r
+ /**\r
+ * GLNyARRaster_RGBをバックグラウンドに書き出す。\r
+ * @param image\r
+ * @param zoom\r
+ */\r
+ public void drawBackGround(GLNyARRaster_RGB i_raster,double i_zoom)\r
+ {\r
+ IntBuffer texEnvModeSave=IntBuffer.allocate(1); \r
+ boolean lightingSave;\r
+ boolean depthTestSave;\r
+ javax.media.opengl.GL gl_=this.gl;\r
+ \r
+ // Prepare an orthographic projection, set camera position for 2D drawing, and save GL state.\r
+ gl_.glGetTexEnviv(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, texEnvModeSave); // Save GL texture environment mode.\r
+ if (texEnvModeSave.array()[0] != GL.GL_REPLACE){\r
+ gl_.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);\r
+ }\r
+ lightingSave = gl_.glIsEnabled(GL.GL_LIGHTING); // Save enabled state of lighting.\r
+ if (lightingSave == true){\r
+ gl_.glDisable(GL.GL_LIGHTING);\r
+ }\r
+ depthTestSave = gl_.glIsEnabled(GL.GL_DEPTH_TEST); // Save enabled state of depth test.\r
+ if (depthTestSave == true){\r
+ gl_.glDisable(GL.GL_DEPTH_TEST);\r
+ }\r
+ gl_.glMatrixMode(GL.GL_PROJECTION);\r
+ gl_.glPushMatrix();\r
+ gl_.glLoadIdentity();\r
+ glu.gluOrtho2D(0.0,ar_param.getX(),0.0,ar_param.getY());\r
+ gl_.glMatrixMode(GL.GL_MODELVIEW);\r
+ gl_.glPushMatrix();\r
+ gl_.glLoadIdentity();\r
+ arglDispImageStateful(i_raster,i_zoom);\r
+\r
+\r
+ // Restore previous projection, camera position, and GL state.\r
+ gl_.glMatrixMode(GL.GL_PROJECTION);\r
+ gl_.glPopMatrix();\r
+ gl_.glMatrixMode(GL.GL_MODELVIEW);\r
+ gl_.glPopMatrix();\r
+ if (depthTestSave){\r
+ gl_.glEnable(GL.GL_DEPTH_TEST); // Restore enabled state of depth test.\r
+ }\r
+ if (lightingSave){\r
+ gl_.glEnable(GL.GL_LIGHTING); // Restore enabled state of lighting.\r
+ }\r
+ if (texEnvModeSave.get(0) != GL.GL_REPLACE){\r
+ gl_.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, texEnvModeSave.get(0)); // Restore GL texture environment mode.\r
+ }\r
+ gl_.glEnd();\r
+ }\r
+ /**\r
+ * arglDispImageStateful関数モドキ\r
+ * @param image\r
+ * @param zoom\r
+ */\r
+ private void arglDispImageStateful(GLNyARRaster_RGB i_raster,double zoom)\r
+ {\r
+ javax.media.opengl.GL gl_=this.gl;\r
+ int width =i_raster.getWidth();\r
+ int height=i_raster.getHeight();\r
+ float zoomf;\r
+ IntBuffer params=IntBuffer.allocate(4);\r
+ zoomf = (float)zoom;\r
+ gl_.glDisable(GL.GL_TEXTURE_2D);\r
+ gl_.glGetIntegerv(GL.GL_VIEWPORT,params);\r
+ gl_.glPixelZoom(zoomf * ((float)(params.get(2)) / (float)width),-zoomf * ((float)(params.get(3)) / (float)height));\r
+ gl_.glRasterPos2f(0.0f,(float)height);\r
+ gl_.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);\r
+ ByteBuffer buf=ByteBuffer.wrap(i_raster.getGLRgbArray());\r
+ gl_.glDrawPixels(width,height,i_raster.getGLPixelFlag(),GL.GL_UNSIGNED_BYTE,buf);\r
+ } \r
+}\r
package jp.nyatla.nyartoolkit.core;\r
\r
import java.io.FileInputStream;\r
+import java.io.InputStream;\r
import java.io.InputStreamReader;\r
import java.io.StreamTokenizer;\r
\r
pat=new int[4][height][width][3];//static int pat[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
patBW=new short[4][height][width];//static int patBW[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
}\r
-\r
-\r
/**\r
* int arLoadPatt( const char *filename );\r
* ARToolKitのパターンファイルをロードする。\r
+ * ファイル形式はBGR形式で記録されたパターンファイルであること。\r
* @param filename\r
* @return\r
* @throws Exception\r
*/\r
public void loadFromARFile(String filename) throws NyARException\r
{\r
+ try {\r
+ loadFromARFile(new FileInputStream(filename));\r
+\r
+ } catch (Exception e) {\r
+ throw new NyARException(e);\r
+ }\r
+ }\r
+ /**\r
+ * \r
+ * @param i_stream\r
+ * @throws NyARException\r
+ */\r
+ public void loadFromARFile(InputStream i_stream) throws NyARException\r
+ {\r
try{\r
- StreamTokenizer st=new StreamTokenizer(new InputStreamReader(new FileInputStream(filename)));\r
+ StreamTokenizer st=new StreamTokenizer(new InputStreamReader(i_stream));\r
//パターンデータはGBRAで並んでる。\r
for(int h=0; h<4; h++ ) {\r
int l = 0;\r
*/\r
public void loadFromARFile(String i_filename) throws NyARException\r
{\r
- try{\r
- FileInputStream fs=new FileInputStream(i_filename);\r
- NyARParam new_inst[]=arParamLoad(fs,1);\r
- fs.close();\r
- xsize =new_inst[0].xsize;\r
- ysize =new_inst[0].ysize;\r
- mat =new_inst[0].mat;\r
- dist_factor=new_inst[0].dist_factor;\r
- }catch(Exception e){\r
- throw new NyARException(e);\r
- }\r
+ try {\r
+ loadFromARFile(new FileInputStream(i_filename));\r
+ } catch (Exception e) {\r
+ throw new NyARException(e);\r
+ }\r
+ }\r
+ public void loadFromARFile(InputStream i_stream) throws NyARException\r
+ {\r
+ try {\r
+ NyARParam new_inst[] = arParamLoad(i_stream, 1);\r
+ i_stream.close();\r
+ xsize = new_inst[0].xsize;\r
+ ysize = new_inst[0].ysize;\r
+ mat = new_inst[0].mat;\r
+ dist_factor = new_inst[0].dist_factor;\r
+ } catch (Exception e) {\r
+ throw new NyARException(e);\r
+ }\r
}\r
/*static double dot( double a1, double a2, double a3,double b1, double b2, double b3 )*/\r
private static double dot( double a1, double a2, double a3,double b1, double b2, double b3 )\r
public double getConfidence();\r
public int getDirection();\r
public void evaluate(NyARCode i_code);\r
- public void setPatt(NyARColorPatt i_target_patt) throws NyARException;\r
+ public boolean setPatt(NyARColorPatt i_target_patt) throws NyARException;\r
}\r
\r
\r
private int dir=0;\r
private int ave;\r
private int[][][] input=new int[height][width][3];\r
- public void setPatt(NyARColorPatt i_target_patt) throws NyARException\r
+ public boolean setPatt(NyARColorPatt i_target_patt) throws NyARException\r
{\r
width=i_target_patt.getWidth();\r
height=i_target_patt.getHeight();\r
\r
datapow = Math.sqrt( (double)sum );\r
if( datapow == 0.0 ){\r
- throw new NyARException();\r
+ return false;// throw new NyARException();\r
// dir.set(0);//*dir = 0;\r
// cf.set(-1.0);//*cf = -1.0;\r
// return -1;\r
}\r
+ return true;\r
}\r
public double getConfidence()\r
{\r
public int getDirection(){\r
return dir;\r
}\r
- public void setPatt(NyARColorPatt i_target_patt) throws NyARException\r
+ public boolean setPatt(NyARColorPatt i_target_patt) throws NyARException\r
{\r
width=i_target_patt.getWidth();\r
height=i_target_patt.getHeight();\r
}\r
datapow = Math.sqrt( (double)sum );\r
if(datapow == 0.0){\r
- throw new NyARException();\r
+ return false;// throw new NyARException();\r
// dir.set(0);//*dir = 0;\r
// cf.set(-1.0);//*cf = -1.0;\r
// return -1;\r
- } \r
+ }\r
+ return true;\r
}\r
/**\r
* public int pattern_match(short[][][] data,IntPointer dir,DoublePointer cf)\r
public int getDirection(){\r
return dir;\r
}\r
- public void setPatt(NyARColorPatt i_target_patt) throws NyARException\r
+ public boolean setPatt(NyARColorPatt i_target_patt) throws NyARException\r
{\r
width=i_target_patt.getWidth();\r
height=i_target_patt.getHeight();\r
}\r
datapow = Math.sqrt( (double)sum );\r
if(datapow == 0.0){\r
- throw new NyARException();\r
+ return false;//throw new NyARException();\r
// dir.set(0);//*dir = 0;\r
// cf.set(-1.0);//*cf = -1.0;\r
// return -1;\r
- } \r
+ }\r
+ return true;\r
}\r
/**\r
* public int pattern_match(short[][][] data,IntPointer dir,DoublePointer cf)\r
//パターンの評価オブジェクトを作る。\r
NyARMatchPatt_Color_WITHOUT_PCA eva=new NyARMatchPatt_Color_WITHOUT_PCA();\r
//パターンを評価器にセット\r
- eva.setPatt(patt);\r
+ if(!eva.setPatt(patt)){\r
+ //計算に失敗した。\r
+ return false;\r
+ }\r
//コードと比較する\r
eva.evaluate(code);\r
int square_index=0;\r