The spinctrl is an iOS app for controlling an interactive pointer in SPIN.
This is a screenshot from the app, identifying the important features:
a) A button to re-calibrate the device, since it was found to drift by several dozens of degrees after a period of use.
b) Buttons to select a manipulator. If an object in the scene is currently selected, then the new 3D widget will replace the existing one. If no object is selected, the PointerNode is tested for intersections and the manipulator will be enabled on the first valid object being pointed. If the PointerNode is not intersecting with any valid node, the chosen manipulator will be remembered for the next big button press.
c) The big selection and manipulation button, which users press and hold during manipulation.
d) The slider on the side is used for two purposes: First, when no node is selected it controls camera motion, allowing the user to "fly" in the direction of the pointer. The user touches and holds his or her finger on the slider and the camera travels with that velocity. Note that the scaling is exponential, giving the user finer control for slow speeds. The second use of the slider is when the Grabber manipulator is being used. The slider controls the speed at which an object slides up and down the pointer's ray (again, using exponential scaling).
e) The eye button causes the camera to snap and look toward the currently manipulated object. Although the camera was originally developed to continuously follow a target, it was found to be confusing when a manipulation also affected camera motion. Thus, the user must explicitly snap the camera to its target, or manually control the camera using the slider.
Once a node is selected by PointerNode, the user may choose one of four manipulators with which to control the node. The Grabber is specifically intended to be used with PointerNode, while all other can be used with EITHER the PointerNode or image plane interactions (i.e., a mouse or touchscreen).
The Grabber is perhaps most true to the spirit of traditional ray casting techniques. The user points the ray at nodes in the scene, and presses and holds a clutch (button) to manipulate the first node intersected by the ray. The node is grabbed and becomes locked to the ray such that it orbits in an arc around the user as he or she rotates the pointer.
Through practical use of this metaphor, it was found that the implicit change in orientation of the node while being moved was undesirable. Thus, two modes of grabbing exist: NORMAL and ORIENTATION_LOCK. The normal mode is more natural since grabbing an object with your hand, turning 180 degrees, and putting it down, naturally results in the object being rotated by 180 degrees. The locked mode on the other hand, keeps the global orientation locked to that at the time of the grab, which results in something less natural in appearance (since the object always maintains its original orientation), but more practical for quick translations. Obviously, the user may switch between these modes as desired.
In addition to the control of pointer orientation, while a node is grabbed, the user may slide the node along the ray and may also rotate the node about the ray's axis.
The ThreeAxis manipulator provides constrained translation along the object's local X, Y, and Z axes without affecting rotation or scaling. The user points at one of the arrow handles sticking out from the object, presses and holds the clutching button, and applies a motion that moves the node in the handle's direction. The technique works using either PointerNode or a mouse, since in the case of a mouse, an equivalent pointer can be cast into the scene using perspective projection. The amount of translation applied is determined by using an algorithm to find the closest points of two non-parallel lines. We use the difference of the initial position and the closest point on the handle's line to the pointer to control the translational offset.
The Trackball manipulator is an implementation of the well-known ARCBALL method first described by Shoemake in 1985. It allows the user to click on the surface of a sphere, drag in some direction and the object rotates to follow the dragging motion. It is often described as being the best known 2D technique for 3D rotation.
In addition to allowing free rotation of the sphere, we provide three manipulation widgets (orthogonal rings) that lock the rotation of the trackball to one of the object's local axes.
The TabBox manipulator is a method of specifying local working planes on which to translate an object. The user can click on any of the six planes formed by the bounding box around the object, and move the object such that it remains locked to that plane. This uses a simple line-plane intersection to translate the object to the point at which the ray intersects the plane.
Additionally, small tabs are located in each corner of each plane, which produce a scaling of the object, also constrained to the plane.