19.3.2 Example: DrmMapping
This example demonstrates DRM of control inputs.
See
The virtual world contains four target
objects as it initially displays: three in a central
column (red, green, blue) and one to
the right (magenta). A screen shot is provided
in figure 19.5.
Do
- Drag the mouse (first button with
SHIFT) in the display or use the ARROW
keys (with SHIFT) to orbit the view in
heading and elevation about the
world origin.
- Drag the mouse (first button) on the
top (red) target or use the ARROW keys
to translate it along the display X-Y axes.
- Drag the mouse (first button) on the
middle (green) target or use the ARROW keys to rotate it about the display Y axis.
- Drag the mouse (first button) on the bottom (blue) target or use the ARROW keys
to scale it along the display X-Y axes.
- Drag the mouse (first button) on the right (magenta) target or use the ARROW
keys to roll the target like a trackball relative to the display.
- Repeat the drag operations from different view directions.
Observe
- All target operations use mouseover to enable the operation.
- All coordinate mapping uses DRM, meaning that manipulation of targets occurs
relative to the display and will always seem intuitive regardless of view direction.
The first code sample below is from the DrmMapping example class. It shows
only those portions pertaining to the translation target and DRM mapping. DRM
mapping is provided by the utility building block buildDrmTranslationMapper from
the IntuitiveBlocks class, which is shown in the second code sample. This block and
others like it combine the framework's intuitive mapping blocks into individual modules
specialized for a given type of geometric manipulation.
Notice in the example code how two different forms are used to specify the DRM
mapper's source space reference node. The first case, for DRM translation, uses
dynamic source node specification. It specifies the source node as null, indicating that
the source node is to be defined by the view associated with the input drag event's
source display. For this form, the local-to-Vworld read capability must be set on all
the view platforms in the application from which the mapper might receive events.
The second one, for DRM rotation, uses static source node specification. It sets the
source node explicitly as the view object, in which case the transform read capability
is automatically set on the view object by the DRM plug-in. This approach is simpler,
but can only be used if the application has a single view.
DRM mapping, with dynamic and static source view
Filename: J3duiBook/ examples/ OverEnabling/ DrmMapping. java
...
// setup manipulation targets
/// translation target
AffineGroup affineXlt = new AffineGroup(new TestThing(
TestThing.BOX_TRANSLATION, TestThing.BALL_DEFAULT));
affineXlt.getTranslation().initActuation(
new Vector4d( 0, 3, 0, 0));
getWorld().addSceneNode( affineXlt);
...
// setup manipulation controls
/// manipulation draggers, first button
InputDragSplitter relDrag = new InputDragSplitter();
ActuationBlocks.buildRelativeDragger(relDrag,
getView(), Input.BUTTON_FIRST,
Input.MODIFIER_NONE, Input.MODIFIER_NONE);
/// manipulation mappers
InputDragTarget mapper;
//// Ex: let event source display define source node
getView().getView().getViewPlatform().setCapability(
Node.ALLOW_LOCAL_TO_VWORLD_READ);
mapper = IntuitiveBlocks.buildDrmTranslationMapper(
affineXlt, null, true);
relDrag.addEventTarget( mapper);
//// Ex: use view object as source node
mapper = IntuitiveBlocks.buildDrmRotationYMapper(
affineRot, getView(), true);
relDrag.addEventTarget( mapper);
...
Utility block with mapping for DRM translation
Filename: J3duiBook/ lib/ j3dui/ utils/ blocks/ IntuitiveBlocks. java
...
/**
Creates an intuitive drag mapper and corresponding source
drag mapper, configures them for DRM translation in view X-Y,
and connects them to the target object.
@param target Target object.
@param view Source display. If null drag source is used.
@param cumulative True if drag actions are cumulative.
@return New building block.
*/
public static final InputDragTarget
buildDrmTranslationMapper(AffineGroup target,
AppView view, boolean cumulative) {
// use target translation node as source space
DirectSourceDragPlugin plugin =
new DirectSourceDragPlugin(
target.getTranslation().getTargetNode());
// build source mapper for target X-Y translation
SourceDragMapper mapper = new SourceDragMapper(
target.getTranslation(), plugin);
mapper.setCumulative(cumulative);
// build DRM mapper
DrmDragPlugin drmPlugin = new DrmDragPlugin();
if(view!= null) drmPlugin = new DrmDragPlugin(view);
IntuitiveDragMapper drmMapper = new IntuitiveDragMapper(
mapper, drmPlugin);
// scale input drag
return new InputDragFilter( drmMapper,
new ScaleInputDragPlugin(new Vector2d(.025, .025)));
}
...
New on the Java Boutique:
New Review:
Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling
API boasts simplicity, ease-of-integration, a well-rounded feature
set, and it's free!
New Applet:
Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA
sequences into three useful formats.
Elsewhere on internet.com:
WebDeveloper Java
Lots of Java information on webdeveloper.com
WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.
ScriptSearch Java
Hundreds of free Java code files to download.
jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.
|