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