001 package com.croftsoft.apps.tag3d;
002
003 import java.applet.*;
004 import java.awt.*;
005 import java.awt.event.*;
006 import java.rmi.Naming;
007 import java.util.HashMap;
008 import java.util.Map;
009
010 import javax.media.j3d.*;
011 import javax.vecmath.*;
012
013 import com.sun.j3d.utils.applet.MainFrame;
014 import com.sun.j3d.utils.behaviors.mouse.*;
015 import com.sun.j3d.utils.geometry.Box;
016 import com.sun.j3d.utils.geometry.ColorCube;
017 import com.sun.j3d.utils.image.TextureLoader;
018 import com.sun.j3d.utils.universe.*;
019
020 import com.croftsoft.core.media.j3d.Transform3DLib;
021 import com.croftsoft.core.media.j3d.Transform3DState;
022 import com.croftsoft.core.util.state.*;
023
024 /*********************************************************************
025 *
026 * The Tag3D universe and methods to build it.
027 *
028 * @author
029 * <A HREF="http://www.alumni.caltech.edu/~croft/">David W. Croft</A>
030 * @version
031 * 1999-02-07
032 *********************************************************************/
033
034 public class Tag3DWorld
035 //////////////////////////////////////////////////////////////////////
036 //////////////////////////////////////////////////////////////////////
037 {
038
039 protected Canvas3D canvas3D;
040 protected Locale locale;
041 protected TransformGroup viewTransformGroup;
042
043 //////////////////////////////////////////////////////////////////////
044 //////////////////////////////////////////////////////////////////////
045
046 public static Tag3DWorld build ( )
047 //////////////////////////////////////////////////////////////////////
048 {
049 Canvas3D canvas3D = new Canvas3D ( null );
050
051 VirtualUniverse virtualUniverse = new VirtualUniverse ( );
052 Locale locale = new Locale ( virtualUniverse );
053
054 PhysicalBody physicalBody = new PhysicalBody ( );
055 PhysicalEnvironment physicalEnvironment
056 = new PhysicalEnvironment ( );
057
058 View view = new View ( );
059
060 // Antialiasing slows things down dramatically.
061 // view.setSceneAntialiasingEnable ( true );
062
063 view.addCanvas3D ( canvas3D );
064 view.setPhysicalBody ( physicalBody );
065 view.setPhysicalEnvironment ( physicalEnvironment );
066 BranchGroup viewBranchGroup = new BranchGroup ( );
067
068 Transform3D transform3D = new Transform3D ( );
069
070 ViewPlatform viewPlatform = new ViewPlatform ( );
071
072 TransformGroup viewTransformGroup
073 = new TransformGroup ( transform3D );
074
075 viewTransformGroup.setCapability (
076 TransformGroup.ALLOW_TRANSFORM_READ );
077 viewTransformGroup.setCapability (
078 TransformGroup.ALLOW_TRANSFORM_WRITE );
079
080 viewTransformGroup.addChild ( viewPlatform );
081 viewBranchGroup.addChild ( viewTransformGroup );
082
083 view.attachViewPlatform ( viewPlatform );
084
085 locale.addBranchGraph ( viewBranchGroup );
086 locale.addBranchGraph ( createSceneGraph ( ) );
087
088 return new Tag3DWorld ( canvas3D, locale, viewTransformGroup );
089 }
090
091 //////////////////////////////////////////////////////////////////////
092 //////////////////////////////////////////////////////////////////////
093
094 public static BranchGroup createSceneGraph ( )
095 //////////////////////////////////////////////////////////////////////
096 {
097 BranchGroup rootBranchGroup = new BranchGroup ( );
098
099 BoundingSphere boundingSphere
100 = new BoundingSphere ( new Point3d ( 0.0, 0.0, 0.0 ), 10.0 );
101
102 Clip clip = new Clip ( 10000.0 );
103 clip.setApplicationBounds (
104 new BoundingSphere ( new Point3d ( 0.0, 0.0, 0.0 ), 10000.0 ) );
105 rootBranchGroup.addChild ( clip );
106
107 /*
108 Background background = new Background ( 0.9f, 1.0f, 0.9f );
109 background.setApplicationBounds (
110 new BoundingSphere ( new Point3d ( 0.0, 0.0, 0.0 ), 5.0 ) );
111 rootBranchGroup.addChild ( background );
112 */
113
114
115 /*
116 Fog fog = new ExponentialFog ( 0.0f, 0.1f, 0.2f );
117 fog.setInfluencingBounds ( boundingSphere );
118 rootBranchGroup.addChild ( fog );
119
120 Light light = new PointLight ( );
121 light.setInfluencingBounds ( boundingSphere );
122 rootBranchGroup.addChild ( light );
123 */
124
125 int distance = 10;
126
127 SharedGroup sharedGroup = new SharedGroup ( );
128 sharedGroup.addChild ( new ColorCube ( 0.5 ) );
129 sharedGroup.compile ( );
130
131 for ( int x = -2 * distance; x < 3 * distance; x += distance )
132 for ( int y = -2 * distance; y < 3 * distance; y += distance )
133 for ( int z = -2 * distance; z < 3 * distance; z += distance )
134 {
135 if ( ( x == 0 ) && ( y == 0 ) && ( z == 0 ) ) continue;
136 Transform3D transform3D = new Transform3D ( );
137 transform3D.setTranslation ( new Vector3d ( x, y, z ) );
138
139 TransformGroup transformGroup
140 = new TransformGroup ( transform3D );
141
142 transformGroup.addChild ( new Link ( sharedGroup ) );
143
144 rootBranchGroup.addChild ( transformGroup );
145 }
146
147 rootBranchGroup.compile ( );
148
149 return rootBranchGroup;
150 }
151
152 public static void addHead (
153 String id,
154 TransformGroup transformGroup,
155 Component component )
156 //////////////////////////////////////////////////////////////////////
157 {
158 Font3D font3D = new Font3D (
159 new Font ( "Courier", Font.PLAIN, 1 ),
160 new FontExtrusion ( ) );
161 Text3D text3D = new Text3D ( font3D, id,
162 new Point3f ( 0.0f, -1.2f, 0.0f ),
163 Text3D.ALIGN_CENTER, Text3D.PATH_RIGHT );
164 Shape3D shape3D = new Shape3D ( );
165 Appearance appearance = new Appearance ( );
166 Material material = new Material ( );
167 material.setEmissiveColor ( new Color3f ( 1.0f, 0.0f, 0.0f ) );
168 material.setLightingEnable ( true );
169 appearance.setMaterial ( material );
170 shape3D.setGeometry ( text3D );
171 shape3D.setAppearance ( appearance );
172
173 BoundingSphere boundingSphere
174 = new BoundingSphere ( new Point3d ( 0.0, 0.0, 0.0 ), 10.0 );
175
176 TransformGroup textTransformGroup
177 = new TransformGroup ( new Transform3D ( ) );
178 Alpha rotationAlpha = new Alpha (
179 -1, Alpha.INCREASING_ENABLE,
180 0, 0,
181 4000, 0, 0,
182 0, 0, 0 );
183 RotationInterpolator rotationInterpolator
184 = new RotationInterpolator (
185 rotationAlpha, textTransformGroup, new Transform3D ( ),
186 0.0f, 2.0f * (float) Math.PI );
187 rotationInterpolator.setSchedulingBounds ( boundingSphere );
188 textTransformGroup.setCapability (
189 TransformGroup.ALLOW_TRANSFORM_WRITE );
190 textTransformGroup.addChild ( rotationInterpolator );
191 textTransformGroup.addChild ( shape3D );
192 transformGroup.addChild ( textTransformGroup );
193
194 Text3D chatText3D = new Text3D ( font3D, "Hello!",
195 new Point3f ( 0.0f, 1.2f, 0.0f ),
196 Text3D.ALIGN_CENTER, Text3D.PATH_RIGHT );
197 Shape3D chatShape3D = new Shape3D ( );
198 chatShape3D.setGeometry ( chatText3D );
199 chatShape3D.setAppearance ( appearance );
200 TransformGroup chatTransformGroup
201 = new TransformGroup ( new Transform3D ( ) );
202 chatTransformGroup.setCapability (
203 TransformGroup.ALLOW_TRANSFORM_WRITE );
204 Billboard billboard = new Billboard ( chatTransformGroup );
205 billboard.setSchedulingBounds ( boundingSphere );
206 chatTransformGroup.addChild ( chatShape3D );
207 // chatTransformGroup.addChild ( billboard );
208 transformGroup.addChild ( chatTransformGroup );
209
210
211 transformGroup.setCapability (
212 TransformGroup.ALLOW_TRANSFORM_READ );
213 transformGroup.setCapability (
214 TransformGroup.ALLOW_TRANSFORM_WRITE );
215
216 MouseRotate mouseRotate = new MouseRotate ( );
217 mouseRotate.setTransformGroup ( transformGroup );
218 transformGroup.addChild ( mouseRotate );
219 mouseRotate.setSchedulingBounds ( boundingSphere );
220
221 // Create the zoom behavior node
222 MouseZoom mouseZoom = new MouseZoom ( );
223 mouseZoom.setTransformGroup ( transformGroup );
224 transformGroup.addChild ( mouseZoom );
225 mouseZoom.setSchedulingBounds ( boundingSphere );
226
227 // Create the translate behavior node
228 MouseTranslate mouseTranslate = new MouseTranslate ( );
229 mouseTranslate.setTransformGroup ( transformGroup );
230 transformGroup.addChild ( mouseTranslate );
231 mouseTranslate.setSchedulingBounds ( boundingSphere );
232
233
234 Appearance app = new Appearance ( );
235 Texture tex = new TextureLoader (
236 "images/face.jpg", component ).getTexture ( );
237 app.setTexture(tex);
238 if ( tex == null )
239 {
240 System.out.println("Warning: Texture is disabled");
241 }
242 Box textureCube = new Box ( 0.5f, 0.5f, 0.5f,
243 Box.GENERATE_TEXTURE_COORDS, app );
244 transformGroup.addChild ( textureCube );
245 }
246
247 //////////////////////////////////////////////////////////////////////
248 //////////////////////////////////////////////////////////////////////
249
250 public Tag3DWorld (
251 Canvas3D canvas3D,
252 Locale locale,
253 TransformGroup viewTransformGroup )
254 //////////////////////////////////////////////////////////////////////
255 {
256 this.canvas3D = canvas3D;
257 this.locale = locale;
258 this.viewTransformGroup = viewTransformGroup;
259 }
260
261 //////////////////////////////////////////////////////////////////////
262 //////////////////////////////////////////////////////////////////////
263
264 public TransformGroup addHead (
265 String id,
266 Transform3D transform3D )
267 //////////////////////////////////////////////////////////////////////
268 {
269 TransformGroup transformGroup = new TransformGroup ( transform3D );
270 addHead ( id, transformGroup, canvas3D );
271
272 BranchGroup rootBranchGroup = new BranchGroup ( );
273 rootBranchGroup.addChild ( transformGroup );
274 rootBranchGroup.compile ( );
275 locale.addBranchGraph ( rootBranchGroup );
276
277 return transformGroup;
278 }
279
280 //////////////////////////////////////////////////////////////////////
281 //////////////////////////////////////////////////////////////////////
282 }