| .TH QUATERNION 3 |
| .SH NAME |
| qtom, mtoq, qadd, qsub, qneg, qmul, qdiv, qunit, qinv, qlen, slerp, qmid, qsqrt \- Quaternion arithmetic |
| .SH SYNOPSIS |
| .PP |
| .B |
| #include <draw.h> |
| .PP |
| .B |
| #include <geometry.h> |
| .PP |
| .B |
| Quaternion qadd(Quaternion q, Quaternion r) |
| .PP |
| .B |
| Quaternion qsub(Quaternion q, Quaternion r) |
| .PP |
| .B |
| Quaternion qneg(Quaternion q) |
| .PP |
| .B |
| Quaternion qmul(Quaternion q, Quaternion r) |
| .PP |
| .B |
| Quaternion qdiv(Quaternion q, Quaternion r) |
| .PP |
| .B |
| Quaternion qinv(Quaternion q) |
| .PP |
| .B |
| double qlen(Quaternion p) |
| .PP |
| .B |
| Quaternion qunit(Quaternion q) |
| .PP |
| .B |
| void qtom(Matrix m, Quaternion q) |
| .PP |
| .B |
| Quaternion mtoq(Matrix mat) |
| .PP |
| .B |
| Quaternion slerp(Quaternion q, Quaternion r, double a) |
| .PP |
| .B |
| Quaternion qmid(Quaternion q, Quaternion r) |
| .PP |
| .B |
| Quaternion qsqrt(Quaternion q) |
| .SH 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 |
| .I r |
| and an imaginary vector component \fIv\fP=(\fIi\fP,\fIj\fP,\fIk\fP). |
| Quaternions add componentwise and multiply according to the rule |
| (\fIr\fP,\fIv\fP)(\fIs\fP,\fIw\fP)=(\fIrs\fP-\fIv\fP\v'-.3m'.\v'.3m'\fIw\fP, \fIrw\fP+\fIvs\fP+\fIv\fP×\fIw\fP), |
| where \v'-.3m'.\v'.3m' and × are the ordinary vector dot and cross products. |
| The multiplicative inverse of a non-zero quaternion (\fIr\fP,\fIv\fP) |
| is (\fIr\fP,\fI-v\fP)/(\fIr\^\fP\u\s-22\s+2\d-\fIv\fP\v'-.3m'.\v'.3m'\fIv\fP). |
| .PP |
| The following routines do arithmetic on quaternions, represented as |
| .IP |
| .EX |
| .ta 6n |
| typedef struct Quaternion Quaternion; |
| struct Quaternion{ |
| double r, i, j, k; |
| }; |
| .EE |
| .TF qunit |
| .TP |
| Name |
| Description |
| .TP |
| .B qadd |
| Add two quaternions. |
| .TP |
| .B qsub |
| Subtract two quaternions. |
| .TP |
| .B qneg |
| Negate a quaternion. |
| .TP |
| .B qmul |
| Multiply two quaternions. |
| .TP |
| .B qdiv |
| Divide two quaternions. |
| .TP |
| .B qinv |
| Return the multiplicative inverse of a quaternion. |
| .TP |
| .B qlen |
| Return |
| .BR sqrt(q.r*q.r+q.i*q.i+q.j*q.j+q.k*q.k) , |
| the length of a quaternion. |
| .TP |
| .B qunit |
| Return a unit quaternion |
| .RI ( length=1 ) |
| with components proportional to |
| .IR q 's. |
| .PD |
| .PP |
| A rotation by angle \fIθ\fP about axis |
| .I A |
| (where |
| .I A |
| is a unit vector) can be represented by |
| the unit quaternion \fIq\fP=(cos \fIθ\fP/2, \fIA\fPsin \fIθ\fP/2). |
| The same rotation is represented by \(mi\fIq\fP; a rotation by \(mi\fIθ\fP about \(mi\fIA\fP is the same as a rotation by \fIθ\fP about \fIA\fP. |
| The quaternion \fIq\fP transforms points by |
| (0,\fIx',y',z'\fP) = \%\fIq\fP\u\s-2-1\s+2\d(0,\fIx,y,z\fP)\fIq\fP. |
| 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. |
| .PP |
| The following routines operate on rotations or orientations represented as unit quaternions: |
| .TF slerp |
| .TP |
| .B mtoq |
| Convert a rotation matrix (see |
| .IR matrix (3)) |
| to a unit quaternion. |
| .TP |
| .B qtom |
| Convert a unit quaternion to a rotation matrix. |
| .TP |
| .B slerp |
| Spherical lerp. Interpolate between two orientations. |
| The rotation that carries |
| .I q |
| to |
| .I r |
| is \%\fIq\fP\u\s-2-1\s+2\d\fIr\fP, so |
| .B slerp(q, r, t) |
| is \fIq\fP(\fIq\fP\u\s-2-1\s+2\d\fIr\fP)\u\s-2\fIt\fP\s+2\d. |
| .TP |
| .B qmid |
| .B slerp(q, r, .5) |
| .TP |
| .B qsqrt |
| The square root of |
| .IR q . |
| This is just a rotation about the same axis by half the angle. |
| .PD |
| .SH SOURCE |
| .B \*9/src/libgeometry/quaternion.c |
| .SH SEE ALSO |
| .IR matrix (3), |
| .IR qball (3) |
| .SH BUGS |
| To avoid name conflicts with NetBSD, |
| .I qdiv |
| is a preprocessor macro defined as |
| .IR p9qdiv ; |
| see |
| .IR intro (3). |