152 lines
3.3 KiB
Plaintext
152 lines
3.3 KiB
Plaintext
|
.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)
|