2 * PROJECT: NyARToolkit Java3D utilities.
\r
3 * --------------------------------------------------------------------------------
\r
5 * Copyright (c) 2008 nyatla
\r
6 * airmail(at)ebony.plala.or.jp
\r
7 * http://nyatla.jp/nyartoolkit/
\r
9 * Permission is hereby granted, free of charge, to any person obtaining a copy
\r
10 * of this software and associated documentation files (the "Software"), to deal
\r
11 * in the Software without restriction, including without limitation the rights
\r
12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
\r
13 * copies of the Software, and to permit persons to whom the Software is
\r
14 * furnished to do so, subject to the following conditions:
\r
15 * The above copyright notice and this permission notice shall be included in
\r
16 * all copies or substantial portions of the Software.
\r
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
\r
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
\r
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
\r
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
\r
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
\r
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
\r
27 package jp.nyatla.nyartoolkit.java3d.utils;
\r
29 import java.util.Enumeration;
\r
31 import javax.media.Buffer;
\r
32 import javax.media.j3d.*;
\r
33 import javax.vecmath.*;
\r
35 import jp.nyatla.nyartoolkit.NyARException;
\r
36 import jp.nyatla.nyartoolkit.jmf.utils.JmfCameraCapture;
\r
37 import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureListener;
\r
38 import jp.nyatla.nyartoolkit.core.*;
\r
39 import jp.nyatla.nyartoolkit.core.param.NyARParam;
\r
40 import jp.nyatla.nyartoolkit.core.transmat.NyARTransMatResult;
\r
41 import jp.nyatla.nyartoolkit.detector.*;
\r
42 import jp.nyatla.nyartoolkit.core.types.*;
\r
45 * NyARToolkitと連動したBehaviorを返却するクラスです。
\r
46 * 提供できるBehaviorは、BackgroundとTransformgroupです。
\r
49 public class NyARSingleMarkerBehaviorHolder implements JmfCaptureListener
\r
51 private NyARParam cparam;
\r
53 private JmfCameraCapture capture;
\r
55 private J3dNyARRaster_RGB nya_raster;//最大3スレッドで共有されるので、排他制御かけること。
\r
57 private NyARSingleDetectMarker nya;
\r
60 private NyARBehavior nya_behavior;
\r
62 public NyARSingleMarkerBehaviorHolder(NyARParam i_cparam, float i_rate, NyARCode i_ar_code, double i_marker_width) throws NyARException
\r
64 nya_behavior = null;
\r
65 final NyARIntSize scr_size = i_cparam.getScreenSize();
\r
67 capture = new JmfCameraCapture(scr_size.w, scr_size.h, i_rate, JmfCameraCapture.PIXEL_FORMAT_RGB);
\r
68 capture.setCaptureListener(this);
\r
69 nya_raster = new J3dNyARRaster_RGB(cparam);
\r
70 nya = new NyARSingleDetectMarker(cparam, i_ar_code, i_marker_width);
\r
71 nya_behavior = new NyARBehavior(nya, nya_raster, i_rate);
\r
74 public Behavior getBehavior()
\r
76 return nya_behavior;
\r
80 * i_back_groundにキャプチャ画像を転送するようにBehaviorを設定します。
\r
81 * i_back_groungはALLOW_IMAGE_WRITE属性を持つものである必要があります。
\r
82 * @param i_back_groung
\r
85 public void setBackGround(Background i_back_ground)
\r
88 nya_behavior.setRelatedBackGround(i_back_ground);
\r
92 * i_trgroupの座標系をマーカーにあわせるようにBehaviorを設定します。
\r
95 public void setTransformGroup(TransformGroup i_trgroup)
\r
98 nya_behavior.setRelatedTransformGroup(i_trgroup);
\r
102 * 座標系再計算後に呼び出されるリスナです。
\r
103 * @param i_listener
\r
105 public void setUpdateListener(NyARSingleMarkerBehaviorListener i_listener)
\r
108 nya_behavior.setUpdateListener(i_listener);
\r
112 * ラスタを更新 コールバック関数だから呼んじゃらめえ
\r
114 public void onUpdateBuffer(Buffer i_buffer)
\r
117 synchronized (nya_raster) {
\r
118 nya_raster.setBuffer(i_buffer);
\r
120 } catch (Exception e) {
\r
121 e.printStackTrace();
\r
125 public void start() throws NyARException
\r
137 class NyARBehavior extends Behavior
\r
139 private NyARTransMatResult trans_mat_result = new NyARTransMatResult();
\r
141 private NyARSingleDetectMarker related_nya;
\r
143 private TransformGroup trgroup;
\r
145 private Background back_ground;
\r
147 private J3dNyARRaster_RGB raster;
\r
149 private WakeupCondition wakeup;
\r
151 private NyARSingleMarkerBehaviorListener listener;
\r
153 public void initialize()
\r
159 * i_related_ic2dの内容で定期的にi_back_groundを更新するBehavior
\r
160 * @param i_back_ground
\r
161 * @param i_related_ic2d
\r
163 public NyARBehavior(NyARSingleDetectMarker i_related_nya, J3dNyARRaster_RGB i_related_raster, float i_rate)
\r
166 wakeup = new WakeupOnElapsedTime((int) (1000 / i_rate));
\r
167 related_nya = i_related_nya;
\r
169 raster = i_related_raster;
\r
170 back_ground = null;
\r
172 this.setSchedulingBounds(new BoundingSphere(new Point3d(), 100.0));
\r
175 public void setRelatedBackGround(Background i_back_ground)
\r
177 synchronized (raster) {
\r
178 back_ground = i_back_ground;
\r
182 public void setRelatedTransformGroup(TransformGroup i_trgroup)
\r
184 synchronized (raster) {
\r
185 trgroup = i_trgroup;
\r
189 public void setUpdateListener(NyARSingleMarkerBehaviorListener i_listener)
\r
191 synchronized (raster) {
\r
192 listener = i_listener;
\r
199 public void processStimulus(Enumeration criteria)
\r
202 synchronized (raster) {
\r
203 Transform3D t3d = null;
\r
204 boolean is_marker_exist = false;
\r
205 if (back_ground != null) {
\r
206 raster.renewImageComponent2D();/*DirectXモードのときの対策*/
\r
207 back_ground.setImage(raster.getImageComponent2D());
\r
209 if (raster.hasData()) {
\r
210 is_marker_exist = related_nya.detectMarkerLite(raster, 100);
\r
211 if (is_marker_exist)
\r
213 final NyARTransMatResult src = this.trans_mat_result;
\r
214 related_nya.getTransmationMatrix(src);
\r
215 Matrix4d matrix = new Matrix4d(src.m00, -src.m10, -src.m20, 0, -src.m01, src.m11, src.m21, 0, -src.m02, src.m12, src.m22, 0, -src.m03, src.m13, src.m23, 1);
\r
216 matrix.transpose();
\r
217 t3d = new Transform3D(matrix);
\r
218 if (trgroup != null) {
\r
219 trgroup.setTransform(t3d);
\r
223 if (listener != null) {
\r
224 listener.onUpdate(is_marker_exist, t3d);
\r
228 } catch (Exception e) {
\r
229 e.printStackTrace();
\r