Class SceneExaminer

  • All Implemented Interfaces:
    SafeDisposable

    public class SceneExaminer
    extends SceneInteractor
    Tool class for easily building a basic interactive OpenInventor application without using existing viewer classes.

    The SceneExaminer is an extension of the SceneInteractor node that allows providing the camera and headlight manipulations like panning, zooming and orbiting. The 'headlight', i.e. an SoDirectionalLight node, is automatically aligned with the camera's view direction.
    It also provides a touch event handler that allows manipulating a scene on a touch device.

    See parent class SceneInteractor for more details about the structure of the internal scene graph.
    The SceneExaminer uses an instance of SoCameraInteractor to manipulate the camera in response to OpenInventor events.

    Notes:

    • Window system integration
      The SceneExaminer needs a component that integrates the Open Inventor 3D rendering window with the native window system. System dependent tasks include creating a window, placing the window in the application's user interface, initializing OpenGL and processing the native event/message loop. System independent support for this is provided by the SoRenderAreaCore class. Example components are provided for AWT and SWT toolkits.
    • Event handling
      The SceneExaminer needs a component that builds OpenInventor events (SoEvent) from native system events. System independent support for this is provided by the SoEventBuilder class. Example components are provided for AWT and SWT toolkits: AWTEventToSoEvent and SWTEventToSoEvent.
    • Library
      A basic version of SceneExaminer is a supported part of the Open Inventor API and a prebuilt jar is provided.
    • Source code
      The basic version of SceneExaminer is also provided as source code in the sources folder to allow applications to customize and build their own interactive tool class.
      See $OIVJHOME/source/com/openinventor/inventor/viewercomponents/nodes.
    • Interaction Modes
      SceneExaminer can be either in SceneExaminer.InteractionMode.NAVIGATION mode (the default, similar to viewing mode) or SceneExaminer.InteractionMode.SELECTION mode. The user must press the ESC key to toggle between interaction modes. (Of course this behavior can be modified or replaced by implementing an alternate version of SceneExaminer.) In navigation mode, Open Inventor events are automatically handled to modify the camera according to the current navigation mode, SceneExaminer.NavigationMode.ORBIT (the default) or SceneExaminer.NavigationMode.PLANE, as defined in the Usage section below. Events that are defined in this section are not sent to the application scene graph, but all other events are sent to the application scene graph. Also specific viewing behaviors can be disabled as needed (see for example enableZoom(boolean)). In selection mode, all events are sent to the application scene graph.
    • Scene graph
      The application scene graph should be the last child of the SceneExaminer. The initial application scene graph can be added by simply calling the inherited method addChild(). But note that if you need to replace the application scene graph, for example loading a new data set, do not call removeAllChildren(). That would also remove the SceneExaminer's camera, headlight and event handler nodes. Add an SoSeparator to the SceneExaminer to serve as the "scene graph holder", then add and remove the application scene graph from this node.
    • Clip planes
      SceneExaminer automatically adjusts the 'near' and 'far' clipping planes when events modifying the camera are handled. This adjustment, based on the bounding box of the scene, ensures that shapes will not be clipped as the camera orbits and also that depth buffer precision is maximized. This adjustment is only done in InteractionMode NAVIGATION and can be disabled by setting the environment variable "OIV_SCENE_EXAMINER_AUTO_CLIPPING_PLANES" to false.
      Note: Updating clipping planes after a camera move can be not sufficient. If the scene graph is modified or if a dragger or a rendered shape is moved, they can disappear or become partially clipped. A classic implementation of a render area must adjust clipping planes before each rendering by calling the provided method SceneInteractor.adjustClippingPlanes(SbViewportRegion). See render area's implementations available in $OIVJHOME/examples/inventor/viewercomponents/awt and $OIVJHOME/examples/inventor/viewercomponents/swt folders for examples of adjustClippingPlanes use.

    Compatibility
    Please note that some interaction behaviors are different than the classic Open Inventor viewer classes :

    • In Orbit mode: Left Mouse + Shift: now : Zoom in/out.
    • In Plane mode: Left Mouse + Middle Mouse or Left Mouse + Shift: now : Roll the scene.
    • Mouse wheel in both modes performs a dolly relative to the cursor position , not the center of the viewport.

    • The classic Alt key behavior is not implemented. This key is reserved for application use.
    • The Right Mouse button does not display a popup menu. This button is reserved for application use.

    Usage:

    • Orbit mode:
      • With a mouse
        • Left Mouse: Rotate the scene or seek to point if seek mode is activated.
        • Middle Mouse or Left Mouse + Ctrl: Pan the scene.
        • Left Mouse + Middle Mouse or Middle Mouse + Ctrl or Left Mouse + Shift: Zoom in/out the scene.
        • Mouse Wheel: Zoom in/out (zoom center is the mouse cursor location).
        • Escape key: Switch between navigation mode and selection mode.
        • S key: Activate/Deactivate seek mode.
      • With a touchscreen
        • 1 finger: Rotate the scene.
        • 2 fingers: Rotate the scene on the screen plan, zoom in/out and pan (rotation and zoom center are located between the two fingers).
        • Double tap: Seek to the point located by the finger.
        • Long tap: Enable/Disable selection mode.
    • Plane mode:
      • With a mouse
        • Left Mouse: Zoom in/out or seek to point if seek mode is activated.
        • Middle Mouse or Left Mouse + Ctrl: Pan the scene.
        • Left Mouse + Middle Mouse or Middle Mouse + Ctrl or Left Mouse + Shift: Roll the scene.
        • Mouse Wheel: Zoom in/out (zoom center is the mouse cursor location).
        • Escape key: Switch between navigation mode and selection mode.
        • S key: Activate/Deactivate seek mode.
      • With a touchscreen
        • 1 finger: Pan the scene.
        • 2 fingers: Rotate the scene on the screen plan, zoom in/out and pan (rotation and zoom center are located between the two fingers).
        • Double tap: Seek to the point located by the finger.
        • Long tap: Enable/Disable selection mode.
    • Constructor Detail

      • SceneExaminer

        public SceneExaminer()
    • Method Detail

      • addInteractionModeListener

        public void addInteractionModeListener​(SceneExaminer.InteractionModeListener listener)
        Adds a listener to receive notifications of interaction mode changes.
      • removeInteractionModeListener

        public void removeInteractionModeListener​(SceneExaminer.InteractionModeListener listener)
        Removes the specified listener so that it no longer receives notifications of interaction mode changes.
      • enableSelection

        public void enableSelection​(boolean enabled)
        Enable or disable selection mode.
      • isSelectionEnabled

        public boolean isSelectionEnabled()
        Return if selection is enabled.
      • enableZoom

        public void enableZoom​(boolean enabled)
        Enable or disable zoom.
      • isZoomEnabled

        public boolean isZoomEnabled()
        Return if zoom is enabled.
      • enableRotate

        public void enableRotate​(boolean enabled)
        Enable or disable camera rotate.
      • isRotateEnabled

        public boolean isRotateEnabled()
        Return if rotate is enabled.
      • enableSeek

        public void enableSeek​(boolean enabled)
        Enable or disable seek.
      • isSeekEnabled

        public boolean isSeekEnabled()
        Return if seek is enabled.
      • enablePan

        public void enablePan​(boolean enabled)
        Enable or disable camera panning.
      • isPanEnabled

        public boolean isPanEnabled()
        Return if camera panning is enabled.
      • enableOrbit

        public void enableOrbit​(boolean enabled)
        Enable or disable camera orbiting.
      • isOrbitEnabled

        public boolean isOrbitEnabled()
        Return if camera orbiting is enabled.
      • setSeekMode

        public void setSeekMode​(boolean onOrOff)
        Set the interaction into or out off seek mode (default is off).