151 lines
3.3 KiB
Text
151 lines
3.3 KiB
Text
.TH QUATERNION 2
|
||
.SH NAME
|
||
qtom, mtoq, qadd, qsub, qneg, qmul, qdiv, qunit, qinv, qlen, slerp, qmid, qsqrt \- Quaternion arithmetic
|
||
.SH SYNOPSIS
|
||
.B
|
||
#include <draw.h>
|
||
.br
|
||
.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 (2))
|
||
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 /sys/src/libgeometry/quaternion.c
|
||
.SH SEE ALSO
|
||
.IR matrix (2),
|
||
.IR qball (2)
|