|
NAME
| |
qtom, mtoq, qadd, qsub, qneg, qmul, qdiv, qunit, qinv, qlen, slerp,
qmid, qsqrt – Quaternion arithmetic
|
SYNOPSIS
| |
#include <draw.h>
#include <geometry.h>
Quaternion qadd(Quaternion q, Quaternion r)
Quaternion qsub(Quaternion q, Quaternion r)
Quaternion qneg(Quaternion q)
Quaternion qmul(Quaternion q, Quaternion r)
Quaternion qdiv(Quaternion q, Quaternion r)
Quaternion qinv(Quaternion q)
double qlen(Quaternion p)
Quaternion qunit(Quaternion q)
void qtom(Matrix m, Quaternion q)
Quaternion mtoq(Matrix mat)
Quaternion slerp(Quaternion q, Quaternion r, double a)
Quaternion qmid(Quaternion q, Quaternion r)
Quaternion qsqrt(Quaternion q)
|
DESCRIPTION
| |
The Quaternions are a non-commutative extension field of the Real
numbers, designed to do for rotations in 3-space what the complex
numbers do for rotations in 2-space. Quaternions have a real component
r and an imaginary vector component v=(i,j,k). Quaternions add
componentwise and multiply according to the rule (r,v)(s,w)=(rs-v.w,
rw+vs+vxw), where . and x are the ordinary vector dot and cross
products. The multiplicative inverse of a non-zero quaternion
(r,v) is (r,-v)/(r2-v.v).
The following routines do arithmetic on quaternions, represented
as
| |
typedef struct Quaternion Quaternion;
struct Quaternion{
};
|
Name Description
qadd Add two quaternions.
qsub Subtract two quaternions.
qneg Negate a quaternion.
qmul Multiply two quaternions.
qdiv Divide two quaternions.
qinv Return the multiplicative inverse of a quaternion.
qlen Return sqrt(q.r*q.r+q.i*q.i+q.j*q.j+q.k*q.k), the length of
a quaternion.
qunit Return a unit quaternion (length=1) with components proportional
to q’s.
A rotation by angle θ about axis A (where A is a unit vector)
can be represented by the unit quaternion q=(cos θ/2, Asin θ/2).
The same rotation is represented by -q; a rotation by -θ about -A
is the same as a rotation by θ about A. The quaternion q transforms
points by (0,x’,y’,z’) = q-1(0,x,y,z)q. Quaternion multiplication
composes rotations. The
orientation of an object in 3-space can be represented by a quaternion
giving its rotation relative to some ‘standard’ orientation.
The following routines operate on rotations or orientations represented
as unit quaternions:
mtoq Convert a rotation matrix (see matrix(3)) to a unit quaternion.
qtom Convert a unit quaternion to a rotation matrix.
slerp Spherical lerp. Interpolate between two orientations. The
rotation that carries q to r is q-1r, so slerp(q, r, t) is q(q-1r)t.
qmid slerp(q, r, .5)
qsqrt The square root of q. This is just a rotation about the same
axis by half the angle.
|
SOURCE
SEE ALSO
BUGS
| |
To avoid name conflicts with NetBSD, qdiv is a preprocessor macro
defined as p9qdiv; see intro(3).
|
|
|