2 * NyARToolkitのBehaviorホルダー
\r
3 * (c)2008 A虎@nyatla.jp
\r
4 * airmail@ebony.plala.or.jp
\r
7 package jp.nyatla.nyartoolkit.java3d.utils;
\r
9 import java.util.Enumeration;
\r
11 import javax.media.Buffer;
\r
12 import javax.media.j3d.*;
\r
13 import javax.vecmath.*;
\r
15 import jp.nyatla.nyartoolkit.core.NyARParam;
\r
16 import jp.nyatla.nyartoolkit.detector.NyARSingleDetectMarker;
\r
17 import jp.nyatla.nyartoolkit.jmf.*;
\r
18 import jp.nyatla.nyartoolkit.jmf.utils.JmfCameraCapture;
\r
19 import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureListener;
\r
20 import jp.nyatla.nyartoolkit.*;
\r
21 import jp.nyatla.nyartoolkit.core.*;
\r
24 * NyARToolkitと連動したBehaviorを返却するクラスです。
\r
25 * 提供できるBehaviorは、BackgroundとTransformgroupです。
\r
28 public class NyARSingleMarkerBehaviorHolder implements JmfCaptureListener
\r
30 private NyARParam cparam;
\r
31 private JmfCameraCapture capture;
\r
32 private J3dNyARRaster_RGB nya_raster;//最大3スレッドで共有されるので、排他制御かけること。
\r
33 private NyARSingleDetectMarker nya;
\r
35 private NyARBehavior nya_behavior;
\r
36 public NyARSingleMarkerBehaviorHolder(NyARParam i_cparam,float i_rate,NyARCode i_ar_code,double i_marker_width) throws NyARException
\r
40 capture=new JmfCameraCapture(cparam.getX(),cparam.getY(),i_rate,JmfCameraCapture.PIXEL_FORMAT_RGB);
\r
41 capture.setCaptureListener(this);
\r
42 nya_raster=new J3dNyARRaster_RGB(cparam);
\r
43 nya=new NyARSingleDetectMarker(cparam,i_ar_code,i_marker_width);
\r
44 nya_behavior=new NyARBehavior(nya,nya_raster,i_rate);
\r
46 public Behavior getBehavior()
\r
48 return nya_behavior;
\r
51 * i_back_groundにキャプチャ画像を転送するようにBehaviorを設定します。
\r
52 * i_back_groungはALLOW_IMAGE_WRITE属性を持つものである必要があります。
\r
53 * @param i_back_groung
\r
56 public void setBackGround(Background i_back_ground)
\r
59 nya_behavior.setRelatedBackGround(i_back_ground);
\r
62 * i_trgroupの座標系をマーカーにあわせるようにBehaviorを設定します。
\r
65 public void setTransformGroup(TransformGroup i_trgroup)
\r
68 nya_behavior.setRelatedTransformGroup(i_trgroup);
\r
71 * 座標系再計算後に呼び出されるリスナです。
\r
74 public void setUpdateListener(NyARSingleMarkerBehaviorListener i_listener)
\r
77 nya_behavior.setUpdateListener(i_listener);
\r
80 * ラスタを更新 コールバック関数だから呼んじゃらめえ
\r
82 public void onUpdateBuffer(Buffer i_buffer)
\r
85 synchronized(nya_raster){
\r
86 nya_raster.setBuffer(i_buffer);
\r
88 }catch(Exception e){
\r
89 e.printStackTrace();
\r
92 public void start() throws NyARException
\r
104 class NyARBehavior extends Behavior
\r
106 private NyARSingleDetectMarker related_nya;
\r
107 private TransformGroup trgroup;
\r
108 private Background back_ground;
\r
109 private J3dNyARRaster_RGB raster;
\r
110 private WakeupCondition wakeup;
\r
111 private NyARSingleMarkerBehaviorListener listener;
\r
112 public void initialize()
\r
117 * i_related_ic2dの内容で定期的にi_back_groundを更新するBehavior
\r
118 * @param i_back_ground
\r
119 * @param i_related_ic2d
\r
121 public NyARBehavior(NyARSingleDetectMarker i_related_nya,J3dNyARRaster_RGB i_related_raster,float i_rate)
\r
124 wakeup=new WakeupOnElapsedTime((int)(1000/i_rate));
\r
125 related_nya=i_related_nya;
\r
127 raster =i_related_raster;
\r
130 this.setSchedulingBounds(new BoundingSphere(new Point3d(), 100.0));
\r
132 public void setRelatedBackGround(Background i_back_ground)
\r
134 synchronized(raster){
\r
135 back_ground=i_back_ground;
\r
138 public void setRelatedTransformGroup(TransformGroup i_trgroup)
\r
140 synchronized(raster){
\r
144 public void setUpdateListener(NyARSingleMarkerBehaviorListener i_listener)
\r
146 synchronized(raster){
\r
147 listener=i_listener;
\r
154 public void processStimulus(Enumeration criteria)
\r
157 synchronized(raster){
\r
158 Transform3D t3d=null;
\r
159 boolean is_marker_exist=false;
\r
160 if(back_ground!=null){
\r
161 back_ground.setImage(raster.getImageComponent2D());
\r
163 if(raster.hasData()){
\r
164 is_marker_exist=related_nya.detectMarkerLite(raster, 100);
\r
165 if(is_marker_exist){
\r
166 NyARMat nymat=related_nya.getTransmationMatrix();
\r
167 double[][] src=nymat.getArray();
\r
168 Matrix4d matrix=new Matrix4d(
\r
169 src[0][0],-src[1][0],-src[2][0],0,
\r
170 -src[0][1], src[1][1], src[2][1],0,
\r
171 -src[0][2], src[1][2], src[2][2],0,
\r
172 -src[0][3], src[1][3], src[2][3],1);
\r
173 matrix.transpose();
\r
174 t3d=new Transform3D(matrix);
\r
176 trgroup.setTransform(t3d);
\r
182 listener.onUpdate(is_marker_exist, t3d);
\r
186 }catch(Exception e){
\r
187 e.printStackTrace();
\r