3 * シングルマーカー追跡用のBehaviorを使って、背景と1個のマーカーに連動したTransformGroup
\r
5 * (c)2008 A虎@nyatla.jp
\r
6 * airmail@ebony.plala.or.jp
\r
9 package jp.nyatla.nyartoolkit.java3d.sample;
\r
11 import java.awt.BorderLayout;
\r
12 import javax.media.j3d.*;
\r
14 import com.sun.j3d.utils.universe.*;
\r
16 import javax.swing.JFrame;
\r
17 import javax.vecmath.*;
\r
19 import jp.nyatla.nyartoolkit.core.*;
\r
20 import jp.nyatla.nyartoolkit.java3d.utils.*;
\r
22 import com.sun.j3d.utils.geometry.ColorCube;
\r
24 public class NyARJava3D extends JFrame implements NyARSingleMarkerBehaviorListener
\r
26 private final String CARCODE_FILE ="../../Data/patt.hiro";
\r
27 private final String PARAM_FILE ="../../Data/camera_para.dat";
\r
29 private NyARSingleMarkerBehaviorHolder nya_behavior;
\r
30 private J3dNyARParam ar_param;
\r
32 private Canvas3D canvas;
\r
33 private Locale locale;
\r
34 private VirtualUniverse universe;
\r
35 public static void main(String[] args)
\r
38 NyARJava3D frame = new NyARJava3D();
\r
40 frame.setVisible(true);
\r
41 Insets ins=frame.getInsets();
\r
42 frame.setSize(320+ins.left+ins.right,240+ins.top+ins.bottom);
\r
43 frame.startCapture();
\r
44 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
\r
45 }catch(Exception e){
\r
46 e.printStackTrace();
\r
49 public void onUpdate(boolean i_is_marker_exist,Transform3D i_transform3d)
\r
52 * TODO:Please write your behavior operation code here.
\r
53 * マーカーの姿勢を元に他の3Dオブジェクトを操作するときは、ここに処理を書きます。*/
\r
56 public void startCapture() throws Exception
\r
58 nya_behavior.start();
\r
60 public NyARJava3D() throws Exception
\r
62 super("Java3D Example NyARToolkit");
\r
65 NyARCode ar_code =new NyARCode(16,16);
\r
66 ar_code.loadFromARFile(CARCODE_FILE);
\r
67 ar_param=new J3dNyARParam();
\r
68 ar_param.loadFromARFile(PARAM_FILE);
\r
69 ar_param.changeSize(320,240);
\r
71 //localeの作成とlocateとviewの設定
\r
72 universe = new VirtualUniverse();
\r
73 locale = new Locale( universe );
\r
74 canvas=new Canvas3D( SimpleUniverse.getPreferredConfiguration());
\r
75 View view = new View();
\r
76 ViewPlatform viewPlatform = new ViewPlatform();
\r
77 view.attachViewPlatform( viewPlatform );
\r
78 view.addCanvas3D(canvas);
\r
79 view.setPhysicalBody( new PhysicalBody() );
\r
80 view.setPhysicalEnvironment( new PhysicalEnvironment());
\r
83 Transform3D camera_3d=ar_param.getCameraTransform();
\r
84 view.setCompatibilityModeEnable(true);
\r
85 view.setProjectionPolicy(View.PERSPECTIVE_PROJECTION);
\r
86 view.setLeftProjection(camera_3d);
\r
88 //視点設定(0,0,0から、Y軸を180度回転してZ+方向を向くようにする。)
\r
89 TransformGroup viewGroup = new TransformGroup();
\r
90 Transform3D viewTransform = new Transform3D();
\r
91 viewTransform.rotY(Math.PI);
\r
92 viewTransform.setTranslation(new Vector3d(0.0,0.0,0.0));
\r
93 viewGroup.setTransform( viewTransform );
\r
94 viewGroup.addChild( viewPlatform );
\r
95 BranchGroup viewRoot = new BranchGroup();
\r
96 viewRoot.addChild( viewGroup );
\r
97 locale.addBranchGraph( viewRoot );
\r
101 Background background =new Background();
\r
102 BoundingSphere bounds = new BoundingSphere();
\r
103 bounds.setRadius( 10.0 );
\r
104 background.setApplicationBounds(bounds);
\r
105 background.setImageScaleMode(Background.SCALE_FIT_ALL);
\r
106 background.setCapability(Background.ALLOW_IMAGE_WRITE);
\r
107 BranchGroup root = new BranchGroup();
\r
108 root.addChild(background);
\r
110 //TransformGroupで囲ったシーングラフの作成
\r
111 TransformGroup transform=new TransformGroup();
\r
112 transform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
\r
113 transform.addChild(createSceneGraph());
\r
114 root.addChild(transform);
\r
116 //NyARToolkitのBehaviorを作る。(マーカーサイズはメートルで指定すること)
\r
117 nya_behavior=new NyARSingleMarkerBehaviorHolder(ar_param,30f,ar_code,0.08);
\r
118 //Behaviorに連動するグループをセット
\r
119 nya_behavior.setTransformGroup(transform);
\r
120 nya_behavior.setBackGround(background);
\r
123 root.addChild(nya_behavior.getBehavior());
\r
124 nya_behavior.setUpdateListener(this);
\r
126 //表示ブランチをLocateにセット
\r
127 locale.addBranchGraph(root);
\r
130 setLayout(new BorderLayout());
\r
131 add(canvas,BorderLayout.CENTER);
\r
134 * シーングラフを作って、そのノードを返す。
\r
135 * このノードは40mmの色つきナタデココを表示するシーン。z軸を基準に20mm上に浮かせてる。
\r
138 private Node createSceneGraph()
\r
140 TransformGroup tg=new TransformGroup();
\r
141 Transform3D mt=new Transform3D();
\r
142 mt.setTranslation(new Vector3d(0.00,0.0,20*0.001));
\r
143 // 大きさ 40mmの色付き立方体を、Z軸上で20mm動かして配置)
\r
144 tg.setTransform(mt);
\r
145 tg.addChild(new ColorCube(20*0.001));
\r