It's useful to work with the set of coordinate systems restricted to those that use orthogonal unit-scaled axes, that is, that are subject only to rotation and translation. This is because these coordinate systems are the describe rigid objects.

- up :: a -> FUR a
- down :: a -> FUR a
- left :: a -> FUR a
- right :: a -> FUR a
- forward :: a -> FUR a
- backward :: a -> FUR a
- orthogonalFrame :: AffineTransformable a => FUR Vector3D -> FUR Vector3D -> a -> a
- modelLookAt :: AffineTransformable a => Point3D -> FUR (Either Point3D Vector3D) -> FUR (Either Point3D Vector3D) -> a -> a
- data FUR a

# Documentation

orthogonalFrame :: AffineTransformable a => FUR Vector3D -> FUR Vector3D -> a -> aSource

Combine two axial references to describe a rigid affine transformation. Accepts any combination of non-coaxial references. In the affine transformation, the old axes will be mapped onto the specified freeform axes.

The first parameter is absolute, meaning that the source axis will always map perfectly onto the destination axis. The second parameter will be obeyed on a best effort basis.

modelLookAt :: AffineTransformable a => Point3D -> FUR (Either Point3D Vector3D) -> FUR (Either Point3D Vector3D) -> a -> aSource

Translates and rotates a model to aim at a given position or in a
given direction from a given vantage point. This is analogous
to camera look-at functions, and could be used, for example, to
cause a model of an eyeball to track a particular target.
The first parameter is the position of the model. Typically the second
parameter will be the position of the target, and the third parameter will
`(up $ Vector3D 0 1 0)`

.