OSDN Git Service

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