desktopNode.getLocalRotation().normalize();
    private void createRotateButton( JDesktopPane parent, final float direction ) {        JButton button = new JButton( direction < 0 ? "<" : ">" );        button.setSize( button.getPreferredSize() );        button.setLocation( (int) ( ( display.getWidth() - button.getWidth() ) / 2                + direction * display.getWidth() ), display.getHeight() - 40 - button.getHeight() / 2 );        parent.add( button );        button.addActionListener( new ActionListener() {            public void actionPerformed( ActionEvent e ) {                if ( desktopNode.getRenderQueueMode() != Renderer.QUEUE_ORTHO ) {                    desktopNode.addController( new Controller() {                        float length = 1;                        float endTime = timer.getTimeInSeconds() + length;                        Quaternion start = new Quaternion().set( desktopNode.getLocalRotation() );                        Quaternion finish = new Quaternion().set( desktopNode.getLocalRotation() ).multLocal(                                new Quaternion().fromAngleNormalAxis( direction, new Vector3f( 0, 1, 0 ) ) );                        public void update( float time ) {                            if ( timer.getTimeInSeconds() > endTime ) {                                desktopNode.removeController( this );                            }                            else {                                desktopNode.getLocalRotation().slerp( finish, start, ( endTime - timer.getTimeInSeconds() ) / length );                            }                        }                    } );                }            }        } );    }