001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/ogcwebservices/wpvs/j3d/WPVSScene.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2008 by:
006 EXSE, Department of Geography, University of Bonn
007 http://www.giub.uni-bonn.de/deegree/
008 lat/lon GmbH
009 http://www.lat-lon.de
010
011 This library is free software; you can redistribute it and/or
012 modify it under the terms of the GNU Lesser General Public
013 License as published by the Free Software Foundation; either
014 version 2.1 of the License, or (at your option) any later version.
015
016 This library is distributed in the hope that it will be useful,
017 but WITHOUT ANY WARRANTY; without even the implied warranty of
018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019 Lesser General Public License for more details.
020
021 You should have received a copy of the GNU Lesser General Public
022 License along with this library; if not, write to the Free Software
023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024
025 Contact:
026
027 Andreas Poth
028 lat/lon GmbH
029 Aennchenstraße 19
030 53177 Bonn
031 Germany
032 E-Mail: poth@lat-lon.de
033
034 Prof. Dr. Klaus Greve
035 Department of Geography
036 University of Bonn
037 Meckenheimer Allee 166
038 53115 Bonn
039 Germany
040 E-Mail: greve@giub.uni-bonn.de
041
042 ---------------------------------------------------------------------------*/
043 package org.deegree.ogcwebservices.wpvs.j3d;
044
045 import java.util.ArrayList;
046 import java.util.Calendar;
047 import java.util.GregorianCalendar;
048 import java.util.List;
049
050 import javax.media.j3d.AmbientLight;
051 import javax.media.j3d.BoundingSphere;
052 import javax.media.j3d.DirectionalLight;
053 import javax.media.j3d.Light;
054 import javax.media.j3d.Node;
055 import javax.media.j3d.OrderedGroup;
056 import javax.vecmath.Color3f;
057 import javax.vecmath.Point3d;
058 import javax.vecmath.Vector3f;
059
060 import org.deegree.framework.log.ILogger;
061 import org.deegree.framework.log.LoggerFactory;
062 import org.deegree.i18n.Messages;
063 import org.deegree.ogcwebservices.wpvs.utils.SunLight;
064 import org.deegree.ogcwebservices.wpvs.utils.SunPosition;
065
066 /**
067 * This class represents the basic class for creation of a 3D perspective views as specified in the
068 * OGC Web Perpective View Service specification. A WPVS scene is defined by a scene model and a
069 * date determining the light conditions. Additional elements are 3D or 2.5D-features that are
070 * placed into the scene, atmospheric conditions influencing the light and visibility (e.g. fog,
071 * rain etc., but currently not implemented) and additional light placed into the scene (e.g. street
072 * lights, spots, lighted windows etc.).
073 * <p>
074 * -----------------------------------------------------------------------
075 * </p>
076 *
077 * @author <a href="mailto:lupp@lat-lon.de">Katharina Lupp</a>
078 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
079 *
080 * @author last edited by: $Author: apoth $
081 * @version $Revision: 9345 $ $Date: 2007-12-27 17:22:25 +0100 (Do, 27 Dez 2007) $
082 */
083 public class WPVSScene {
084
085 private static ILogger LOG = LoggerFactory.getLogger( WPVSScene.class );
086
087 private Calendar calendar;
088
089 private OrderedGroup scene;
090
091 private List<Light> lights;
092
093 private ViewPoint viewPoint;
094
095 private Node background;
096
097 /**
098 * Creates a new instance of WPVScene
099 *
100 * @param scene
101 * java3D representation of the scene.
102 * @param viewPoint
103 * object that describes the viewers position and the looking direction
104 * @param calendar
105 * describtion of the date and time for which the scene shall be rendered --> light
106 * conditions
107 * @param lights
108 * lights in addition to sun and ambient light (e.g. street lights, spots etc.)
109 * @param background
110 * scene background; have to be a <code>Shape3D</code> or a <code>Background</code>
111 */
112 public WPVSScene( OrderedGroup scene, ViewPoint viewPoint, Calendar calendar,
113 List<Light> lights, Node background ) {
114 if ( lights != null ) {
115 this.lights = lights;
116 } else {
117 this.lights = new ArrayList<Light>();
118 }
119 this.scene = scene;
120 this.viewPoint = viewPoint;
121 this.calendar = calendar;
122 if( calendar == null ){
123 LOG.logDebug( Messages.getMessage( "WPVS_STANDARD_TIME" ) );
124 this.calendar = new GregorianCalendar(2007, 2, 21, 12, 00 );
125 }
126 this.background = background;
127 createDayLight();
128 }
129
130 /**
131 * creates the light that results from the sun (direct light) and the ambient of the sky.
132 */
133 private void createDayLight() {
134
135 int latitute = 52;
136 SunPosition sp = new SunPosition( calendar );
137 SunLight sl = new SunLight( latitute, sp );
138 Color3f sunlightColor = sl.calculateSunlight( );
139 double vPos = sp.getVerticalSunposition( latitute );
140 double hPos = sp.getHorizontalSunPosition( );
141
142 Point3d p = getViewPoint().getObserverPosition();
143 Point3d origin = new Point3d( p.x, p.y, p.z );
144 BoundingSphere light_bounds = new BoundingSphere( origin, 250000 );
145
146 // Directional Light: A DirectionalLight node defines an oriented light with an origin at
147 // infinity.
148 DirectionalLight headlight = new DirectionalLight();
149 headlight.setInfluencingBounds( light_bounds );
150 headlight.setColor( sunlightColor );
151 headlight.setDirection( (float) Math.sin( hPos ), (float) Math.sin( vPos ), (float) -Math.abs( Math.cos( hPos ) ) );
152 Vector3f tmp = new Vector3f();
153 headlight.getDirection( tmp );
154 lights.add( headlight );
155 // Ambient Light: Ambient light is that light that seems to come from all directions.
156 // Ambient light has only an ambient reflection component.
157 // It does not have diffuse or specular reflection components.
158 AmbientLight al = new AmbientLight();
159 al.setInfluencingBounds( light_bounds );
160 al.setColor( new Color3f( 0.7f * sunlightColor.x, 0.65f * sunlightColor.y, 0.6f * sunlightColor.z ) );
161
162 lights.add( al );
163 }
164
165 /**
166 * @return the background object of the scene.
167 */
168 public Node getBackground() {
169 return background;
170 }
171
172 /**
173 * @param background
174 * sets the <code>Background</code> object of the scene
175 */
176 public void setBackground( Node background ) {
177 this.background = background;
178 }
179
180
181 /**
182 * get the date and the time for determining time depending the light conditions of the scene
183 *
184 * @return describtion of the date and time for which the scene shall be rendered --> light
185 * conditions
186 */
187 public Calendar getDate() {
188 return calendar;
189 }
190
191 /**
192 * set the date and the time for determining time depending the light conditions of the scene
193 *
194 * @param calendar
195 * describtion of the date and time for which the scene shall be rendered --> light
196 * conditions
197 */
198 public void setDate( Calendar calendar ) {
199 if ( calendar == null ) {
200 LOG.logDebug( Messages.getMessage( "WPVS_STANDARD_TIME" ) );
201 this.calendar = new GregorianCalendar(2007, 2, 21, 12, 00 );
202 }
203 this.calendar = calendar;
204 }
205
206 /**
207 * @return Java3D representation of the scene.
208 */
209 public OrderedGroup getScene() {
210 return scene;
211 }
212
213 /**
214 * gets the position of the viewer, the directions he looks and his field of view in radians
215 *
216 * @return object that describes the viewers position and the point he looks at
217 */
218 public ViewPoint getViewPoint() {
219 return viewPoint;
220 }
221
222 /**
223 * defines the position of the viewer and the point he looks at.
224 *
225 * @param viewPoint
226 * object that describes the viewers position and the point he looks at
227 */
228 public void setViewPoint( ViewPoint viewPoint ) {
229 this.viewPoint = viewPoint;
230 }
231
232 /**
233 * adds a light to the scene. this can be ambient, directional and point light.
234 *
235 * @param light
236 * a light in addition to sun and basic ambient light (e.g. street lights, spots
237 * etc.)
238 */
239 public void addLight( Light light ) {
240 this.lights.add( light );
241 }
242
243 /**
244 * returns the lights of the scene
245 *
246 * @return lights including sun and basic ambient light (e.g. street lights, spots etc.)
247 */
248 public Light[] getLights() {
249 return lights.toArray( new Light[lights.size()] );
250 }
251
252 /**
253 * sets the lights of the scene. this can be ambient, directional and point light.
254 *
255 * @param lights
256 * lights in addition to sun and basic ambient light (e.g. street lights, spots etc.)
257 */
258 public void setLights( Light[] lights ) {
259 this.lights.clear();
260 setDate( calendar );
261 createDayLight();
262 if ( lights != null ) {
263 for ( int i = 0; i < lights.length; i++ ) {
264 addLight( lights[i] );
265 }
266 }
267 }
268 }