From 81365b066491b7d0546d3a89e84cb166ee616efc Mon Sep 17 00:00:00 2001 From: nyatla Date: Sat, 7 Jun 2008 02:25:25 +0000 Subject: [PATCH] =?utf8?q?[=E3=83=AA=E3=83=AA=E3=83=BC=E3=82=B9]NyARToolki?= =?utf8?q?t=200.8=20=E4=B8=8D=E8=B6=B3=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?utf8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- changelog/0.8.20080412.0.txt | 3158 ++++++++++++++++++++ sample/java3d/.classpath | 12 + sample/java3d/.project | 17 + .../nyartoolkit/java3d/sample/NyARJava3D.java | 148 + .../nyartoolkit/java3d/utils/J3dNyARParam.java | 119 + .../java3d/utils/J3dNyARRaster_RGB.java | 64 + .../utils/NyARSingleMarkerBehaviorHolder.java | 191 ++ .../utils/NyARSingleMarkerBehaviorListener.java | 24 + 8 files changed, 3733 insertions(+) create mode 100644 changelog/0.8.20080412.0.txt create mode 100644 sample/java3d/.classpath create mode 100644 sample/java3d/.project create mode 100644 sample/java3d/src/jp/nyatla/nyartoolkit/java3d/sample/NyARJava3D.java create mode 100644 sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARParam.java create mode 100644 sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARRaster_RGB.java create mode 100644 sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorHolder.java create mode 100644 sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorListener.java diff --git a/changelog/0.8.20080412.0.txt b/changelog/0.8.20080412.0.txt new file mode 100644 index 0000000..2bccbce --- /dev/null +++ b/changelog/0.8.20080412.0.txt @@ -0,0 +1,3158 @@ +Index: D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorListener.java +=================================================================== +--- D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorListener.java (revision 0) ++++ D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorListener.java (revision 178) +@@ -0,0 +1,24 @@ ++/** ++ * NyARToolkit‚ÌBehavior‚̃ŠƒXƒi ++ * (c)2008 AŒÕ—nyatla.jp ++ * airmail@ebony.plala.or.jp ++ * http://nyatla.jp/ ++ */ ++package jp.nyatla.nyartoolkit.java3d.utils; ++ ++import javax.media.j3d.*; ++ ++public interface NyARSingleMarkerBehaviorListener ++{ ++ /** ++ * ‚±‚̃ŠƒXƒi‚́AƒŠƒXƒi‚Ƀ}[ƒJ[‚ɘA“®‚µ‚ăIƒuƒWƒFƒNƒg‚𑀍삷‚éƒ`ƒƒƒ“ƒX‚ð—^‚¦‚Ü‚·B ++ * ƒŠƒXƒi‚ÍNyARSingleMarkerBehaviorŠÖ”“à‚ÌprocessStimulusŠÖ”‚©‚çŒÄ‚яo‚³‚ê‚Ü‚·B ++ * ++ * @param i_is_marker_exist ++ * ƒ}[ƒJ[‚ª‘¶Ý‚·‚éê‡trueA‘¶Ý‚µ‚È‚¢ê‡Afalse‚Å‚·B ++ * @param i_transform3d ++ * ƒ}[ƒJ[‚ª‘¶Ý‚·‚éê‡A‚»‚Ì•ÏŠ·s—ñ‚ªŽw’肳‚ê‚Ü‚·B ++ * i_is_marker_exist‚ªtrue‚ÌŽž‚¾‚¯—LŒø‚Å‚·B ++ */ ++ public void onUpdate(boolean i_is_marker_exist,Transform3D i_transform3d); ++} +Index: D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARRaster_RGB.java +=================================================================== +--- D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARRaster_RGB.java (revision 0) ++++ D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARRaster_RGB.java (revision 178) +@@ -0,0 +1,64 @@ ++/** ++ * NyARRaster_RGB‚ÉOpenGLŒü‚¯ŠÖ”‚ð’ljÁ‚µ‚½‚à‚Ì ++ * (c)2008 AŒÕ—nyatla.jp ++ * airmail(at)ebony.plala.or.jp ++ * http://nyatla.jp/ ++ */ ++package jp.nyatla.nyartoolkit.java3d.utils; ++ ++import java.awt.image.*; ++import java.awt.color.*; ++ ++import javax.media.j3d.ImageComponent; ++import javax.media.j3d.ImageComponent2D; ++ ++ ++ ++import jp.nyatla.nyartoolkit.NyARException; ++import jp.nyatla.nyartoolkit.core.NyARParam; ++import jp.nyatla.nyartoolkit.jmf.utils.*; ++ ++ ++public class J3dNyARRaster_RGB extends JmfNyARRaster_RGB ++{ ++// public ImageUpdater updater; ++ private ImageComponent2D imc2d; ++ private byte[] i2d_buf; ++ ++ public void setBuffer(javax.media.Buffer i_buffer) throws NyARException ++ { ++ super.setBuffer(i_buffer); ++ //ƒƒ‚F‚±‚ÌŽž“_‚ł́Aref_data‚É‚Íi_buffer‚ÌŽQÆ’l‚ª“ü‚Á‚Ä‚éB ++ synchronized(imc2d){ ++ //ƒLƒƒƒvƒ`ƒƒƒf[ƒ^‚ði2d‚̃oƒbƒtƒ@‚ɃRƒs[‚·‚éBi‚±‚êÈ—ª‚µ‚½‚¢‚È‚ cBj ++ System.arraycopy(ref_buf,0,i2d_buf,0,this.i2d_buf.length); ++ } ++ //‚±‚±‚Åref_buf‚ÌŽQÆ’l‚ðref_buf‚ÖˆÚ“® ++ ref_buf=i2d_buf; ++ } ++ public J3dNyARRaster_RGB(NyARParam i_cparam) ++ { ++ super(i_cparam.getX(),i_cparam.getY()); ++ ++ //RGB‚̃‰ƒXƒ^‚ðì‚éB ++// ColorSpace cs=ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB); ++// ComponentColorModel cm; ++// cm=new ComponentColorModel(cs,new int[]{8,8,8},false,false,ComponentColorModel.OPAQUE,DataBuffer.TYPE_BYTE); ++// java.awt.image.WritableRaster raster=cm.createCompatibleWritableRaster(width,height); ++// i2d_buf=((DataBufferByte)raster.getDataBuffer()).getData(); ++// BufferedImage background_image = new BufferedImage(cm,raster, false, null); ++ BufferedImage background_image = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR); ++ i2d_buf=((DataBufferByte)background_image.getRaster().getDataBuffer()).getData(); ++ // ++ imc2d= new ImageComponent2D(ImageComponent2D.FORMAT_RGB, background_image, true, true); ++ imc2d.setCapability(ImageComponent.ALLOW_IMAGE_WRITE); ++ } ++ /** ++ * ‚±‚̃IƒuƒWƒFƒNƒg‚ƘA“®‚·‚éImageComponent2DƒIƒuƒWƒFƒNƒg‚ÌŽQÆ’l‚𓾂éB ++ * @return ++ */ ++ public ImageComponent2D getImageComponent2D() ++ { ++ return imc2d; ++ } ++} +Index: D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARParam.java +=================================================================== +--- D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARParam.java (revision 0) ++++ D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARParam.java (revision 178) +@@ -0,0 +1,119 @@ ++/** ++ * NyARParam‚ÉOpenGLŒü‚¯ŠÖ”‚ð’ljÁ‚µ‚½‚à‚Ì ++ * (c)2008 AŒÕ—nyatla.jp ++ * airmail(at)ebony.plala.or.jp ++ * http://nyatla.jp/ ++ */ ++package jp.nyatla.nyartoolkit.java3d.utils; ++ ++import jp.nyatla.nyartoolkit.core.*; ++import javax.media.j3d.Transform3D; ++ ++public class J3dNyARParam extends NyARParam ++{ ++ private double view_distance_min=0.01;//1cm`10.0m ++ private double view_distance_max=10.0; ++ private Transform3D m_projection=null; ++ /** ++ * Ž‹‘̐ς̋߂¢•û‚ðƒ[ƒgƒ‹‚ÅŽw’è ++ * @param i_new_value ++ */ ++ public void setViewDistanceMin(double i_new_value) ++ { ++ m_projection=null;//ƒLƒƒƒbƒVƒ…Ï•Ï”‰Šú‰» ++ view_distance_min=i_new_value; ++ } ++ /** ++ * Ž‹‘̐ς̉“‚¢•û‚ðƒ[ƒgƒ‹‚ÅŽw’è ++ * @param i_new_value ++ */ ++ public void setViewDistanceMax(double i_new_value) ++ { ++ m_projection=null;//ƒLƒƒƒbƒVƒ…Ï•Ï”‰Šú‰» ++ view_distance_max=i_new_value; ++ } ++ /** ++ * void arglCameraFrustumRH(const ARParam *cparam, const double focalmin, const double focalmax, GLdouble m_projection[16]) ++ * ŠÖ”‚Ì’u‚«Š·‚¦ ++ * @param focalmin ++ * @param focalmax ++ * @return ++ */ ++ public Transform3D getCameraTransform() ++ { ++ //Šù‚É’l‚ªƒLƒƒƒbƒVƒ…‚³‚ê‚Ä‚¢‚½‚ç‚»‚ê‚ðŽg‚¤ ++ if(m_projection!=null){ ++ return m_projection; ++ } ++ //–³‚¯‚ê‚ÎŒvŽZ ++ ++ NyARMat trans_mat=new NyARMat(3,4); ++ NyARMat icpara_mat=new NyARMat(3,4); ++ double[][] p=new double[3][3], q=new double[4][4]; ++ double width, height; ++ int i, j; ++ ++ width = xsize; ++ height = ysize; ++ ++ decompMat(icpara_mat,trans_mat); ++ ++ double[][] icpara=icpara_mat.getArray(); ++ double[][] trans=trans_mat.getArray(); ++ for (i = 0; i < 4; i++) { ++ icpara[1][i] = (height - 1)*(icpara[2][i]) - icpara[1][i]; ++ } ++ ++ for(i = 0; i < 3; i++) { ++ for(j = 0; j < 3; j++) { ++ p[i][j] = icpara[i][j] / icpara[2][2]; ++ } ++ } ++ //p[0][0],p[1][1]=n ++ //p[0][2],p[1][2]=t+b ++ ++ //Projection‚ÌŒvŽZ ++ q[0][0] = (2.0 * p[0][0] / (width - 1)); ++ q[0][1] = (2.0 * p[0][1] / (width - 1)); ++ q[0][2] = -((2.0 * p[0][2] / (width - 1)) - 1.0); ++ q[0][3] = 0.0; ++ ++ q[1][0] = 0.0; ++ q[1][1] = -(2.0 * p[1][1] / (height - 1)); ++ q[1][2] = -((2.0 * p[1][2] / (height - 1)) - 1.0); ++ q[1][3] = 0.0; ++ ++ q[2][0] = 0.0; ++ q[2][1] = 0.0; ++ q[2][2] = (view_distance_max + view_distance_min)/(view_distance_min - view_distance_max); ++ q[2][3] = 2.0 * view_distance_max * view_distance_min / (view_distance_min - view_distance_max); ++ ++ q[3][0] = 0.0; ++ q[3][1] = 0.0; ++ q[3][2] = -1.0; ++ q[3][3] = 0.0; ++ ++ q[2][2]=q[2][2]*-1; ++ q[2][3]=q[2][3]*-1; ++ ++ double[] tmp_projection=new double[16]; ++ for (i = 0; i < 4; i++) { // Row. ++ // First 3 columns of the current row. ++ for (j = 0; j < 3; j++) { // Column. ++ tmp_projection[i + j*4] =( ++ q[i][0] * trans[0][j] + ++ q[i][1] * trans[1][j] + ++ q[i][2] * trans[2][j]); ++ } ++ // Fourth column of the current row. ++ tmp_projection[i + 3*4]= ++ q[i][0] * trans[0][3] + ++ q[i][1] * trans[1][3] + ++ q[i][2] * trans[2][3] + ++ q[i][3]; ++ } ++ m_projection=new Transform3D(tmp_projection); ++ m_projection.transpose(); ++ return m_projection; ++ } ++} +Index: D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorHolder.java +=================================================================== +--- D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorHolder.java (revision 0) ++++ D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorHolder.java (revision 178) +@@ -0,0 +1,191 @@ ++/** ++ * NyARToolkit‚ÌBehaviorƒzƒ‹ƒ_[ ++ * (c)2008 AŒÕ—nyatla.jp ++ * airmail@ebony.plala.or.jp ++ * http://nyatla.jp/ ++ */ ++package jp.nyatla.nyartoolkit.java3d.utils; ++ ++import java.util.Enumeration; ++ ++import javax.media.Buffer; ++import javax.media.j3d.*; ++import javax.vecmath.*; ++ ++import jp.nyatla.nyartoolkit.core.NyARParam; ++import jp.nyatla.nyartoolkit.detector.NyARSingleDetectMarker; ++import jp.nyatla.nyartoolkit.jmf.*; ++import jp.nyatla.nyartoolkit.jmf.utils.JmfCameraCapture; ++import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureListener; ++import jp.nyatla.nyartoolkit.*; ++import jp.nyatla.nyartoolkit.core.*; ++ ++/** ++ * NyARToolkit‚ƘA“®‚µ‚½Behavior‚ð•Ô‹p‚·‚éƒNƒ‰ƒX‚Å‚·B ++ * ’ñ‹Ÿ‚Å‚«‚éBehavior‚́ABackground‚ÆTransformgroup‚Å‚·B ++ * ++ */ ++public class NyARSingleMarkerBehaviorHolder implements JmfCaptureListener ++{ ++ private NyARParam cparam; ++ private JmfCameraCapture capture; ++ private J3dNyARRaster_RGB nya_raster;//Å‘å3ƒXƒŒƒbƒh‚Å‹¤—L‚³‚ê‚é‚̂ŁA”r‘¼§Œä‚©‚¯‚邱‚ƁB ++ private NyARSingleDetectMarker nya; ++ //Behaviorƒzƒ‹ƒ_ ++ private NyARBehavior nya_behavior; ++ public NyARSingleMarkerBehaviorHolder(NyARParam i_cparam,float i_rate,NyARCode i_ar_code,double i_marker_width) throws NyARException ++ { ++ nya_behavior=null; ++ cparam=i_cparam; ++ capture=new JmfCameraCapture(cparam.getX(),cparam.getY(),i_rate,JmfCameraCapture.PIXEL_FORMAT_RGB); ++ capture.setCaptureListener(this); ++ nya_raster=new J3dNyARRaster_RGB(cparam); ++ nya=new NyARSingleDetectMarker(cparam,i_ar_code,i_marker_width); ++ nya_behavior=new NyARBehavior(nya,nya_raster,i_rate); ++ } ++ public Behavior getBehavior() ++ { ++ return nya_behavior; ++ } ++ /** ++ * i_back_ground‚ɃLƒƒƒvƒ`ƒƒ‰æ‘œ‚ð“]‘—‚·‚é‚悤‚ÉBehavior‚ðÝ’肵‚Ü‚·B ++ * i_back_groung‚ÍALLOW_IMAGE_WRITE‘®«‚ðŽ‚Â‚à‚Ì‚Å‚ ‚é•K—v‚ª‚ ‚è‚Ü‚·B ++ * @param i_back_groung ++ * @return ++ */ ++ public void setBackGround(Background i_back_ground) ++ { ++ //ƒR[ƒ‹æ‚Å”r‘¼§Œä ++ nya_behavior.setRelatedBackGround(i_back_ground); ++ } ++ /** ++ * i_trgroup‚̍À•WŒn‚ðƒ}[ƒJ[‚É‚ ‚킹‚é‚悤‚ÉBehavior‚ðÝ’肵‚Ü‚·B ++ * ++ */ ++ public void setTransformGroup(TransformGroup i_trgroup) ++ { ++ //ƒR[ƒ‹æ‚Å”r‘¼§Œä ++ nya_behavior.setRelatedTransformGroup(i_trgroup); ++ } ++ /** ++ * À•WŒnÄŒvŽZŒã‚ɌĂяo‚³‚ê‚郊ƒXƒi‚Å‚·B ++ * @param i_listener ++ */ ++ public void setUpdateListener(NyARSingleMarkerBehaviorListener i_listener) ++ { ++ //ƒR[ƒ‹æ‚Å”r‘¼§Œä ++ nya_behavior.setUpdateListener(i_listener); ++ } ++ /** ++ * ƒ‰ƒXƒ^‚ðXV ƒR[ƒ‹ƒoƒbƒNŠÖ”‚¾‚©‚çŒÄ‚ñ‚¶‚á‚ç‚ß‚¦ ++ */ ++ public void onUpdateBuffer(Buffer i_buffer) ++ { ++ try{ ++ synchronized(nya_raster){ ++ nya_raster.setBuffer(i_buffer); ++ } ++ }catch(Exception e){ ++ e.printStackTrace(); ++ } ++ } ++ public void start() throws NyARException ++ { ++ //ŠJŽn ++ capture.start(); ++ } ++ public void stop() ++ { ++ capture.stop(); ++ } ++} ++ ++ ++class NyARBehavior extends Behavior ++{ ++ private NyARSingleDetectMarker related_nya; ++ private TransformGroup trgroup; ++ private Background back_ground; ++ private J3dNyARRaster_RGB raster; ++ private WakeupCondition wakeup; ++ private NyARSingleMarkerBehaviorListener listener; ++ public void initialize() ++ { ++ wakeupOn(wakeup); ++ } ++ /** ++ * i_related_ic2d‚Ì“à—e‚Å’èŠú“I‚Éi_back_ground‚ðXV‚·‚éBehavior ++ * @param i_back_ground ++ * @param i_related_ic2d ++ */ ++ public NyARBehavior(NyARSingleDetectMarker i_related_nya,J3dNyARRaster_RGB i_related_raster,float i_rate) ++ { ++ super(); ++ wakeup=new WakeupOnElapsedTime((int)(1000/i_rate)); ++ related_nya=i_related_nya; ++ trgroup =null; ++ raster =i_related_raster; ++ back_ground=null; ++ listener=null; ++ this.setSchedulingBounds(new BoundingSphere(new Point3d(), 100.0)); ++ } ++ public void setRelatedBackGround(Background i_back_ground) ++ { ++ synchronized(raster){ ++ back_ground=i_back_ground; ++ } ++ } ++ public void setRelatedTransformGroup(TransformGroup i_trgroup) ++ { ++ synchronized(raster){ ++ trgroup=i_trgroup; ++ } ++ } ++ public void setUpdateListener(NyARSingleMarkerBehaviorListener i_listener) ++ { ++ synchronized(raster){ ++ listener=i_listener; ++ } ++ } ++ ++ /** ++ * ‚¢‚í‚ä‚éƒCƒxƒ“ƒgƒnƒ“ƒhƒ‰ ++ */ ++ public void processStimulus(Enumeration criteria) ++ { ++ try{ ++ synchronized(raster){ ++ Transform3D t3d=null; ++ boolean is_marker_exist=false; ++ if(back_ground!=null){ ++ back_ground.setImage(raster.getImageComponent2D()); ++ } ++ if(raster.hasData()){ ++ is_marker_exist=related_nya.detectMarkerLite(raster, 100); ++ if(is_marker_exist){ ++ NyARMat nymat=related_nya.getTransmationMatrix(); ++ double[][] src=nymat.getArray(); ++ Matrix4d matrix=new Matrix4d( ++ src[0][0],-src[1][0],-src[2][0],0, ++ -src[0][1], src[1][1], src[2][1],0, ++ -src[0][2], src[1][2], src[2][2],0, ++ -src[0][3], src[1][3], src[2][3],1); ++ matrix.transpose(); ++ t3d=new Transform3D(matrix); ++ if(trgroup!=null){ ++ trgroup.setTransform(t3d); ++ } ++ } ++ } ++ if(listener!=null) ++ { ++ listener.onUpdate(is_marker_exist, t3d); ++ } ++ } ++ wakeupOn(wakeup); ++ }catch(Exception e){ ++ e.printStackTrace(); ++ } ++ } ++} ++ +Index: D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/sample/NyARJava3D.java +=================================================================== +--- D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/sample/NyARJava3D.java (revision 0) ++++ D:/project.files/java.Lab/NyARToolKit/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/sample/NyARJava3D.java (revision 178) +@@ -0,0 +1,148 @@ ++/** ++ * Java3DƒTƒ“ƒvƒ‹ƒvƒƒOƒ‰ƒ€ ++ * ƒVƒ“ƒOƒ‹ƒ}[ƒJ[’ǐ՗p‚ÌBehavior‚ðŽg‚Á‚āA”wŒi‚Æ‚PŒÂ‚̃}[ƒJ[‚ɘA“®‚µ‚½TransformGroup ++ * ‚ð“®‚©‚µ‚Ü‚·B ++ * (c)2008 AŒÕ—nyatla.jp ++ * airmail@ebony.plala.or.jp ++ * http://nyatla.jp/ ++ */ ++package jp.nyatla.nyartoolkit.java3d.sample; ++ ++import java.awt.BorderLayout; ++import javax.media.j3d.*; ++ ++import com.sun.j3d.utils.universe.*; ++import java.awt.*; ++import javax.swing.JFrame; ++import javax.vecmath.*; ++ ++import jp.nyatla.nyartoolkit.core.*; ++import jp.nyatla.nyartoolkit.java3d.utils.*; ++ ++import com.sun.j3d.utils.geometry.ColorCube; ++ ++public class NyARJava3D extends JFrame implements NyARSingleMarkerBehaviorListener ++{ ++ private final String CARCODE_FILE ="../../Data/patt.hiro"; ++ private final String PARAM_FILE ="../../Data/camera_para.dat"; ++ //NyARToolkitŠÖŒW ++ private NyARSingleMarkerBehaviorHolder nya_behavior; ++ private J3dNyARParam ar_param; ++ //universeŠÖŒW ++ private Canvas3D canvas; ++ private Locale locale; ++ private VirtualUniverse universe; ++ public static void main(String[] args) ++ { ++ try{ ++ NyARJava3D frame = new NyARJava3D(); ++ ++ frame.setVisible(true); ++ Insets ins=frame.getInsets(); ++ frame.setSize(320+ins.left+ins.right,240+ins.top+ins.bottom); ++ frame.startCapture(); ++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ++ }catch(Exception e){ ++ e.printStackTrace(); ++ } ++ } ++ public void onUpdate(boolean i_is_marker_exist,Transform3D i_transform3d) ++ { ++ /* ++ * TODO:Please write your behavior operation code here. ++ * ƒ}[ƒJ[‚ÌŽp¨‚ðŒ³‚É‘¼‚Ì‚RDƒIƒuƒWƒFƒNƒg‚𑀍삷‚é‚Æ‚«‚́A‚±‚±‚ɏˆ—‚ð‘‚«‚Ü‚·B*/ ++ ++ } ++ public void startCapture() throws Exception ++ { ++ nya_behavior.start(); ++ } ++ public NyARJava3D() throws Exception ++ { ++ super("Java3D Example NyARToolkit"); ++ ++ //NyARToolkit‚̏€”õ ++ NyARCode ar_code =new NyARCode(16,16); ++ ar_code.loadFromARFile(CARCODE_FILE); ++ ar_param=new J3dNyARParam(); ++ ar_param.loadFromARFile(PARAM_FILE); ++ ar_param.changeSize(320,240); ++ ++ //locale‚̍쐬‚Ælocate‚Æview‚̐ݒè ++ universe = new VirtualUniverse(); ++ locale = new Locale( universe ); ++ canvas=new Canvas3D( SimpleUniverse.getPreferredConfiguration()); ++ View view = new View(); ++ ViewPlatform viewPlatform = new ViewPlatform(); ++ view.attachViewPlatform( viewPlatform ); ++ view.addCanvas3D(canvas); ++ view.setPhysicalBody( new PhysicalBody() ); ++ view.setPhysicalEnvironment( new PhysicalEnvironment()); ++ ++ //Ž‹ŠE‚̐ݒè(ƒJƒƒ‰Ý’è‚©‚çŽæ“¾) ++ Transform3D camera_3d=ar_param.getCameraTransform(); ++ view.setCompatibilityModeEnable(true); ++ view.setProjectionPolicy(View.PERSPECTIVE_PROJECTION); ++ view.setLeftProjection(camera_3d); ++ ++ //Ž‹“_Ý’è(0,0,0‚©‚çAYŽ²‚ð180“x‰ñ“]‚µ‚ÄZ+•ûŒü‚ðŒü‚­‚悤‚É‚·‚éB) ++ TransformGroup viewGroup = new TransformGroup(); ++ Transform3D viewTransform = new Transform3D(); ++ viewTransform.rotY(Math.PI); ++ viewTransform.setTranslation(new Vector3d(0.0,0.0,0.0)); ++ viewGroup.setTransform( viewTransform ); ++ viewGroup.addChild( viewPlatform ); ++ BranchGroup viewRoot = new BranchGroup(); ++ viewRoot.addChild( viewGroup ); ++ locale.addBranchGraph( viewRoot ); ++ ++ ++ //ƒoƒbƒNƒOƒ‰ƒEƒ“ƒh‚̍쐬 ++ Background background =new Background(); ++ BoundingSphere bounds = new BoundingSphere(); ++ bounds.setRadius( 10.0 ); ++ background.setApplicationBounds(bounds); ++ background.setImageScaleMode(Background.SCALE_FIT_ALL); ++ background.setCapability(Background.ALLOW_IMAGE_WRITE); ++ BranchGroup root = new BranchGroup(); ++ root.addChild(background); ++ ++ //TransformGroup‚ň͂Á‚½ƒV[ƒ“ƒOƒ‰ƒt‚̍쐬 ++ TransformGroup transform=new TransformGroup(); ++ transform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); ++ transform.addChild(createSceneGraph()); ++ root.addChild(transform); ++ ++ //NyARToolkit‚ÌBehavior‚ðì‚éB(ƒ}[ƒJ[ƒTƒCƒY‚̓[ƒgƒ‹‚ÅŽw’è‚·‚邱‚Æ) ++ nya_behavior=new NyARSingleMarkerBehaviorHolder(ar_param,30f,ar_code,0.08); ++ //Behavior‚ɘA“®‚·‚éƒOƒ‹[ƒv‚ðƒZƒbƒg ++ nya_behavior.setTransformGroup(transform); ++ nya_behavior.setBackGround(background); ++ ++ //o—ˆ‚½behavior‚ðƒZƒbƒg ++ root.addChild(nya_behavior.getBehavior()); ++ nya_behavior.setUpdateListener(this); ++ ++ //•\Ž¦ƒuƒ‰ƒ“ƒ`‚ðLocate‚ɃZƒbƒg ++ locale.addBranchGraph(root); ++ ++ //ƒEƒCƒ“ƒhƒE‚̐ݒè ++ setLayout(new BorderLayout()); ++ add(canvas,BorderLayout.CENTER); ++ } ++ /** ++ * ƒV[ƒ“ƒOƒ‰ƒt‚ðì‚Á‚āA‚»‚̃m[ƒh‚ð•Ô‚·B ++ * ‚±‚̃m[ƒh‚Í40mm‚̐F‚‚«ƒiƒ^ƒfƒRƒR‚ð•\Ž¦‚·‚éƒV[ƒ“B‚šŽ²‚ðŠî€‚É20mmã‚É•‚‚©‚¹‚Ä‚éB ++ * @return ++ */ ++ private Node createSceneGraph() ++ { ++ TransformGroup tg=new TransformGroup(); ++ Transform3D mt=new Transform3D(); ++ mt.setTranslation(new Vector3d(0.00,0.0,20*0.001)); ++ // ‘å‚«‚³ 40mm‚̐F•t‚«—§•û‘Ì‚ðAZŽ²ã‚Å20mm“®‚©‚µ‚Ä”z’uj ++ tg.setTransform(mt); ++ tg.addChild(new ColorCube(20*0.001)); ++ return tg; ++ } ++} +Index: D:/project.files/java.Lab/NyARToolKit/sample/jogl/JavaSimpleLite.java +=================================================================== +--- D:/project.files/java.Lab/NyARToolKit/sample/jogl/JavaSimpleLite.java (revision 174) ++++ D:/project.files/java.Lab/NyARToolKit/sample/jogl/JavaSimpleLite.java (revision 178) +@@ -1,217 +0,0 @@ +-/** +- * simpleLite‚Æ“¯‚¶‚悤‚ȃeƒXƒgƒvƒƒOƒ‰ƒ€ +- * ƒ}[ƒJ[‚̈ê’v“x‚̍Œá’l‚ðƒ`ƒFƒbƒN‚·‚é‚Æ‚±‚ë‚𔲂¢‚½‚̂ŁA“¯‚¶ƒ}[ƒJ[‚ð‘å—Ê‚É +- * ŒŸo‚·‚é‚Æ–Ê”’‚¢‚±‚Æ‚É‚È‚è‚Ü‚·B +- * (c)2008 R.iizuka +- * airmail(at)ebony.plala.or.jp +- * http://nyatla.jp/ +- */ +-import java.awt.event.WindowAdapter; +-import java.awt.event.WindowEvent; +-import java.awt.*; +- +-import javax.media.Buffer; +- +-import javax.media.opengl.GL; +-import javax.media.opengl.GLAutoDrawable; +-import javax.media.opengl.GLEventListener; +-import javax.media.opengl.GLCanvas; +- +-import com.sun.opengl.util.Animator; +- +-import jp.nyatla.nyartoolkit.core.NyARCode; +- +-import jp.nyatla.nyartoolkit.jmf.JmfCameraCapture; +-import jp.nyatla.nyartoolkit.jmf.JmfCaptureListener; +-import jp.nyatla.nyartoolkit.gutil.*; +- +- +-public class JavaSimpleLite implements GLEventListener,JmfCaptureListener +-{ +- private final String CARCODE_FILE ="../../Data/patt.hiro"; +- private final String PARAM_FILE ="../../Data/camera_para.dat"; +- +- +- private Animator animator; +- private GLNyARRaster_RGB cap_image; +- +- private JmfCameraCapture capture; +- private GL gl; +- //NyARToolkitŠÖŒW +- private GLNyARSingleDetectMarker nya; +- private GLNyARParam ar_param; +- /** +- * —§•û‘Ì‚ð‘‚­ +- * +- */ +- void drawCube() +- { +- // Colour cube data. +- int polyList = 0; +- float fSize = 0.5f; +- int f, i; +- 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} +- }; +- 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} +- }; +- int cube_num_faces = 6; +- 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} +- }; +- +- if (polyList==0) { +- polyList = gl.glGenLists (1); +- gl.glNewList(polyList, GL.GL_COMPILE); +- gl.glBegin(GL.GL_QUADS); +- for (f = 0; f < cube_num_faces; f++) +- for (i = 0; i < 4; i++) { +- 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]); +- 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); +- } +- gl.glEnd(); +- gl.glColor3f(0.0f, 0.0f, 0.0f); +- for (f = 0; f < cube_num_faces; f++) { +- gl.glBegin (GL.GL_LINE_LOOP); +- for (i = 0; i < 4; i++) +- 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); +- gl.glEnd (); +- } +- gl.glEndList (); +- } +- +- gl.glPushMatrix(); // Save world coordinate system. +- gl.glTranslatef(0.0f, 0.0f, 0.5f); // Place base of cube on marker surface. +- gl.glRotatef(0.0f, 0.0f, 0.0f, 1.0f); // Rotate about z axis. +- gl.glDisable(GL.GL_LIGHTING); // Just use colours. +- gl.glCallList(polyList); // Draw the cube. +- gl.glPopMatrix(); // Restore world coordinate system. +- +- } +- +- +- +- public JavaSimpleLite() +- { +- Frame frame = new Frame("Java simpleLite with NyARToolkit"); +- +- +- // 3D‚ð•`‰æ‚·‚éƒRƒ“ƒ|[ƒlƒ“ƒg +- GLCanvas canvas = new GLCanvas(); +- frame.add(canvas); +- canvas.addGLEventListener(this); +- frame.addWindowListener(new WindowAdapter() { +- public void windowClosing(WindowEvent e) { +- System.exit(0); +- } +- }); +- +- frame.setVisible(true); +- Insets ins=frame.getInsets(); +- frame.setSize(320+ins.left+ins.right,240+ins.top+ins.bottom); +- canvas.setBounds(ins.left,ins.top,320,240); +- } +- +- public void init(GLAutoDrawable drawable) { +- gl = drawable.getGL(); +- gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); +- //NyARToolkit‚̏€”õ +- try{ +- //ƒLƒƒƒvƒ`ƒƒ‚̏€”õ +- capture=new JmfCameraCapture(320,240,15f,JmfCameraCapture.PIXEL_FORMAT_RGB); +- capture.setCaptureListener(this); +- //NyARToolkit‚̏€”õ +- ar_param=new GLNyARParam(); +- NyARCode ar_code =new NyARCode(16,16); +- ar_param.loadFromARFile(PARAM_FILE); +- ar_param.changeSize(320,240); +- nya=new GLNyARSingleDetectMarker(ar_param,ar_code,80.0); +- ar_code.loadFromARFile(CARCODE_FILE); +- //GL‘Ήž‚ÌRGBƒ‰ƒXƒ^ƒIƒuƒWƒFƒNƒg +- cap_image=new GLNyARRaster_RGB(gl,ar_param); +- //ƒLƒƒƒvƒ`ƒƒŠJŽn +- capture.start(); +- }catch(Exception e){ +- e.printStackTrace(); +- } +- animator = new Animator(drawable); +- +- animator.start(); +- +- } +- +- public void reshape(GLAutoDrawable drawable, +- int x, int y, +- int width, int height) +- { +- float ratio = (float)height / (float)width; +- gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); +- gl.glViewport(0, 0, width, height); +- +- //Ž‹‘̐ς̐ݒè +- gl.glMatrixMode(GL.GL_PROJECTION); +- gl.glLoadIdentity(); +- gl.glFrustum(-1.0f, 1.0f, -ratio, ratio, +- 5.0f, 40.0f); +- //Œ©‚éˆÊ’u +- gl.glMatrixMode(GL.GL_MODELVIEW); +- gl.glLoadIdentity(); +- gl.glTranslatef(0.0f, 0.0f, -10.0f); +- } +- +- public void display(GLAutoDrawable drawable) +- { +- +- try{ +- if(!cap_image.hasData()){ +- return; +- } +- gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame. +- //‰æ‘œƒ`ƒFƒbƒN‚µ‚ă}[ƒJ[’T‚µ‚āA”wŒi‚ð‘‚­ +- boolean is_marker_exist; +- synchronized(cap_image){ +- is_marker_exist=nya.detectMarkerLite(cap_image,100); +- //”wŒi‚ð‘‚­ +- cap_image.glDispImage(1.0); +- } +- //‚ ‚Á‚½‚ç—§•û‘Ì‚ð‘‚­ +- if(is_marker_exist){ +- // Projection transformation. +- gl.glMatrixMode(GL.GL_PROJECTION); +- gl.glLoadMatrixd(ar_param.getCameraFrustumRH(),0); +- gl.glMatrixMode(GL.GL_MODELVIEW); +- // Viewing transformation. +- gl.glLoadIdentity(); +- gl.glLoadMatrixd(nya.getCameraViewRH(),0); +- +- +- // All other lighting and geometry goes here. +- drawCube(); +- } +- }catch(Exception e){ +- e.printStackTrace(); +- } +- } +- public void onUpdateBuffer(Buffer i_buffer) +- { +- try{ +- synchronized(cap_image){ +- cap_image.setBuffer(i_buffer, true); +- } +- }catch(Exception e){ +- e.printStackTrace(); +- } +- } +- +- public void displayChanged(GLAutoDrawable drawable, +- boolean modeChanged, +- boolean deviceChanged) {} +- +- public static void main(String[] args) { +- new JavaSimpleLite(); +- } +-} +- +Index: D:/project.files/java.Lab/NyARToolKit/sample/jogl/jp/nyatla/nyartoolkit/jogl/utils/GLNyARRaster_RGB.java +=================================================================== +--- D:/project.files/java.Lab/NyARToolKit/sample/jogl/jp/nyatla/nyartoolkit/jogl/utils/GLNyARRaster_RGB.java (revision 0) ++++ D:/project.files/java.Lab/NyARToolKit/sample/jogl/jp/nyatla/nyartoolkit/jogl/utils/GLNyARRaster_RGB.java (revision 178) +@@ -0,0 +1,76 @@ ++/** ++ * NyARRaster_RGB‚ÉOpenGL—p‚̃f[ƒ^•ÏŠ·‹@”\‚ð’ljÁ‚µ‚½‚à‚Ì‚Å‚·B ++ * ++ * (c)2008 AŒÕ—nyatla.jp ++ * airmail(at)ebony.plala.or.jp ++ * http://nyatla.jp/ ++ */ ++package jp.nyatla.nyartoolkit.jogl.utils; ++ ++import javax.media.format.RGBFormat; ++import javax.media.opengl.GL; ++import jp.nyatla.nyartoolkit.NyARException; ++import jp.nyatla.nyartoolkit.jmf.utils.*; ++import jp.nyatla.nyartoolkit.core.*; ++ ++public class GLNyARRaster_RGB extends JmfNyARRaster_RGB ++{ ++ private byte[] gl_buf; ++ private int gl_flag; ++ ++ public GLNyARRaster_RGB(GL i_ref_gl,NyARParam i_param) ++ { ++ super(i_param.getX(),i_param.getY()); ++ this.gl_flag=GL.GL_RGB; ++ this.gl_buf=new byte[this.width*this.height*3]; ++ } ++ public void setBuffer(javax.media.Buffer i_buffer,boolean i_is_reverse) throws NyARException ++ { ++ //JMFƒf[ƒ^‚ŃtƒH[ƒ}ƒbƒgƒvƒƒpƒeƒB‚ð‰Šú‰» ++ initFormatProperty((RGBFormat)i_buffer.getFormat()); ++ ++ byte[] src_buf=(byte[])i_buffer.getData(); ++ //GL—p‚̃f[ƒ^‚ð€”õ ++ if(i_is_reverse){ ++ int length=this.width*3; ++ int src_idx=0; ++ int dest_idx=(this.height-1)*length; ++ for(int i=0;i + + + + + + + + + + + diff --git a/sample/java3d/.project b/sample/java3d/.project new file mode 100644 index 0000000..71300e9 --- /dev/null +++ b/sample/java3d/.project @@ -0,0 +1,17 @@ + + + NyARJava3D + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/sample/NyARJava3D.java b/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/sample/NyARJava3D.java new file mode 100644 index 0000000..3595256 --- /dev/null +++ b/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/sample/NyARJava3D.java @@ -0,0 +1,148 @@ +/** + * Java3Dサンプルプログラム + * シングルマーカー追跡用のBehaviorを使って、背景と1個のマーカーに連動したTransformGroup + * を動かします。 + * (c)2008 A虎@nyatla.jp + * airmail@ebony.plala.or.jp + * http://nyatla.jp/ + */ +package jp.nyatla.nyartoolkit.java3d.sample; + +import java.awt.BorderLayout; +import javax.media.j3d.*; + +import com.sun.j3d.utils.universe.*; +import java.awt.*; +import javax.swing.JFrame; +import javax.vecmath.*; + +import jp.nyatla.nyartoolkit.core.*; +import jp.nyatla.nyartoolkit.java3d.utils.*; + +import com.sun.j3d.utils.geometry.ColorCube; + +public class NyARJava3D extends JFrame implements NyARSingleMarkerBehaviorListener +{ + private final String CARCODE_FILE ="../../Data/patt.hiro"; + private final String PARAM_FILE ="../../Data/camera_para.dat"; + //NyARToolkit関係 + private NyARSingleMarkerBehaviorHolder nya_behavior; + private J3dNyARParam ar_param; + //universe関係 + private Canvas3D canvas; + private Locale locale; + private VirtualUniverse universe; + public static void main(String[] args) + { + try{ + NyARJava3D frame = new NyARJava3D(); + + frame.setVisible(true); + Insets ins=frame.getInsets(); + frame.setSize(320+ins.left+ins.right,240+ins.top+ins.bottom); + frame.startCapture(); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + }catch(Exception e){ + e.printStackTrace(); + } + } + public void onUpdate(boolean i_is_marker_exist,Transform3D i_transform3d) + { + /* + * TODO:Please write your behavior operation code here. + * マーカーの姿勢を元に他の3Dオブジェクトを操作するときは、ここに処理を書きます。*/ + + } + public void startCapture() throws Exception + { + nya_behavior.start(); + } + public NyARJava3D() throws Exception + { + super("Java3D Example NyARToolkit"); + + //NyARToolkitの準備 + NyARCode ar_code =new NyARCode(16,16); + ar_code.loadFromARFile(CARCODE_FILE); + ar_param=new J3dNyARParam(); + ar_param.loadFromARFile(PARAM_FILE); + ar_param.changeSize(320,240); + + //localeの作成とlocateとviewの設定 + universe = new VirtualUniverse(); + locale = new Locale( universe ); + canvas=new Canvas3D( SimpleUniverse.getPreferredConfiguration()); + View view = new View(); + ViewPlatform viewPlatform = new ViewPlatform(); + view.attachViewPlatform( viewPlatform ); + view.addCanvas3D(canvas); + view.setPhysicalBody( new PhysicalBody() ); + view.setPhysicalEnvironment( new PhysicalEnvironment()); + + //視界の設定(カメラ設定から取得) + Transform3D camera_3d=ar_param.getCameraTransform(); + view.setCompatibilityModeEnable(true); + view.setProjectionPolicy(View.PERSPECTIVE_PROJECTION); + view.setLeftProjection(camera_3d); + + //視点設定(0,0,0から、Y軸を180度回転してZ+方向を向くようにする。) + TransformGroup viewGroup = new TransformGroup(); + Transform3D viewTransform = new Transform3D(); + viewTransform.rotY(Math.PI); + viewTransform.setTranslation(new Vector3d(0.0,0.0,0.0)); + viewGroup.setTransform( viewTransform ); + viewGroup.addChild( viewPlatform ); + BranchGroup viewRoot = new BranchGroup(); + viewRoot.addChild( viewGroup ); + locale.addBranchGraph( viewRoot ); + + + //バックグラウンドの作成 + Background background =new Background(); + BoundingSphere bounds = new BoundingSphere(); + bounds.setRadius( 10.0 ); + background.setApplicationBounds(bounds); + background.setImageScaleMode(Background.SCALE_FIT_ALL); + background.setCapability(Background.ALLOW_IMAGE_WRITE); + BranchGroup root = new BranchGroup(); + root.addChild(background); + + //TransformGroupで囲ったシーングラフの作成 + TransformGroup transform=new TransformGroup(); + transform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); + transform.addChild(createSceneGraph()); + root.addChild(transform); + + //NyARToolkitのBehaviorを作る。(マーカーサイズはメートルで指定すること) + nya_behavior=new NyARSingleMarkerBehaviorHolder(ar_param,30f,ar_code,0.08); + //Behaviorに連動するグループをセット + nya_behavior.setTransformGroup(transform); + nya_behavior.setBackGround(background); + + //出来たbehaviorをセット + root.addChild(nya_behavior.getBehavior()); + nya_behavior.setUpdateListener(this); + + //表示ブランチをLocateにセット + locale.addBranchGraph(root); + + //ウインドウの設定 + setLayout(new BorderLayout()); + add(canvas,BorderLayout.CENTER); + } + /** + * シーングラフを作って、そのノードを返す。 + * このノードは40mmの色つきナタデココを表示するシーン。z軸を基準に20mm上に浮かせてる。 + * @return + */ + private Node createSceneGraph() + { + TransformGroup tg=new TransformGroup(); + Transform3D mt=new Transform3D(); + mt.setTranslation(new Vector3d(0.00,0.0,20*0.001)); + // 大きさ 40mmの色付き立方体を、Z軸上で20mm動かして配置) + tg.setTransform(mt); + tg.addChild(new ColorCube(20*0.001)); + return tg; + } +} diff --git a/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARParam.java b/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARParam.java new file mode 100644 index 0000000..420e6d4 --- /dev/null +++ b/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARParam.java @@ -0,0 +1,119 @@ +/** + * NyARParamにOpenGL向け関数を追加したもの + * (c)2008 A虎@nyatla.jp + * airmail(at)ebony.plala.or.jp + * http://nyatla.jp/ + */ +package jp.nyatla.nyartoolkit.java3d.utils; + +import jp.nyatla.nyartoolkit.core.*; +import javax.media.j3d.Transform3D; + +public class J3dNyARParam extends NyARParam +{ + private double view_distance_min=0.01;//1cm~10.0m + private double view_distance_max=10.0; + private Transform3D m_projection=null; + /** + * 視体積の近い方をメートルで指定 + * @param i_new_value + */ + public void setViewDistanceMin(double i_new_value) + { + m_projection=null;//キャッシュ済変数初期化 + view_distance_min=i_new_value; + } + /** + * 視体積の遠い方をメートルで指定 + * @param i_new_value + */ + public void setViewDistanceMax(double i_new_value) + { + m_projection=null;//キャッシュ済変数初期化 + view_distance_max=i_new_value; + } + /** + * void arglCameraFrustumRH(const ARParam *cparam, const double focalmin, const double focalmax, GLdouble m_projection[16]) + * 関数の置き換え + * @param focalmin + * @param focalmax + * @return + */ + public Transform3D getCameraTransform() + { + //既に値がキャッシュされていたらそれを使う + if(m_projection!=null){ + return m_projection; + } + //無ければ計算 + + NyARMat trans_mat=new NyARMat(3,4); + NyARMat icpara_mat=new NyARMat(3,4); + double[][] p=new double[3][3], q=new double[4][4]; + double width, height; + int i, j; + + width = xsize; + height = ysize; + + decompMat(icpara_mat,trans_mat); + + double[][] icpara=icpara_mat.getArray(); + double[][] trans=trans_mat.getArray(); + for (i = 0; i < 4; i++) { + icpara[1][i] = (height - 1)*(icpara[2][i]) - icpara[1][i]; + } + + for(i = 0; i < 3; i++) { + for(j = 0; j < 3; j++) { + p[i][j] = icpara[i][j] / icpara[2][2]; + } + } + //p[0][0],p[1][1]=n + //p[0][2],p[1][2]=t+b + + //Projectionの計算 + q[0][0] = (2.0 * p[0][0] / (width - 1)); + q[0][1] = (2.0 * p[0][1] / (width - 1)); + q[0][2] = -((2.0 * p[0][2] / (width - 1)) - 1.0); + q[0][3] = 0.0; + + q[1][0] = 0.0; + q[1][1] = -(2.0 * p[1][1] / (height - 1)); + q[1][2] = -((2.0 * p[1][2] / (height - 1)) - 1.0); + q[1][3] = 0.0; + + q[2][0] = 0.0; + q[2][1] = 0.0; + q[2][2] = (view_distance_max + view_distance_min)/(view_distance_min - view_distance_max); + q[2][3] = 2.0 * view_distance_max * view_distance_min / (view_distance_min - view_distance_max); + + q[3][0] = 0.0; + q[3][1] = 0.0; + q[3][2] = -1.0; + q[3][3] = 0.0; + + q[2][2]=q[2][2]*-1; + q[2][3]=q[2][3]*-1; + + double[] tmp_projection=new double[16]; + for (i = 0; i < 4; i++) { // Row. + // First 3 columns of the current row. + for (j = 0; j < 3; j++) { // Column. + tmp_projection[i + j*4] =( + q[i][0] * trans[0][j] + + q[i][1] * trans[1][j] + + q[i][2] * trans[2][j]); + } + // Fourth column of the current row. + tmp_projection[i + 3*4]= + q[i][0] * trans[0][3] + + q[i][1] * trans[1][3] + + q[i][2] * trans[2][3] + + q[i][3]; + } + m_projection=new Transform3D(tmp_projection); + m_projection.transpose(); + return m_projection; + } +} diff --git a/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARRaster_RGB.java b/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARRaster_RGB.java new file mode 100644 index 0000000..73d2ba3 --- /dev/null +++ b/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARRaster_RGB.java @@ -0,0 +1,64 @@ +/** + * NyARRaster_RGBにOpenGL向け関数を追加したもの + * (c)2008 A虎@nyatla.jp + * airmail(at)ebony.plala.or.jp + * http://nyatla.jp/ + */ +package jp.nyatla.nyartoolkit.java3d.utils; + +import java.awt.image.*; +import java.awt.color.*; + +import javax.media.j3d.ImageComponent; +import javax.media.j3d.ImageComponent2D; + + + +import jp.nyatla.nyartoolkit.NyARException; +import jp.nyatla.nyartoolkit.core.NyARParam; +import jp.nyatla.nyartoolkit.jmf.utils.*; + + +public class J3dNyARRaster_RGB extends JmfNyARRaster_RGB +{ +// public ImageUpdater updater; + private ImageComponent2D imc2d; + private byte[] i2d_buf; + + public void setBuffer(javax.media.Buffer i_buffer) throws NyARException + { + super.setBuffer(i_buffer); + //メモ:この時点では、ref_dataにはi_bufferの参照値が入ってる。 + synchronized(imc2d){ + //キャプチャデータをi2dのバッファにコピーする。(これ省略したいなあ…。) + System.arraycopy(ref_buf,0,i2d_buf,0,this.i2d_buf.length); + } + //ここでref_bufの参照値をref_bufへ移動 + ref_buf=i2d_buf; + } + public J3dNyARRaster_RGB(NyARParam i_cparam) + { + super(i_cparam.getX(),i_cparam.getY()); + + //RGBのラスタを作る。 +// ColorSpace cs=ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB); +// ComponentColorModel cm; +// cm=new ComponentColorModel(cs,new int[]{8,8,8},false,false,ComponentColorModel.OPAQUE,DataBuffer.TYPE_BYTE); +// java.awt.image.WritableRaster raster=cm.createCompatibleWritableRaster(width,height); +// i2d_buf=((DataBufferByte)raster.getDataBuffer()).getData(); +// BufferedImage background_image = new BufferedImage(cm,raster, false, null); + BufferedImage background_image = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR); + i2d_buf=((DataBufferByte)background_image.getRaster().getDataBuffer()).getData(); + // + imc2d= new ImageComponent2D(ImageComponent2D.FORMAT_RGB, background_image, true, true); + imc2d.setCapability(ImageComponent.ALLOW_IMAGE_WRITE); + } + /** + * このオブジェクトと連動するImageComponent2Dオブジェクトの参照値を得る。 + * @return + */ + public ImageComponent2D getImageComponent2D() + { + return imc2d; + } +} diff --git a/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorHolder.java b/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorHolder.java new file mode 100644 index 0000000..af3fc6f --- /dev/null +++ b/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorHolder.java @@ -0,0 +1,191 @@ +/** + * NyARToolkitのBehaviorホルダー + * (c)2008 A虎@nyatla.jp + * airmail@ebony.plala.or.jp + * http://nyatla.jp/ + */ +package jp.nyatla.nyartoolkit.java3d.utils; + +import java.util.Enumeration; + +import javax.media.Buffer; +import javax.media.j3d.*; +import javax.vecmath.*; + +import jp.nyatla.nyartoolkit.core.NyARParam; +import jp.nyatla.nyartoolkit.detector.NyARSingleDetectMarker; +import jp.nyatla.nyartoolkit.jmf.*; +import jp.nyatla.nyartoolkit.jmf.utils.JmfCameraCapture; +import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureListener; +import jp.nyatla.nyartoolkit.*; +import jp.nyatla.nyartoolkit.core.*; + +/** + * NyARToolkitと連動したBehaviorを返却するクラスです。 + * 提供できるBehaviorは、BackgroundとTransformgroupです。 + * + */ +public class NyARSingleMarkerBehaviorHolder implements JmfCaptureListener +{ + private NyARParam cparam; + private JmfCameraCapture capture; + private J3dNyARRaster_RGB nya_raster;//最大3スレッドで共有されるので、排他制御かけること。 + private NyARSingleDetectMarker nya; + //Behaviorホルダ + private NyARBehavior nya_behavior; + public NyARSingleMarkerBehaviorHolder(NyARParam i_cparam,float i_rate,NyARCode i_ar_code,double i_marker_width) throws NyARException + { + nya_behavior=null; + cparam=i_cparam; + capture=new JmfCameraCapture(cparam.getX(),cparam.getY(),i_rate,JmfCameraCapture.PIXEL_FORMAT_RGB); + capture.setCaptureListener(this); + nya_raster=new J3dNyARRaster_RGB(cparam); + nya=new NyARSingleDetectMarker(cparam,i_ar_code,i_marker_width); + nya_behavior=new NyARBehavior(nya,nya_raster,i_rate); + } + public Behavior getBehavior() + { + return nya_behavior; + } + /** + * i_back_groundにキャプチャ画像を転送するようにBehaviorを設定します。 + * i_back_groungはALLOW_IMAGE_WRITE属性を持つものである必要があります。 + * @param i_back_groung + * @return + */ + public void setBackGround(Background i_back_ground) + { + //コール先で排他制御 + nya_behavior.setRelatedBackGround(i_back_ground); + } + /** + * i_trgroupの座標系をマーカーにあわせるようにBehaviorを設定します。 + * + */ + public void setTransformGroup(TransformGroup i_trgroup) + { + //コール先で排他制御 + nya_behavior.setRelatedTransformGroup(i_trgroup); + } + /** + * 座標系再計算後に呼び出されるリスナです。 + * @param i_listener + */ + public void setUpdateListener(NyARSingleMarkerBehaviorListener i_listener) + { + //コール先で排他制御 + nya_behavior.setUpdateListener(i_listener); + } + /** + * ラスタを更新 コールバック関数だから呼んじゃらめえ + */ + public void onUpdateBuffer(Buffer i_buffer) + { + try{ + synchronized(nya_raster){ + nya_raster.setBuffer(i_buffer); + } + }catch(Exception e){ + e.printStackTrace(); + } + } + public void start() throws NyARException + { + //開始 + capture.start(); + } + public void stop() + { + capture.stop(); + } +} + + +class NyARBehavior extends Behavior +{ + private NyARSingleDetectMarker related_nya; + private TransformGroup trgroup; + private Background back_ground; + private J3dNyARRaster_RGB raster; + private WakeupCondition wakeup; + private NyARSingleMarkerBehaviorListener listener; + public void initialize() + { + wakeupOn(wakeup); + } + /** + * i_related_ic2dの内容で定期的にi_back_groundを更新するBehavior + * @param i_back_ground + * @param i_related_ic2d + */ + public NyARBehavior(NyARSingleDetectMarker i_related_nya,J3dNyARRaster_RGB i_related_raster,float i_rate) + { + super(); + wakeup=new WakeupOnElapsedTime((int)(1000/i_rate)); + related_nya=i_related_nya; + trgroup =null; + raster =i_related_raster; + back_ground=null; + listener=null; + this.setSchedulingBounds(new BoundingSphere(new Point3d(), 100.0)); + } + public void setRelatedBackGround(Background i_back_ground) + { + synchronized(raster){ + back_ground=i_back_ground; + } + } + public void setRelatedTransformGroup(TransformGroup i_trgroup) + { + synchronized(raster){ + trgroup=i_trgroup; + } + } + public void setUpdateListener(NyARSingleMarkerBehaviorListener i_listener) + { + synchronized(raster){ + listener=i_listener; + } + } + + /** + * いわゆるイベントハンドラ + */ + public void processStimulus(Enumeration criteria) + { + try{ + synchronized(raster){ + Transform3D t3d=null; + boolean is_marker_exist=false; + if(back_ground!=null){ + back_ground.setImage(raster.getImageComponent2D()); + } + if(raster.hasData()){ + is_marker_exist=related_nya.detectMarkerLite(raster, 100); + if(is_marker_exist){ + NyARMat nymat=related_nya.getTransmationMatrix(); + double[][] src=nymat.getArray(); + Matrix4d matrix=new Matrix4d( + src[0][0],-src[1][0],-src[2][0],0, + -src[0][1], src[1][1], src[2][1],0, + -src[0][2], src[1][2], src[2][2],0, + -src[0][3], src[1][3], src[2][3],1); + matrix.transpose(); + t3d=new Transform3D(matrix); + if(trgroup!=null){ + trgroup.setTransform(t3d); + } + } + } + if(listener!=null) + { + listener.onUpdate(is_marker_exist, t3d); + } + } + wakeupOn(wakeup); + }catch(Exception e){ + e.printStackTrace(); + } + } +} + diff --git a/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorListener.java b/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorListener.java new file mode 100644 index 0000000..60bbc29 --- /dev/null +++ b/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorListener.java @@ -0,0 +1,24 @@ +/** + * NyARToolkitのBehaviorのリスナ + * (c)2008 A虎@nyatla.jp + * airmail@ebony.plala.or.jp + * http://nyatla.jp/ + */ +package jp.nyatla.nyartoolkit.java3d.utils; + +import javax.media.j3d.*; + +public interface NyARSingleMarkerBehaviorListener +{ + /** + * このリスナは、リスナにマーカーに連動してオブジェクトを操作するチャンスを与えます。 + * リスナはNyARSingleMarkerBehavior関数内のprocessStimulus関数から呼び出されます。 + * + * @param i_is_marker_exist + * マーカーが存在する場合true、存在しない場合、falseです。 + * @param i_transform3d + * マーカーが存在する場合、その変換行列が指定されます。 + * i_is_marker_existがtrueの時だけ有効です。 + */ + public void onUpdate(boolean i_is_marker_exist,Transform3D i_transform3d); +} -- 2.11.0