OSDN Git Service

Copied remotely
[nyartoolkit-and/nyartoolkit-and.git] / trunk / sample / java3d / src / jp / nyatla / nyartoolkit / java3d / utils / NyARSingleMarkerBehaviorHolder.java
1 /**\r
2  * NyARToolkitのBehaviorホルダー\r
3  * (c)2008 A虎@nyatla.jp\r
4  * airmail@ebony.plala.or.jp\r
5  * http://nyatla.jp/\r
6  */\r
7 package jp.nyatla.nyartoolkit.java3d.utils;\r
8 \r
9 import java.util.Enumeration;\r
10 \r
11 import javax.media.Buffer;\r
12 import javax.media.j3d.*;\r
13 import javax.vecmath.*;\r
14 \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
23 \r
24 /**\r
25  * NyARToolkitと連動したBehaviorを返却するクラスです。\r
26  * 提供できるBehaviorは、BackgroundとTransformgroupです。\r
27  *\r
28  */\r
29 public class NyARSingleMarkerBehaviorHolder implements JmfCaptureListener\r
30 {\r
31     private NyARParam cparam;\r
32     private JmfCameraCapture capture;\r
33     private J3dNyARRaster_RGB nya_raster;//最大3スレッドで共有されるので、排他制御かけること。\r
34     private NyARSingleDetectMarker nya;\r
35     //Behaviorホルダ\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
38     {\r
39         nya_behavior=null;\r
40         cparam=i_cparam;\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
46     }\r
47     public Behavior getBehavior()\r
48     {\r
49         return nya_behavior;\r
50     }\r
51     /**\r
52      * i_back_groundにキャプチャ画像を転送するようにBehaviorを設定します。\r
53      * i_back_groungはALLOW_IMAGE_WRITE属性を持つものである必要があります。\r
54      * @param i_back_groung\r
55      * @return\r
56      */\r
57     public void setBackGround(Background i_back_ground)\r
58     {\r
59         //コール先で排他制御\r
60         nya_behavior.setRelatedBackGround(i_back_ground);\r
61     }\r
62     /**\r
63      * i_trgroupの座標系をマーカーにあわせるようにBehaviorを設定します。\r
64      *\r
65      */\r
66     public void setTransformGroup(TransformGroup i_trgroup)\r
67     {\r
68         //コール先で排他制御\r
69         nya_behavior.setRelatedTransformGroup(i_trgroup);\r
70     }\r
71     /**\r
72      * 座標系再計算後に呼び出されるリスナです。\r
73      * @param i_listener\r
74      */\r
75     public void setUpdateListener(NyARSingleMarkerBehaviorListener i_listener)\r
76     {\r
77         //コール先で排他制御\r
78         nya_behavior.setUpdateListener(i_listener);\r
79     }\r
80     /**\r
81      * ラスタを更新 コールバック関数だから呼んじゃらめえ\r
82      */\r
83     public void onUpdateBuffer(Buffer i_buffer)\r
84     {\r
85         try{\r
86             synchronized(nya_raster){\r
87                 nya_raster.setBuffer(i_buffer);\r
88             }\r
89         }catch(Exception e){\r
90             e.printStackTrace();\r
91         }\r
92     }\r
93     public void start() throws NyARException\r
94     {\r
95         //開始\r
96         capture.start();\r
97     }\r
98     public void stop()\r
99     {\r
100         capture.stop();\r
101     }\r
102 }\r
103 \r
104 \r
105 class NyARBehavior extends Behavior\r
106 {\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
115     {\r
116         wakeupOn(wakeup);\r
117     }\r
118     /**\r
119      * i_related_ic2dの内容で定期的にi_back_groundを更新するBehavior\r
120      * @param i_back_ground\r
121      * @param i_related_ic2d\r
122      */\r
123     public NyARBehavior(NyARSingleDetectMarker i_related_nya,J3dNyARRaster_RGB i_related_raster,float i_rate)\r
124     {\r
125         super();\r
126         wakeup=new WakeupOnElapsedTime((int)(1000/i_rate));\r
127         related_nya=i_related_nya;\r
128         trgroup    =null;\r
129         raster     =i_related_raster;\r
130         back_ground=null;\r
131         listener=null;\r
132         this.setSchedulingBounds(new BoundingSphere(new Point3d(), 100.0));\r
133    }\r
134     public void setRelatedBackGround(Background i_back_ground)\r
135     {\r
136         synchronized(raster){\r
137             back_ground=i_back_ground;\r
138         }\r
139     }\r
140     public void setRelatedTransformGroup(TransformGroup i_trgroup)\r
141     {\r
142         synchronized(raster){\r
143             trgroup=i_trgroup;\r
144         }       \r
145     }\r
146     public void setUpdateListener(NyARSingleMarkerBehaviorListener i_listener)\r
147     {\r
148         synchronized(raster){\r
149             listener=i_listener;\r
150         }\r
151     }\r
152     /**\r
153      * いわゆるイベントハンドラ\r
154      */\r
155     public void processStimulus(Enumeration criteria)\r
156     {\r
157         try{\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
164                 }\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
177                         if(trgroup!=null){\r
178                             trgroup.setTransform(t3d);\r
179                         }\r
180                     }\r
181                 }\r
182                 if(listener!=null)\r
183                 {\r
184                     listener.onUpdate(is_marker_exist, t3d);\r
185                 }\r
186             }\r
187             wakeupOn(wakeup);            \r
188         }catch(Exception e){\r
189             e.printStackTrace();\r
190         }\r
191     }\r
192 }\r
193 \r