Example usage for org.apache.commons.math3.geometry.euclidean.threed RotationOrder ZXZ

List of usage examples for org.apache.commons.math3.geometry.euclidean.threed RotationOrder ZXZ

Introduction

In this page you can find the example usage for org.apache.commons.math3.geometry.euclidean.threed RotationOrder ZXZ.

Prototype

RotationOrder ZXZ

To view the source code for org.apache.commons.math3.geometry.euclidean.threed RotationOrder ZXZ.

Click Source Link

Document

Set of Euler angles.

Usage

From source file:edu.mit.fss.examples.visual.gui.WorldWindVisualization.java

/**
 * Instantiates a new world wind visualization.
 *
 * @throws OrekitException the orekit exception
 *///  www . j  a  va 2s. c  o  m
public WorldWindVisualization() throws OrekitException {
    logger.trace("Creating Orekit reference frames.");
    eme = ReferenceFrame.EME2000.getOrekitFrame();
    itrf = ReferenceFrame.ITRF2008.getOrekitFrame();
    // world wind frame is a fixed rotation from Earth inertial frame
    wwj = new Frame(itrf, new Transform(date, new Rotation(RotationOrder.ZXZ, 0, -Math.PI / 2, -Math.PI / 2)),
            "World Wind");

    logger.trace("Creating World Window GL canvas and adding to panel.");
    wwd = new WorldWindowGLCanvas();
    wwd.setModel(new BasicModel());
    wwd.setPreferredSize(new Dimension(800, 600));
    setLayout(new BorderLayout());
    add(wwd, BorderLayout.CENTER);

    logger.trace("Creating and adding a renderable layer.");
    displayLayer = new RenderableLayer();
    wwd.getModel().getLayers().add(displayLayer);

    logger.trace("Creating and adding a marker layer.");
    markerLayer = new MarkerLayer();
    // allow markers above/below surface
    markerLayer.setOverrideMarkerElevation(false);
    wwd.getModel().getLayers().add(markerLayer);

    logger.trace("Creating and adding a sun renderable.");
    Vector3D position = sun.getPVCoordinates(date, wwj).getPosition();
    sunShape = new Ellipsoid(wwd.getModel().getGlobe().computePositionFromPoint(convert(position)), 696000000.,
            696000000., 696000000.);
    ShapeAttributes sunAttributes = new BasicShapeAttributes();
    sunAttributes.setInteriorMaterial(Material.YELLOW);
    sunAttributes.setInteriorOpacity(1.0);
    sunShape.setAttributes(sunAttributes);
    displayLayer.addRenderable(sunShape);

    logger.trace("Creating and adding a terminator.");
    LatLon antiSun = LatLon.fromRadians(-sunShape.getCenterPosition().getLatitude().radians,
            FastMath.PI + sunShape.getCenterPosition().getLongitude().radians);
    // set radius to a quarter Earth chord at the anti-sun position less
    // a small amount (100 m) to avoid graphics problems
    terminatorShape = new SurfaceCircle(antiSun,
            wwd.getModel().getGlobe().getRadiusAt(antiSun) * FastMath.PI / 2 - 100);
    ShapeAttributes nightAttributes = new BasicShapeAttributes();
    nightAttributes.setInteriorMaterial(Material.BLACK);
    nightAttributes.setInteriorOpacity(0.5);
    terminatorShape.setAttributes(nightAttributes);
    displayLayer.addRenderable(terminatorShape);

    logger.trace("Creating and adding a panel for buttons.");
    JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
    buttonPanel.add(new JCheckBox(new AbstractAction("Inertial Frame") {
        private static final long serialVersionUID = 2287109397693524964L;

        @Override
        public void actionPerformed(ActionEvent e) {
            setInertialFrame(((JCheckBox) e.getSource()).isSelected());
        }
    }));
    buttonPanel.add(new JButton(editOptionsAction));
    add(buttonPanel, BorderLayout.SOUTH);

    logger.trace(
            "Creating a timer to rotate the sun renderable, " + "terminator surface circle, and stars layer.");
    Timer rotationTimer = new Timer(15, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            wwd.redraw();
            try {
                BasicOrbitView wwdView;
                if (wwd.getView() instanceof BasicOrbitView) {
                    wwdView = (BasicOrbitView) wwd.getView();
                } else {
                    return;
                }

                // rotate camera to simulate inertial frame
                if (wwd.getView().isAnimating() || !inertialFrame.get()) {
                    // update eme datum
                    rotationDatum = wwj.getTransformTo(eme, date)
                            .transformPosition(convert(wwdView.getCenterPoint()));
                } else if (inertialFrame.get()) {
                    Position newCenter = wwd.getModel().getGlobe().computePositionFromPoint(
                            convert(eme.getTransformTo(wwj, date).transformPosition(rotationDatum)));
                    // move to eme datum
                    wwdView.setCenterPosition(newCenter);
                }

                // rotate stars layer
                for (Layer layer : wwd.getModel().getLayers()) {
                    if (layer instanceof StarsLayer) {
                        StarsLayer stars = (StarsLayer) layer;
                        // find the EME coordinates of (0,0)
                        Vector3D emeDatum = wwj.getTransformTo(eme, date).transformPosition(convert(
                                wwd.getModel().getGlobe().computePointFromLocation(LatLon.fromDegrees(0, 0))));
                        // find the WWJ coordinates the equivalent point in ITRF
                        Vector3D wwjDatum = itrf.getTransformTo(wwj, date).transformPosition(emeDatum);
                        // set the longitude offset to the opposite of 
                        // the difference in longitude (i.e. from 0)
                        stars.setLongitudeOffset(wwd.getModel().getGlobe()
                                .computePositionFromPoint(convert(wwjDatum)).getLongitude().multiply(-1));
                    }
                }
            } catch (OrekitException ex) {
                logger.error(ex);
            }
        }
    });
    // set initial 2-second delay for initialization
    rotationTimer.setInitialDelay(2000);
    rotationTimer.start();
}