001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/ogcwebservices/wpvs/operation/GetView.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 037 package org.deegree.ogcwebservices.wpvs.operation; 038 039 import java.awt.Color; 040 import java.awt.Dimension; 041 import java.io.UnsupportedEncodingException; 042 import java.net.URLDecoder; 043 import java.util.ArrayList; 044 import java.util.List; 045 import java.util.Map; 046 047 import javax.vecmath.Point3d; 048 049 import org.deegree.framework.log.ILogger; 050 import org.deegree.framework.log.LoggerFactory; 051 import org.deegree.framework.util.CharsetUtils; 052 import org.deegree.framework.util.MimeTypeMapper; 053 import org.deegree.framework.util.StringTools; 054 import org.deegree.framework.util.TimeTools; 055 import org.deegree.i18n.Messages; 056 import org.deegree.model.crs.CRSFactory; 057 import org.deegree.model.crs.CoordinateSystem; 058 import org.deegree.model.crs.UnknownCRSException; 059 import org.deegree.model.spatialschema.Envelope; 060 import org.deegree.model.spatialschema.GeometryFactory; 061 import org.deegree.model.spatialschema.Position; 062 import org.deegree.ogcwebservices.InconsistentRequestException; 063 import org.deegree.ogcwebservices.InvalidParameterValueException; 064 065 /** 066 * This Class handles a kvp request from a client and stores it's values. 067 * 068 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a> 069 * @author last edited by: $Author: mschneider $ 070 * 071 * @version 2.0, $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $ 072 * 073 * @since 2.0 074 */ 075 public class GetView extends WPVSRequestBase { 076 077 /** 078 * 079 */ 080 private static final long serialVersionUID = 3147456903146907261L; 081 082 private static final ILogger LOG = LoggerFactory.getLogger( GetView.class ); 083 084 private final List<String> datasets; 085 086 private double quality; 087 088 /** 089 * using deegree's Position 090 */ 091 private final Point3d pointOfInterest; 092 093 private double pitch; 094 095 private double yaw; 096 097 private double roll; 098 099 private double distance; 100 101 private double angleOfView; 102 103 private final boolean transparent; 104 105 private final Dimension imageDimension; 106 107 private final String outputFormat; 108 109 private final Color backgroundColor; 110 111 private final String exceptionFormat; 112 113 private final String elevationModel; 114 115 private final Envelope boundingBox; 116 117 private final CoordinateSystem crs; 118 119 private double farClippingPlane; 120 121 private GetView( String version, String id, List<String> datasets, String elevationModel, 122 double quality, Position pointOfInterest, Envelope bbox, CoordinateSystem crs, 123 double pitch, double yaw, double roll, double distance, double angleOfView, 124 String outputFormat, Color backgroundColor, boolean transparent, 125 Dimension imageDimension, String exceptionFormat, double farClippingPlane, 126 Map<String, String> vendorSpecificParameter ) { 127 this( 128 version, 129 id, 130 datasets, 131 elevationModel, 132 quality, 133 new Point3d( pointOfInterest.getX(), pointOfInterest.getY(), pointOfInterest.getZ() ), 134 bbox, crs, pitch, yaw, roll, distance, angleOfView, outputFormat, backgroundColor, 135 transparent, imageDimension, exceptionFormat, farClippingPlane, 136 vendorSpecificParameter ); 137 } 138 139 /** 140 * Trusted constructor. No parameter validity is performed. This is delegated to the factory 141 * method createGeMap. 142 * 143 * TODO the list of pars is too long, should break up into smaller classes, e.g. pars for 144 * perspective output, etc. 145 * 146 * @param version 147 * @param id 148 * @param datasets 149 * @param elevationModel 150 * @param quality 151 * @param pointOfInterest 152 * @param bbox 153 * @param crs 154 * @param pitch 155 * @param yaw 156 * @param roll 157 * @param distance 158 * @param angleOfView 159 * @param outputFormat 160 * @param backgroundColor 161 * @param transparent 162 * @param imageDimension 163 * @param exceptionFormat 164 * @param farClippingPlane 165 * @param vendorSpecificParameter 166 */ 167 private GetView( String version, String id, List<String> datasets, String elevationModel, 168 double quality, Point3d pointOfInterest, Envelope bbox, CoordinateSystem crs, 169 double pitch, double yaw, double roll, double distance, double angleOfView, 170 String outputFormat, Color backgroundColor, boolean transparent, 171 Dimension imageDimension, String exceptionFormat, double farClippingPlane, 172 Map<String, String> vendorSpecificParameter ) { 173 super( version, id, vendorSpecificParameter ); 174 this.datasets = datasets; 175 this.elevationModel = elevationModel; 176 177 this.quality = quality; 178 this.pointOfInterest = pointOfInterest; 179 this.boundingBox = bbox; 180 this.crs = crs; 181 this.pitch = pitch; 182 this.yaw = yaw; 183 this.roll = roll; 184 this.distance = distance; 185 this.angleOfView = angleOfView; 186 this.outputFormat = outputFormat; 187 this.backgroundColor = backgroundColor; 188 this.transparent = transparent; 189 this.imageDimension = imageDimension; 190 this.exceptionFormat = exceptionFormat; 191 this.farClippingPlane = farClippingPlane; 192 193 } 194 195 /** 196 * Factory method to create an instance of GetView from teh parameters in <code>model</code> 197 * 198 * @param requestParams 199 * a map containing request parameters and values 200 * @return a new instance of GetView 201 * @throws InconsistentRequestException 202 * if a mandatory parameter is missing 203 * @throws InvalidParameterValueException 204 * if a parameter has an illegal value 205 */ 206 public static GetView create( Map<String, String> requestParams ) 207 throws InconsistentRequestException, InvalidParameterValueException { 208 209 // TODO throw a proper exception, the InconsistentRequestException doesn't cover all cases 210 211 // not needed anymore 212 requestParams.remove( "REQUEST" ); 213 214 String id = requestParams.remove( "ID" ); 215 216 /* 217 * TODO check if this is right WPVSConfiguration configuration = (WPVSConfiguration) 218 * model.remove( "CAPABILITIES" ); if ( configuration == null ){ throw new RuntimeException ( 219 * "Working site: you forgot to add config to model -> " + "see how this is done in wms" ); } 220 */ 221 222 String version = requestParams.remove( "VERSION" ); 223 if ( version == null ) { 224 throw new InconsistentRequestException( "'VERSION' value must be set" ); 225 } 226 227 // FORMAT 228 String format = requestParams.remove( "OUTPUTFORMAT" ); 229 if ( format == null ) { 230 throw new InconsistentRequestException( "OUTPUTFORMAT value must be set" ); 231 } 232 try { 233 format = URLDecoder.decode( format, CharsetUtils.getSystemCharset() ); 234 } catch ( UnsupportedEncodingException e1 ) { 235 LOG.logError( e1.getLocalizedMessage(), e1 ); 236 } 237 if ( !MimeTypeMapper.isKnownImageType( format ) ) { 238 throw new InvalidParameterValueException( 239 StringTools.concat( 50, format, 240 " is not a valid image/result format" ) ); 241 } 242 243 // TRANSPARENCY 244 boolean transparency = false; 245 String tp = requestParams.remove( "TRANSPARENT" ); 246 if ( tp != null ) { 247 transparency = tp.toUpperCase().trim().equals( "TRUE" ); 248 } 249 250 if ( transparency 251 && ( format.equals( "image/jpg" ) || format.equals( "image/jpeg" ) 252 || format.equals( "image/bmp" ) || format.equals( "image/tif" ) || format.equals( "image/tiff" ) ) ) { 253 254 throw new InconsistentRequestException( 255 StringTools.concat( 256 100, 257 "TRANSPARENCY=true is inconsistent with OUTPUTFORMAT=", 258 format, 259 ".Valid transparent formats are 'image/gif' ", 260 "and 'image/png'." ) ); 261 } 262 263 // width 264 String tmp = requestParams.remove( "WIDTH" ); 265 if ( tmp == null ) { 266 throw new InconsistentRequestException( "'WIDTH' value must be set" ); 267 } 268 int width = 0; 269 try { 270 width = Integer.parseInt( tmp ); 271 } catch ( NumberFormatException e ) { 272 throw new InconsistentRequestException( "WIDTH must be a valid integer number" ); 273 } 274 275 tmp = requestParams.remove( "HEIGHT" ); 276 if ( tmp == null ) { 277 throw new InconsistentRequestException( "'HEIGHT' value must be set" ); 278 } 279 int height = 0; 280 try { 281 height = Integer.parseInt( tmp ); 282 } catch ( NumberFormatException e ) { 283 throw new InconsistentRequestException( "HEIGHT must be a valid integer number" ); 284 } 285 286 if ( width < 0 || height < 0 ) { 287 throw new InconsistentRequestException( "WIDTH and HEIGHT must be >= 0" ); 288 } 289 Dimension imgDimension = new Dimension( width, height ); 290 291 Color bgColor = Color.white; 292 293 tmp = requestParams.remove( "BACKGROUNDCOLOR" ); 294 if ( tmp != null ) { 295 try { 296 bgColor = Color.decode( tmp ); 297 } catch ( NumberFormatException e ) { 298 throw new InconsistentRequestException( 299 StringTools.concat( 300 100, 301 "The BACKGROUNDCOLOR '", 302 tmp, 303 "' does not denote a valid hexadecimal color." ) ); 304 } 305 } 306 307 String elevModel = requestParams.remove( "ELEVATIONMODEL" ); 308 /* 309 * if ( elevModel == null ) { throw new InconsistentRequestException( "'ELEVATIONMODEL' 310 * value must be set" ); } 311 */ 312 if ( elevModel != null ) { 313 elevModel = elevModel.trim(); 314 if ( elevModel.length() == 0 ) { 315 throw new InconsistentRequestException( 316 "ELEVATIONMODEL cannot contain space characters only or be empty" ); 317 } 318 } 319 320 tmp = requestParams.remove( "AOV" ); 321 if ( tmp == null ) { 322 throw new InconsistentRequestException( "'AOV' value must be set" ); 323 } 324 325 double aov = 0; 326 try { 327 aov = Math.toRadians( Double.parseDouble( tmp ) ); 328 /** 329 * checking for > 0 || < 90 330 */ 331 if ( ( aov <= 0 ) || ( aov >= 1.5707963265 ) ) { 332 throw new InvalidParameterValueException( 333 "AOV value must be a number between 0° and 180°" ); 334 } 335 } catch ( NumberFormatException e ) { 336 LOG.logError( e.getLocalizedMessage(), e ); 337 throw new InvalidParameterValueException( "AOV couldn't parse the aov value" ); 338 } 339 340 tmp = requestParams.remove( "ROLL" ); 341 if ( tmp == null ) { 342 throw new InconsistentRequestException( "'ROLL' value must be set" ); 343 } 344 double roll; 345 try { 346 /** 347 * checking for > 360 && < 360 348 */ 349 roll = Double.parseDouble( tmp ) % 360; 350 if ( roll < 0 ) 351 roll += 360; 352 roll = Math.toRadians( roll ); 353 } catch ( NumberFormatException e ) { 354 LOG.logError( e.getLocalizedMessage(), e ); 355 throw new InvalidParameterValueException( "ROLL value must be a number" ); 356 } 357 358 tmp = requestParams.remove( "DISTANCE" ); 359 if ( tmp == null ) { 360 throw new InconsistentRequestException( "'DISTANCE' value must be set." ); 361 } 362 363 double distance; 364 String mesg = "DISTANCE must be a number >= 0."; 365 try { 366 distance = Double.parseDouble( tmp ); 367 if ( distance < 0 ) { 368 throw new InvalidParameterValueException( mesg ); 369 } 370 } catch ( NumberFormatException e ) { 371 LOG.logError( e.getLocalizedMessage(), e ); 372 throw new InvalidParameterValueException( mesg ); 373 } 374 375 tmp = requestParams.remove( "PITCH" ); 376 if ( tmp == null ) { 377 throw new InconsistentRequestException( "'PITCH' value must be set." ); 378 } 379 double pitch = 0; 380 try { 381 pitch = Math.toRadians( Double.parseDouble( tmp ) ); 382 if ( ( pitch < -1.570796327 ) || ( pitch > 1.570796327 ) ) { 383 throw new InvalidParameterValueException( 384 "PITCH value must be a number between -90° and 90°" ); 385 } 386 } catch ( NumberFormatException e ) { 387 LOG.logError( e.getLocalizedMessage(), e ); 388 throw new InvalidParameterValueException( 389 "PITCH value must be a number between -90° and 90°" ); 390 } 391 392 tmp = requestParams.remove( "YAW" ); 393 if ( tmp == null ) { 394 throw new InconsistentRequestException( "'YAW' value must be set." ); 395 } 396 double yaw; 397 try { 398 double tmpYaw = Double.parseDouble( tmp ) % 360; 399 if ( tmpYaw < 0 ) 400 tmpYaw += 360; 401 // YAW == 270 -> OutOfMem Error 402 // if ( tmpYaw > 89.5 && tmpYaw < 90.5 ) { 403 // tmpYaw = 91; 404 // } else if ( tmpYaw > 269.5 && tmpYaw < 270.5 ) { 405 // tmpYaw = 271; 406 // } 407 // [UT] 06.06.2005 splitter doesn't work fine for 0 (or 360) and 180 408 // if ( tmpYaw % 180 == 0 ) { 409 // tmpYaw += 0.5; 410 // } 411 yaw = Math.toRadians( tmpYaw ); 412 413 } catch ( NumberFormatException e ) { 414 LOG.logError( e.getLocalizedMessage(), e ); 415 throw new InvalidParameterValueException( "YAW value must be a number" ); 416 } 417 418 tmp = requestParams.remove( "POI" ); 419 if ( tmp == null ) { 420 throw new InconsistentRequestException( "POI value is missing." ); 421 } 422 mesg = "POI value must denote a number tuple with valid x,y,z values, for example '123.45,678.90,456.123'"; 423 424 try { 425 tmp = URLDecoder.decode( tmp, CharsetUtils.getSystemCharset() ); 426 } catch ( UnsupportedEncodingException e ) { 427 LOG.logError( e.getLocalizedMessage(), e ); 428 throw new InconsistentRequestException( e.getLocalizedMessage() ); 429 } 430 String[] xyz = tmp.split( "," ); 431 if ( xyz.length != 3 ) { 432 throw new InvalidParameterValueException( mesg ); 433 } 434 Position poi; 435 double[] p = new double[3]; 436 try { 437 p[0] = Double.parseDouble( xyz[0] ); 438 p[1] = Double.parseDouble( xyz[1] ); 439 p[2] = Double.parseDouble( xyz[2] ); 440 441 } catch ( NumberFormatException e ) { 442 LOG.logError( e.getLocalizedMessage(), e ); 443 throw new InvalidParameterValueException( mesg ); 444 } 445 poi = GeometryFactory.createPosition( p ); 446 447 String crsString = requestParams.remove( "CRS" ); 448 CoordinateSystem crs = null; 449 if ( crsString == null ) { 450 throw new InconsistentRequestException( "CRS parameter is missing." ); 451 } 452 try { 453 crsString = URLDecoder.decode( crsString, CharsetUtils.getSystemCharset() ); 454 crs = CRSFactory.create( crsString ); 455 } catch ( UnsupportedEncodingException e ) { 456 LOG.logError( e.getLocalizedMessage(), e ); 457 } catch ( UnknownCRSException ucrse ) { 458 LOG.logError( ucrse.getLocalizedMessage(), ucrse ); 459 throw new InvalidParameterValueException( ucrse.getMessage() ); 460 } 461 462 String datasetsString = requestParams.remove( "DATASETS" ); 463 if ( datasetsString == null ) { 464 throw new InconsistentRequestException( "'DATASETS' value must be set" ); 465 } 466 467 datasetsString = datasetsString.trim(); 468 469 String[] datasets = datasetsString.split( "," ); 470 if ( "".equals( datasetsString ) || datasets.length == 0 ) { 471 throw new InconsistentRequestException( 472 "'DATASETS' must contain at least one dataset name, and cannot be empty (i.e. only have spaces)" ); 473 } 474 List<String> datasetList = new ArrayList<String>( datasets.length ); 475 for ( String dataset : datasets ) { 476 datasetList.add( dataset.trim() ); 477 } 478 479 String boxstring = requestParams.remove( "BOUNDINGBOX" ); 480 Envelope boundingBox = null; 481 if ( boxstring == null ) { 482 throw new InconsistentRequestException( "BOUNDINGBOX value must be set" ); 483 } 484 485 try { 486 boxstring = URLDecoder.decode( boxstring, CharsetUtils.getSystemCharset() ); 487 } catch ( UnsupportedEncodingException e ) { 488 LOG.logError( e.getLocalizedMessage(), e ); 489 throw new InconsistentRequestException( 490 StringTools.concat( 491 100, 492 "Cannot decode BOUNDINGBOX: '", 493 boxstring, 494 " using ", 495 CharsetUtils.getSystemCharset() ) ); 496 } 497 498 String[] tokens = boxstring.split( "," ); 499 if ( tokens.length != 4 ) { 500 throw new InconsistentRequestException( 501 "BOUNDINGBOX value must have a value such as xmin,ymin,xmax,ymax" ); 502 } 503 504 double minx; 505 double maxx; 506 double miny; 507 double maxy; 508 try { 509 minx = Double.parseDouble( tokens[0] ); 510 miny = Double.parseDouble( tokens[1] ); 511 maxx = Double.parseDouble( tokens[2] ); 512 maxy = Double.parseDouble( tokens[3] ); 513 } catch ( NumberFormatException e ) { 514 LOG.logError( e.getLocalizedMessage(), e ); 515 throw new InconsistentRequestException( "BOUNDINGBOX has an illegal value: " 516 + e.getMessage() ); 517 } 518 519 if ( minx >= maxx ) { 520 throw new InvalidParameterValueException( "minx must be less than maxx" ); 521 } 522 523 if ( miny >= maxy ) { 524 throw new InvalidParameterValueException( "miny must be less than maxy" ); 525 } 526 527 boundingBox = GeometryFactory.createEnvelope( minx, miny, maxx, maxy, crs ); 528 529 /** 530 * Doing some checking of the given request parameters. 531 */ 532 533 if ( !boundingBox.contains( poi ) ) { 534 throw new InconsistentRequestException( "POI (" + poi 535 + " )must be inside the Bounding box (" 536 + boundingBox + ")" ); 537 } 538 539 tmp = requestParams.remove( "FARCLIPPINGPLANE" ); 540 double farClippingPlane = 150000; 541 if ( tmp != null ) { 542 try { 543 farClippingPlane = Double.parseDouble( tmp ); 544 } catch ( NumberFormatException e ) { 545 LOG.logError( e.getLocalizedMessage(), e ); 546 throw new InvalidParameterValueException( "FarClippingPlane must be a number" ); 547 } 548 } 549 550 tmp = requestParams.remove( "QUALITY" ); 551 double quality = 1f; 552 if ( tmp != null ) { 553 try { 554 quality = Double.parseDouble( tmp ); 555 } catch ( NumberFormatException e ) { 556 LOG.logError( e.getLocalizedMessage(), e ); 557 throw new InvalidParameterValueException( "QUALITY must have a value between [0,1]" ); 558 } 559 } 560 561 String exceptions = requestParams.remove( "EXCEPTIONFORMAT" ); 562 if ( exceptions == null ) { 563 exceptions = "XML"; 564 } 565 566 // Shouldn't this be checked for the right value ??? 567 tmp = requestParams.remove( "DATETIME" ); 568 if ( tmp == null ) { 569 // when the moon is in the second house, 570 // and jupiter aligns with mars. 571 // -> dawning of the age of the wpvs 572 tmp = "2007-03-21T12:00:00"; 573 } else { 574 try { 575 TimeTools.createCalendar( tmp ); 576 } catch ( NumberFormatException nfe ) { 577 throw new InvalidParameterValueException( 578 Messages.getMessage( "WPVS_GETVIEW_ILLEGAL_DATETIME", tmp) ); 579 } 580 } 581 582 // org.deegree.framework.util.TimeTools.createCalendar( tmp ); 583 584 requestParams.put( "DATETIME", tmp ); 585 586 tmp = requestParams.remove( "SCALE" ); 587 if ( tmp != null ) { 588 try { 589 Double.parseDouble( tmp ); 590 requestParams.put( "SCALE", tmp ); 591 } catch ( NumberFormatException e ) { 592 LOG.logError( e.getLocalizedMessage(), e ); 593 throw new InvalidParameterValueException( e ); 594 } 595 } 596 597 return new GetView( version, id, datasetList, elevModel, quality, poi, boundingBox, crs, 598 pitch, yaw, roll, distance, aov, format, bgColor, transparency, 599 imgDimension, exceptions, farClippingPlane, requestParams ); 600 } 601 602 /** 603 * @return the requested angleOfView 604 */ 605 public double getAngleOfView() { 606 return angleOfView; 607 } 608 609 /** 610 * @return the requested distance to the poi 611 */ 612 public double getDistance() { 613 return distance; 614 } 615 616 /** 617 * @return the requested dimension of the resultimage 618 */ 619 public Dimension getImageDimension() { 620 return imageDimension; 621 } 622 623 /** 624 * @return the requested pitch (rotation around the x-axis) 625 */ 626 public double getPitch() { 627 return pitch; 628 } 629 630 /** 631 * 632 * @return the point of interest as Point3d 633 */ 634 public Point3d getPointOfInterest() { 635 return pointOfInterest; 636 } 637 638 /** 639 * @return the quality of the textures 640 */ 641 public double getQuality() { 642 return quality; 643 } 644 645 /** 646 * @return the requested roll (rotation around the y-axis) 647 */ 648 public double getRoll() { 649 return roll; 650 } 651 652 /** 653 * @return if the resultimage should be transparent 654 */ 655 public boolean isTransparent() { 656 return transparent; 657 } 658 659 /** 660 * @return the requested yaw (rotation around the z-axis) 661 */ 662 public double getYaw() { 663 return yaw; 664 } 665 666 /** 667 * @return the requested datasets (e.g. layers or features etc.) 668 */ 669 public List<String> getDatasets() { 670 return datasets; 671 } 672 673 /** 674 * @return the requested color of the background 675 */ 676 public Color getBackgroundColor() { 677 return backgroundColor; 678 } 679 680 /** 681 * @return the requested format of thrown exceptions 682 */ 683 public String getExceptionFormat() { 684 return exceptionFormat; 685 } 686 687 /** 688 * @return the mimetype of the resultimage 689 */ 690 public String getOutputFormat() { 691 return outputFormat; 692 } 693 694 /** 695 * @return the boundingbox of the request 696 */ 697 public Envelope getBoundingBox() { 698 return boundingBox; 699 } 700 701 /** 702 * @return the Coordinate System of the request 703 */ 704 public CoordinateSystem getCrs() { 705 return crs; 706 } 707 708 /** 709 * @return the elevationmodel to be used. 710 */ 711 public String getElevationModel() { 712 return elevationModel; 713 } 714 715 /** 716 * @return Returns the farClippingPlane. 717 */ 718 public double getFarClippingPlane() { 719 return farClippingPlane; 720 } 721 722 /** 723 * @param farClippingPlane 724 * another clippingPlane distance. 725 */ 726 public void setFarClippingPlane( double farClippingPlane ) { 727 this.farClippingPlane = farClippingPlane; 728 } 729 730 /** 731 * @param pitch 732 * a new pitch value 733 */ 734 public void setPitch( double pitch ) { 735 this.pitch = pitch; 736 } 737 738 /** 739 * @param distance 740 * An other distance value. 741 */ 742 public void setDistance( double distance ) { 743 this.distance = distance; 744 } 745 746 /** 747 * @param yaw 748 * An other yaw value. 749 */ 750 public void setYaw( double yaw ) { 751 this.yaw = yaw; 752 } 753 754 /** 755 * @param angleOfView 756 * An other angleOfView value. 757 */ 758 public void setAngleOfView( double angleOfView ) { 759 this.angleOfView = angleOfView; 760 } 761 }