View Javadoc

    1   /*
    2    * @(#) ViewBranch.java May 10, 2004
    3    *
    4    * Copyright (c) 2002-2005 Delft University of Technology Jaffalaan 5, 2628 BX
    5    * Delft, the Netherlands. All rights reserved.
    6    *
    7    * This software is proprietary information of Delft University of Technology
    8    * The code is published under the Lesser General Public License
    9    */
    10  package nl.tudelft.simulation.dsol.gui.animation3D;
    11
    12  import javax.media.j3d.BoundingSphere;
    13  import javax.media.j3d.BranchGroup;
    14  import javax.media.j3d.Canvas3D;
    15  import javax.media.j3d.PhysicalBody;
    16  import javax.media.j3d.PhysicalEnvironment;
    17  import javax.media.j3d.Transform3D;
    18  import javax.media.j3d.TransformGroup;
    19  import javax.media.j3d.View;
    20  import javax.media.j3d.ViewPlatform;
    21  import javax.vecmath.Point3d;
    22  import javax.vecmath.Vector3f;
    23
    24  import nl.tudelft.simulation.dsol.gui.animation3D.mouse.RotateXYMouseBehavior;
    25  import nl.tudelft.simulation.dsol.gui.animation3D.mouse.TranslateMouseBehavior;
    26  import nl.tudelft.simulation.dsol.gui.animation3D.mouse.ZoomMouseBehavior;
    27
    28  import com.sun.j3d.utils.behaviors.mouse.MouseBehavior;
    29
    30  /***
    31   * ViewBranch, the view platform of the scene graph <br>
    32   * (c) copyright 2002-2005 <a href="http://www.simulation.tudelft.nl">Delft
    33   * University of Technology </a>, the Netherlands. <br>
    34   * See for project information <a
    35   * href="http://www.simulation.tudelft.nl">www.simulation.tudelft.nl </a> <br>
    36   * License of use: <a href="http://www.gnu.org/copyleft/lesser.html">Lesser
    37   * General Public License (LGPL) </a>, no warranty.
    38   *
    39   * @version $Revision$ $Date$
    40   * @author <a href="http://www.tbm.tudelft.nl/webstaf/royc/index.htm">Roy Chin
    41   *         </a>
    42   */
    43  public class ViewBranch extends BranchGroup
    44  {
    45  	/*** Rotate around X-axis */
    46  	protected Transform3D rotateX = new Transform3D();
    47
    48  	/*** Rotate around Y-axis */
    49  	protected Transform3D rotateY = new Transform3D();
    50
    51  	/*** Zoom */
    52  	protected Transform3D zoom = new Transform3D();
    53
    54  	/*** Translation */
    55  	protected Transform3D translation = new Transform3D();
    56
    57  	/*** Rotation around the y-axis of view platform */
    58  	protected TransformGroup rotateYGroup;
    59
    60  	/*** Rotation around the x-axis of view platform */
    61  	protected TransformGroup rotateXGroup;
    62
    63  	/*** Zoom of view platform */
    64  	protected TransformGroup zoomGroup;
    65
    66  	/*** Translation of view platform */
    67  	protected TransformGroup translateGroup;
    68
    69  	/***
    70  	 * Constructs the view branch
    71  	 *
    72  	 * @param canvas3D A canvas3D
    73  	 */
    74  	public ViewBranch(final Canvas3D canvas3D)
    75  	{
    76  		super();
    77  		createBranch(canvas3D);
    78  	}
    79
    80  	/***
    81  	 * Create the view branch
    82  	 *
    83  	 * @param canvas3D A canvas3D
    84  	 */
    85  	protected void createBranch(final Canvas3D canvas3D)
    86  	{
    87  		// Transformation of the view
    88  		this.rotateX.set(new Vector3f(0.0f, 0.0f, 0.0f));
    89  		this.rotateY.set(new Vector3f(0.0f, 0.0f, 0.0f));
    90  		this.zoom.set(new Vector3f(0.0f, 0.0f, 10.0f));
    91  		this.translation.set(new Vector3f(0.0f, 1.0f, 0.0f));
    92
    93  		// Parent of view platform elements
    94  		this.rotateYGroup = new TransformGroup(this.rotateY);
    95  		this.rotateXGroup = new TransformGroup(this.rotateX);
    96  		this.zoomGroup = new TransformGroup(this.zoom);
    97  		this.translateGroup = new TransformGroup(this.translation);
    98
    99  		// Allow read write
    100 		this.rotateYGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    101 		this.rotateYGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    102 		this.rotateXGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    103 		this.rotateXGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    104 		this.zoomGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    105 		this.zoomGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    106 		this.translateGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    107 		this.translateGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    108
    109 		// The view platform
    110 		ViewPlatform viewPlatform = new ViewPlatform();
    111
    112 		// Mouse
    113 		RotateXYMouseBehavior mouseRotate = new RotateXYMouseBehavior(
    114 				MouseBehavior.INVERT_INPUT);
    115 		mouseRotate.setTransformGroup(this.rotateYGroup);
    116 		mouseRotate.setTransformGroupX(this.rotateXGroup);
    117 		mouseRotate.setFactor(0.1);
    118 		this.rotateYGroup.addChild(mouseRotate);
    119 		BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
    120 				1000.0);
    121 		mouseRotate.setSchedulingBounds(bounds);
    122
    123 		ZoomMouseBehavior mouseZoom = new ZoomMouseBehavior(canvas3D,
    124 				MouseBehavior.INVERT_INPUT);
    125 		// mouseZoom.setTransformGroup(this.zoomGroup);
    126 		mouseZoom.setTransformGroup(this.translateGroup);
    127 		mouseZoom.setSchedulingBounds(bounds);
    128 		mouseZoom.setRotateXGroup(this.rotateXGroup);
    129 		mouseZoom.setRotateYGroup(this.rotateYGroup);
    130 		this.zoomGroup.addChild(mouseZoom);
    131
    132 		TranslateMouseBehavior mouseTranslate = new TranslateMouseBehavior(
    133 				canvas3D, MouseBehavior.INVERT_INPUT);
    134 		mouseTranslate.setTransformGroup(this.translateGroup);
    135 		mouseTranslate.setSchedulingBounds(bounds);
    136 		mouseTranslate.setRotateXGroup(this.rotateXGroup);
    137 		mouseTranslate.setRotateYGroup(this.rotateYGroup);
    138 		this.translateGroup.addChild(mouseTranslate);
    139
    140 		// Create physical elements: the viewer himself
    141 		PhysicalBody body = new PhysicalBody();
    142 		PhysicalEnvironment environment = new PhysicalEnvironment();
    143
    144 		// Put it all together
    145 		/*
    146 		 * this.rotateYGroup.addChild(this.rotateXGroup);
    147 		 * this.rotateXGroup.addChild(this.zoomGroup);
    148 		 * this.zoomGroup.addChild(this.translateGroup);
    149 		 * this.translateGroup.addChild(viewPlatform);
    150 		 * this.addChild(this.rotateYGroup);
    151 		 */
    152
    153 		this.translateGroup.addChild(this.rotateYGroup);
    154 		this.rotateYGroup.addChild(this.rotateXGroup);
    155 		this.rotateXGroup.addChild(this.zoomGroup);
    156 		this.zoomGroup.addChild(viewPlatform);
    157 		this.addChild(this.translateGroup);
    158
    159 		View view = new View();
    160 		// Set back clip distance to 5000 meters for the
    161 		// time being.
    162 		view.setBackClipDistance(5000);
    163 		view.addCanvas3D(canvas3D);
    164 		view.attachViewPlatform(viewPlatform);
    165 		view.setPhysicalBody(body);
    166 		view.setPhysicalEnvironment(environment);
    167 	}
    168
    169 	/***
    170 	 * Reset the view to the original setting
    171 	 */
    172 	public void resetView()
    173 	{
    174 		this.rotateYGroup.setTransform(this.rotateY);
    175 		this.rotateXGroup.setTransform(this.rotateX);
    176 		this.zoomGroup.setTransform(this.zoom);
    177 		this.translateGroup.setTransform(this.translation);
    178 	}
    179
    180 	/***
    181 	 * @return RotateX
    182 	 */
    183 	public Transform3D getRotateX()
    184 	{
    185 		return this.rotateX;
    186 	}
    187
    188 	/***
    189 	 * @return RotateY
    190 	 */
    191 	public Transform3D getRotateY()
    192 	{
    193 		return this.rotateY;
    194 	}
    195
    196 	/***
    197 	 * @return Translation
    198 	 */
    199 	public Transform3D getTranslation()
    200 	{
    201 		return this.translation;
    202 	}
    203
    204 	/***
    205 	 * @return Zoom
    206 	 */
    207 	public Transform3D getZoom()
    208 	{
    209 		return this.zoom;
    210 	}
    211
    212 	/***
    213 	 * @param rotateX Rotation around X-axis
    214 	 */
    215 	public void setRotateX(final Transform3D rotateX)
    216 	{
    217 		this.rotateX = rotateX;
    218 		this.rotateXGroup.setTransform(rotateX);
    219 	}
    220
    221 	/***
    222 	 * @param rotateY Rotation around Y-axis
    223 	 */
    224 	public void setRotateY(final Transform3D rotateY)
    225 	{
    226 		this.rotateY = rotateY;
    227 		this.rotateYGroup.setTransform(rotateY);
    228 	}
    229
    230 	/***
    231 	 * @param translation Translation
    232 	 */
    233 	public void setTranslation(final Transform3D translation)
    234 	{
    235 		this.translation = translation;
    236 		this.translateGroup.setTransform(translation);
    237 	}
    238
    239 	/***
    240 	 * @param zoom Zoom factor
    241 	 */
    242 	public void setZoom(final Transform3D zoom)
    243 	{
    244 		this.zoom = zoom;
    245 		this.zoomGroup.setTransform(zoom);
    246 	}
    247
    248 }