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.core.NyARTransMatResult;
\r
17 import jp.nyatla.nyartoolkit.detector.NyARSingleDetectMarker;
\r
18 import jp.nyatla.nyartoolkit.jmf.*;
\r
19 import jp.nyatla.nyartoolkit.jmf.utils.JmfCameraCapture;
\r
20 import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureListener;
\r
21 import jp.nyatla.nyartoolkit.*;
\r
22 import jp.nyatla.nyartoolkit.core.*;
\r
25 * NyARToolkitと連動したBehaviorを返却するクラスです。
\r
26 * 提供できるBehaviorは、BackgroundとTransformgroupです。
\r
29 public class NyARSingleMarkerBehaviorHolder implements JmfCaptureListener
\r
31 private NyARParam cparam;
\r
32 private JmfCameraCapture capture;
\r
33 private J3dNyARRaster_RGB nya_raster;//最大3スレッドで共有されるので、排他制御かけること。
\r
34 private NyARSingleDetectMarker nya;
\r
36 private NyARBehavior nya_behavior;
\r
37 public NyARSingleMarkerBehaviorHolder(NyARParam i_cparam,float i_rate,NyARCode i_ar_code,double i_marker_width) throws NyARException
\r
41 capture=new JmfCameraCapture(cparam.getX(),cparam.getY(),i_rate,JmfCameraCapture.PIXEL_FORMAT_RGB);
\r
42 capture.setCaptureListener(this);
\r
43 nya_raster=new J3dNyARRaster_RGB(cparam);
\r
44 nya=new NyARSingleDetectMarker(cparam,i_ar_code,i_marker_width);
\r
45 nya_behavior=new NyARBehavior(nya,nya_raster,i_rate);
\r
47 public Behavior getBehavior()
\r
49 return nya_behavior;
\r
52 * i_back_groundにキャプチャ画像を転送するようにBehaviorを設定します。
\r
53 * i_back_groungはALLOW_IMAGE_WRITE属性を持つものである必要があります。
\r
54 * @param i_back_groung
\r
57 public void setBackGround(Background i_back_ground)
\r
60 nya_behavior.setRelatedBackGround(i_back_ground);
\r
63 * i_trgroupの座標系をマーカーにあわせるようにBehaviorを設定します。
\r
66 public void setTransformGroup(TransformGroup i_trgroup)
\r
69 nya_behavior.setRelatedTransformGroup(i_trgroup);
\r
72 * 座標系再計算後に呼び出されるリスナです。
\r
75 public void setUpdateListener(NyARSingleMarkerBehaviorListener i_listener)
\r
78 nya_behavior.setUpdateListener(i_listener);
\r
81 * ラスタを更新 コールバック関数だから呼んじゃらめえ
\r
83 public void onUpdateBuffer(Buffer i_buffer)
\r
86 synchronized(nya_raster){
\r
87 nya_raster.setBuffer(i_buffer);
\r
89 }catch(Exception e){
\r
90 e.printStackTrace();
\r
93 public void start() throws NyARException
\r
105 class NyARBehavior extends Behavior
\r
107 private NyARTransMatResult trans_mat_result=new NyARTransMatResult();
\r
108 private NyARSingleDetectMarker related_nya;
\r
109 private TransformGroup trgroup;
\r
110 private Background back_ground;
\r
111 private J3dNyARRaster_RGB raster;
\r
112 private WakeupCondition wakeup;
\r
113 private NyARSingleMarkerBehaviorListener listener;
\r
114 public void initialize()
\r
119 * i_related_ic2dの内容で定期的にi_back_groundを更新するBehavior
\r
120 * @param i_back_ground
\r
121 * @param i_related_ic2d
\r
123 public NyARBehavior(NyARSingleDetectMarker i_related_nya,J3dNyARRaster_RGB i_related_raster,float i_rate)
\r
126 wakeup=new WakeupOnElapsedTime((int)(1000/i_rate));
\r
127 related_nya=i_related_nya;
\r
129 raster =i_related_raster;
\r
132 this.setSchedulingBounds(new BoundingSphere(new Point3d(), 100.0));
\r
134 public void setRelatedBackGround(Background i_back_ground)
\r
136 synchronized(raster){
\r
137 back_ground=i_back_ground;
\r
140 public void setRelatedTransformGroup(TransformGroup i_trgroup)
\r
142 synchronized(raster){
\r
146 public void setUpdateListener(NyARSingleMarkerBehaviorListener i_listener)
\r
148 synchronized(raster){
\r
149 listener=i_listener;
\r
155 public void processStimulus(Enumeration criteria)
\r
158 synchronized(raster){
\r
159 Transform3D t3d=null;
\r
160 boolean is_marker_exist=false;
\r
161 if(back_ground!=null){
\r
162 raster.renewImageComponent2D();/*DirectXモードのときの対策*/
\r
163 back_ground.setImage(raster.getImageComponent2D());
\r
165 if(raster.hasData()){
\r
166 is_marker_exist=related_nya.detectMarkerLite(raster, 100);
\r
167 if(is_marker_exist){
\r
168 related_nya.getTransmationMatrix(this.trans_mat_result);
\r
169 double[][] src=this.trans_mat_result.getArray();
\r
170 Matrix4d matrix=new Matrix4d(
\r
171 src[0][0],-src[1][0],-src[2][0],0,
\r
172 -src[0][1], src[1][1], src[2][1],0,
\r
173 -src[0][2], src[1][2], src[2][2],0,
\r
174 -src[0][3], src[1][3], src[2][3],1);
\r
175 matrix.transpose();
\r
176 t3d=new Transform3D(matrix);
\r
178 trgroup.setTransform(t3d);
\r
184 listener.onUpdate(is_marker_exist, t3d);
\r
188 }catch(Exception e){
\r
189 e.printStackTrace();
\r