Expand description
Virtual Trackball Orbiting via the Exponential Map
This is an alternative trackball technique using exponential map and parallel transport to preserve distances and angles for inducing coherent and intuitive trackball rotations. For instance, displacements on straight radial lines through the screen’s center are carried to arcs of the same length on great circles of the trackball. This is in contrast to state-of-the-art techniques using orthogonal projection which distorts radial distances further away from the screen’s center.1
§Features
- Common trackball operations split into several operation handlers.
- Coherent and intuitive orbiting via the exponential map, see
Orbitoperation handler. - Identical C11 implementation for
Orbitoperation handler behindccfeature gate. - Coherent
Firstperson view aka free look or mouse look wrtOrbitoperation handler. - Observer
FramewithFrame::slide(),Frame::orbit(),Frame::scale()operations in world space and their local complements in camera space and with orbit and slide operations around arbitrary points in either world or camera space. - Gliding
Clampoperation handler trait ensuring boundary conditions of observerFrame. WhenDeltabetween initial and finalFrameis not orthogonal to a boundaryPlane,Deltais changed in such a way that the clamped movement glides along the plane. BoundimplementingClampproviding customizable orthogonal boundary conditions.- Object inspection mode scaling clip plane distances by measuring from target instead of eye.
- Scale-preserving transitioning between orthographic and perspective projection mode.
- Converting between
Fixedquantities wrt to field of view, seeScope::set_fov(). - Time-free
Touchgesture recognition for slide, orbit, scale, and focus operations.
§Optional Features
Following features are disabled unless their corresponding feature gate is enabled:
glamfor converting betweennalgebraandglamtypes.serdeforserdesupport of various structures of this crate and its dependencies.rkyvforrkyvsupport of various structures of this crate and its dependencies.ccfor testing the behaviorally identical C implementation of the exponential map.
§Example
A trackball camera mode implementation can be as easy as this by delegating events of your 3D
graphics library of choice to the Orbit operation handler along with other handlers.
use trackball::{
nalgebra::{Point2, Vector3},
Frame, Image, Orbit,
};
/// Trackball camera mode.
pub struct Trackball {
// Frame wrt camera eye and target.
frame: Frame<f32>,
// Image as projection of `Scope` wrt `Frame`.
image: Image<f32>,
// Orbit induced by displacement on screen.
orbit: Orbit<f32>,
}
impl Trackball {
// Usually, a cursor position event with left mouse button being pressed.
fn handle_left_button_displacement(&mut self, pos: &Point2<f32>) {
// Maximum position as screen's width and height.
let max = self.image.max();
// Induced rotation in camera space.
let rot = self.orbit.compute(&pos, max).unwrap_or_default();
// Apply induced rotation to local observer frame.
self.frame.local_orbit(&rot);
}
// Event when left mouse button is released again.
fn handle_left_button_release(&mut self) {
// Can also or instead be invoked on `Self::handle_left_button_press()`.
self.orbit.discard();
}
}G. Stantchev, “Virtual Trackball Modeling and the Exponential Map”, S2CID 44199608 (2004) , Archived PDF ↩
Re-exports§
Structs§
- Bound
- Orthogonal boundary conditions implementing
Clamp. - First
- First person view induced by displacement on screen.
- Frame
- Frame wrt camera eye and target.
- Image
- Image as projection of
ScopewrtFrame. - Orbit
- Orbit induced by displacement on screen.
- Plane
- Plane encoding position with singed bias along unit normal.
- Scale
- Scale induced by relative input.
- Scope
- Scope defining enclosing viewing frustum.
- Slide
- Slide induced by displacement on screen.
- Touch
- Touch gestures inducing slide, orbit, scale, and focus.