*\r
*/\r
class MarkerProcessor extends SingleARMarkerProcesser\r
- { \r
- private Object _sync_object=new Object();\r
- public NyARTransMatResult transmat=null;\r
+ {\r
+ private NyARGLUtil _glnya;\r
+ public double[] gltransmat=new double[16];\r
+ \r
public int current_code=-1;\r
\r
- public MarkerProcessor(NyARParam i_cparam,int i_raster_format) throws NyARException\r
+ public MarkerProcessor(NyARParam i_cparam,int i_raster_format,NyARGLUtil i_glutil) throws NyARException\r
{\r
//アプリケーションフレームワークの初期化\r
super();\r
initInstance(i_cparam,i_raster_format);\r
+ this._glnya=i_glutil;\r
return;\r
}\r
protected void onEnterHandler(int i_code)\r
{\r
- synchronized(this._sync_object){\r
- current_code=i_code;\r
- }\r
+ current_code=i_code;\r
}\r
protected void onLeaveHandler()\r
{\r
- synchronized(this._sync_object){\r
- current_code=-1;\r
- this.transmat=null;\r
- }\r
+ current_code=-1;\r
return; \r
}\r
-\r
+ /**\r
+ * i_square,resultの有効期間は、この関数の終了までです。\r
+ */\r
protected void onUpdateHandler(NyARSquare i_square, NyARTransMatResult result)\r
{\r
- synchronized(this._sync_object){\r
- this.transmat=result;\r
- } \r
+ try{\r
+ this._glnya.toCameraViewRH(result, this.gltransmat);\r
+ }catch(Exception e){\r
+ e.printStackTrace();\r
+ }\r
}\r
}\r
\r
\r
this._code_table[0]=new NyARCode(16,16);\r
this._code_table[0].loadARPattFromFile(CARCODE_FILE1);\r
- //プロセッサの準備\r
- this._processor=new MarkerProcessor(i_cparam,this._cap_image.getBufferType());\r
- this._processor.setARCodeTable(_code_table,16,80.0);\r
\r
//OpenGLフレームの準備(OpenGLリソースの初期化、カメラの撮影開始は、initコールバック関数内で実行)\r
Frame frame = new Frame("Java simpleLite with NyARToolkit");\r
//NyARToolkitの準備\r
try {\r
this._glnya = new NyARGLUtil(this._gl);\r
+ //プロセッサの準備\r
+ this._processor=new MarkerProcessor(this._ar_param,this._cap_image.getBufferType(),this._glnya);\r
+ this._processor.setARCodeTable(_code_table,16,80.0);\r
+\r
//カメラパラメータの計算\r
this._glnya.toCameraFrustumRH(this._ar_param,this._camera_projection);\r
//キャプチャ開始\r
_gl.glMatrixMode(GL.GL_MODELVIEW);\r
_gl.glLoadIdentity();\r
}\r
- private double[] __display_wk=new double[16];\r
\r
\r
public void display(GLAutoDrawable drawable)\r
{\r
- NyARTransMatResult transmat_result = this._processor.transmat;\r
if (!_cap_image.hasBuffer()) {\r
return;\r
}\r
// 背景を書く\r
this._gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.\r
- this._glnya.drawBackGround(this._cap_image, 1.0); \r
- if(this._processor.current_code<0 || transmat_result==null){\r
- \r
- }else{\r
- try{\r
- synchronized(this._sync_object){\r
+ this._glnya.drawBackGround(this._cap_image, 1.0);\r
+ //OnEnter,OnUpdateの間に、transmatに初回行列がストアされる実行されることを防ぎます。\r
+ synchronized(this._sync_object)\r
+ {\r
+ if(this._processor.current_code<0){\r
+ \r
+ }else{\r
+ try{\r
// Projection transformation.\r
this._gl.glMatrixMode(GL.GL_PROJECTION);\r
this._gl.glLoadMatrixd(_camera_projection, 0);\r
this._gl.glMatrixMode(GL.GL_MODELVIEW);\r
// Viewing transformation.\r
this._gl.glLoadIdentity();\r
- // 変換行列をOpenGL形式に変換\r
- this._glnya.toCameraViewRH(transmat_result, __display_wk);\r
- this._gl.glLoadMatrixd(__display_wk, 0);\r
+ this._gl.glLoadMatrixd(this._processor.gltransmat, 0);\r
// All other lighting and geometry goes here.\r
this._gl.glPushMatrix();\r
this._gl.glDisable(GL.GL_LIGHTING);\r
this._gl.glRotatef(90,1.0f,0f,0f);\r
this._panel.draw("MarkerId:"+this._processor.current_code,0.01f);\r
this._gl.glPopMatrix();\r
+ Thread.sleep(1);// タスク実行権限を一旦渡す\r
+ }catch(Exception e){\r
+ e.printStackTrace();\r
}\r
- Thread.sleep(1);// タスク実行権限を一旦渡す\r
- }catch(Exception e){\r
- e.printStackTrace();\r
}\r
- } \r
+ }\r
return;\r
\r
}\r
*/\r
class MarkerProcessor extends SingleNyIdMarkerProcesser\r
{ \r
- private Object _sync_object=new Object();\r
- public NyARTransMatResult transmat=null;\r
+ private NyARGLUtil _glnya; \r
+ public double[] gltransmat=new double[16];\r
public int current_id=-1;\r
\r
- public MarkerProcessor(NyARParam i_cparam,int i_width,int i_raster_format) throws NyARException\r
+ public MarkerProcessor(NyARParam i_cparam,int i_width,int i_raster_format,NyARGLUtil i_glutil) throws NyARException\r
{\r
//アプリケーションフレームワークの初期化\r
super();\r
initInstance(i_cparam,new NyIdMarkerDataEncoder_RawBit(),100,i_raster_format);\r
+ this._glnya=i_glutil;\r
return;\r
}\r
/**\r
*/\r
protected void onEnterHandler(INyIdMarkerData i_code)\r
{\r
- synchronized(this._sync_object){\r
- NyIdMarkerData_RawBit code=(NyIdMarkerData_RawBit)i_code;\r
- if(code.length>4){\r
- //4バイト以上の時はint変換しない。\r
- this.current_id=-1;//undefined_id\r
- }else{\r
- this.current_id=0;\r
- //最大4バイト繋げて1個のint値に変換\r
- for(int i=0;i<code.length;i++){\r
- this.current_id=(this.current_id<<8)|code.packet[i];\r
- }\r
+ NyIdMarkerData_RawBit code=(NyIdMarkerData_RawBit)i_code;\r
+ if(code.length>4){\r
+ //4バイト以上の時はint変換しない。\r
+ this.current_id=-1;//undefined_id\r
+ }else{\r
+ this.current_id=0;\r
+ //最大4バイト繋げて1個のint値に変換\r
+ for(int i=0;i<code.length;i++){\r
+ this.current_id=(this.current_id<<8)|code.packet[i];\r
}\r
- this.transmat=null;\r
}\r
}\r
/**\r
*/\r
protected void onLeaveHandler()\r
{\r
- synchronized(this._sync_object){\r
- this.current_id=-1;\r
- this.transmat=null;\r
- }\r
+ this.current_id=-1;\r
return;\r
}\r
/**\r
* アプリケーションフレームワークのハンドラ(マーカ更新)\r
+ * i_squareとresultの有効期間は個のコールバック関数が終了するまでです。\r
*/\r
protected void onUpdateHandler(NyARSquare i_square, NyARTransMatResult result)\r
{\r
- synchronized(this._sync_object){\r
- this.transmat=result;\r
- }\r
+ try{\r
+ this._glnya.toCameraViewRH(result, this.gltransmat);\r
+ }catch(Exception e){\r
+ e.printStackTrace();\r
+ } \r
}\r
}\r
\r
}\r
this._capture.setOnCapture(this);\r
this._cap_image = new GLNyARRaster_RGB(i_cparam,this._capture.getCaptureFormat()); \r
-\r
- //プロセッサの準備\r
- this._processor=new MarkerProcessor(i_cparam,100,this._cap_image.getBufferType());\r
\r
//OpenGLフレームの準備(OpenGLリソースの初期化、カメラの撮影開始は、initコールバック関数内で実行)\r
Frame frame = new Frame("Java simpleLite with NyARToolkit");\r
this._glnya = new NyARGLUtil(this._gl);\r
//カメラパラメータの計算\r
this._glnya.toCameraFrustumRH(this._ar_param,this._camera_projection);\r
+ //プロセッサの準備\r
+ this._processor=new MarkerProcessor(this._ar_param,100,this._cap_image.getBufferType(),this._glnya);\r
+ \r
//キャプチャ開始\r
this._capture.start();\r
} catch (Exception e) {\r
_gl.glMatrixMode(GL.GL_MODELVIEW);\r
_gl.glLoadIdentity();\r
}\r
- private double[] __display_wk=new double[16];\r
\r
\r
public void display(GLAutoDrawable drawable)\r
{\r
- NyARTransMatResult transmat_result = this._processor.transmat;\r
if (!_cap_image.hasBuffer()) {\r
return;\r
}\r
// 背景を書く\r
this._gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.\r
this._glnya.drawBackGround(this._cap_image, 1.0); \r
- if(this._processor.current_id<0 || transmat_result==null){\r
- \r
- }else{\r
- try{\r
- synchronized(this._sync_object){\r
+ synchronized(this._sync_object)\r
+ {\r
+ if(this._processor.current_id<0){\r
+ \r
+ }else{\r
+ try{\r
// Projection transformation.\r
this._gl.glMatrixMode(GL.GL_PROJECTION);\r
this._gl.glLoadMatrixd(_camera_projection, 0);\r
// Viewing transformation.\r
this._gl.glLoadIdentity();\r
// 変換行列をOpenGL形式に変換\r
- this._glnya.toCameraViewRH(transmat_result, __display_wk);\r
- this._gl.glLoadMatrixd(__display_wk, 0);\r
+ this._gl.glLoadMatrixd(this._processor.gltransmat, 0);\r
// All other lighting and geometry goes here.\r
this._gl.glPushMatrix();\r
this._gl.glDisable(GL.GL_LIGHTING);\r
-\r
+ \r
\r
//マーカのXZ平面をマーカの左上、表示開始位置を10cm上空へ。\r
//くるーんくるん\r
this._gl.glRotatef(90,1.0f,0f,0f);\r
this._panel.draw("MarkerId:"+this._processor.current_id,0.01f);\r
this._gl.glPopMatrix();\r
+ Thread.sleep(1);// タスク実行権限を一旦渡す\r
+ }catch(Exception e){\r
+ e.printStackTrace();\r
}\r
- Thread.sleep(1);// タスク実行権限を一旦渡す\r
- }catch(Exception e){\r
- e.printStackTrace();\r
}\r
} \r
return;\r