|
Observe
- All target operations use mouseover to enable the operation.
- The three orthogonal planes are the source objects for WRM dragging.
- The left (red) target uses full WRM coordinate mapping, meaning that target
manipulation occurs relative to the source planes throughout the operation. The
drag will only start and continue as long as the cursor stays over a source plane.
- The middle (green) target uses quasi-WRM coordinate mapping, meaning that
target manipulation occurs relative to the source plane at the start of the operation.
The drag must start over a source plane but can continue beyond it because
it uses a picking plane.
- The bottom (blue) target uses pseudo-WRM coordinate mapping, meaning that
target manipulation occurs relative to a predefined source object, specifically the
bottom plane. The drag does not rely on the source planes to start or continue.
- For WRM and quasi-WRM translation, at drag start the target origin jumps to
the source position under the cursor. The target does not appear stuck to the
cursor throughout the drag.
- For pseudo-WRM translation, the target does not jump, and it appears stuck to
the cursor throughout the drag regardless of viewing angle.
The first code sample following is from the WrmMapping example class. It shows
only those portions that pertain to WRM manipulation. Notice that absolute input
dragging is used, and that the three orthogonal planes in the scene serve as the source
objects. The utility building blocks buildWrmTranslationMapper, buildWrmSpher-eMapper,
and buildStickWrmTranslationMapper from the IntuitiveBlocks class provide
WRM mapping, which are also shown below. The first two blocks take a
WrmPlugin as one of its input parameters, and combine it with other intuitive map-ping
blocks, including source space relative origin filtering, to form modules specialized
for a given type of geometric manipulation. The third block combines a target
picker and a PseudoWrmDragPlugin in a convenient package for WRM dragging with
a sticky cursor.
Notice that the WRM source picker is configured so that all hits are checked, not
just the closest one. For true WRM, this allows picking during the drag to correctly
determine the hit position on the underlying source planes even when the target object
is dragged behind other target objects.
Setup for various forms of WRM mapping
Filename: J3duiBook/ examples/ OverEnabling/ WrmMapping. java
...
// setup WRM
/// build source plane X
...
/// build source plane Y
...
/// build source plane Z
...
/// build source picker
ArrayList wrmSourceList = new ArrayList();
wrmSourceList.add( planeX);
wrmSourceList.add( planeY);
wrmSourceList.add( planeZ);
PickEngine wrmSourcePicker = new PickEngine(
getWorld().getSceneRoot(), wrmSourceList);
wrmSourcePicker.setHitAll(true);
// setup manipulation controls
/// translation draggers, first button
InputDragSplitter absXlate = new InputDragSplitter();
ActuationBlocks.buildAbsoluteDragger(absXlate,
getView(), Input.BUTTON_FIRST,
Input.MODIFIER_NONE, Input.MODIFIER_NONE);
...
/// manipulation mappers
InputDragTarget mapper;
//// WRM: world translation, source rotation
mapper = IntuitiveBlocks.buildWrmTranslationMapper(
affineWrm, new WrmDragPlugin(null, wrmSourcePicker),
false, false);
absXlate.addEventTarget(mapper);
mapper = IntuitiveBlocks.buildWrmSphereMapper(
sphereWrm, new WrmDragPlugin(wrmSourcePicker),
true, true);
absRotate.addEventTarget(mapper);
//// Quasi-WRM: world translation, source rotation
mapper = IntuitiveBlocks.buildWrmTranslationMapper(
affineQWrm, new QuasiWrmDragPlugin(null,
wrmSourcePicker), false, false);
absXlate.addEventTarget(mapper);
mapper = IntuitiveBlocks.buildWrmSphereMapper(
sphereQWrm, new QuasiWrmDragPlugin(wrmSourcePicker),
true, true);
absRotate.addEventTarget(mapper);
//// Pseudo-WRM: picked translation, fixed rotation
mapper = IntuitiveBlocks.buildStickyWrmTranslationMapper(
planeY, affinePWrm, getWorld().getSceneRoot(),
true, true);
absXlate.addEventTarget(mapper);
mapper = IntuitiveBlocks.buildWrmSphereMapper(
spherePWrm, new PseudoWrmDragPlugin(planeY,
affinePWrm), true, true);
absRotate.addEventTarget(mapper);
...
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.
|