plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

quaternion.3 (3545B)


      1 .TH QUATERNION 3
      2 .SH NAME
      3 qtom, mtoq, qadd, qsub, qneg, qmul, qdiv, qunit, qinv, qlen, slerp, qmid, qsqrt \- Quaternion arithmetic
      4 .SH SYNOPSIS
      5 .PP
      6 .B
      7 #include <draw.h>
      8 .PP
      9 .B
     10 #include <geometry.h>
     11 .PP
     12 .B
     13 Quaternion qadd(Quaternion q, Quaternion r)
     14 .PP
     15 .B
     16 Quaternion qsub(Quaternion q, Quaternion r)
     17 .PP
     18 .B
     19 Quaternion qneg(Quaternion q)
     20 .PP
     21 .B
     22 Quaternion qmul(Quaternion q, Quaternion r)
     23 .PP
     24 .B
     25 Quaternion qdiv(Quaternion q, Quaternion r)
     26 .PP
     27 .B
     28 Quaternion qinv(Quaternion q)
     29 .PP
     30 .B
     31 double qlen(Quaternion p)
     32 .PP
     33 .B
     34 Quaternion qunit(Quaternion q)
     35 .PP
     36 .B
     37 void qtom(Matrix m, Quaternion q)
     38 .PP
     39 .B
     40 Quaternion mtoq(Matrix mat)
     41 .PP
     42 .B
     43 Quaternion slerp(Quaternion q, Quaternion r, double a)
     44 .PP
     45 .B
     46 Quaternion qmid(Quaternion q, Quaternion r)
     47 .PP
     48 .B
     49 Quaternion qsqrt(Quaternion q)
     50 .SH DESCRIPTION
     51 The Quaternions are a non-commutative extension field of the Real numbers, designed
     52 to do for rotations in 3-space what the complex numbers do for rotations in 2-space.
     53 Quaternions have a real component
     54 .I r
     55 and an imaginary vector component \fIv\fP=(\fIi\fP,\fIj\fP,\fIk\fP).
     56 Quaternions add componentwise and multiply according to the rule
     57 (\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),
     58 where \v'-.3m'.\v'.3m' and × are the ordinary vector dot and cross products.
     59 The multiplicative inverse of a non-zero quaternion (\fIr\fP,\fIv\fP)
     60 is (\fIr\fP,\fI-v\fP)/(\fIr\^\fP\u\s-22\s+2\d-\fIv\fP\v'-.3m'.\v'.3m'\fIv\fP).
     61 .PP
     62 The following routines do arithmetic on quaternions, represented as
     63 .IP
     64 .EX
     65 .ta 6n
     66 typedef struct Quaternion Quaternion;
     67 struct Quaternion{
     68 	double r, i, j, k;
     69 };
     70 .EE
     71 .TF qunit
     72 .TP
     73 Name
     74 Description
     75 .TP
     76 .B qadd
     77 Add two quaternions.
     78 .TP
     79 .B qsub
     80 Subtract two quaternions.
     81 .TP
     82 .B qneg
     83 Negate a quaternion.
     84 .TP
     85 .B qmul
     86 Multiply two quaternions.
     87 .TP
     88 .B qdiv
     89 Divide two quaternions.
     90 .TP
     91 .B qinv
     92 Return the multiplicative inverse of a quaternion.
     93 .TP
     94 .B qlen
     95 Return
     96 .BR sqrt(q.r*q.r+q.i*q.i+q.j*q.j+q.k*q.k) ,
     97 the length of a quaternion.
     98 .TP
     99 .B qunit
    100 Return a unit quaternion 
    101 .RI ( length=1 )
    102 with components proportional to
    103 .IR q 's.
    104 .PD
    105 .PP
    106 A rotation by angle \fIθ\fP about axis
    107 .I A
    108 (where
    109 .I A
    110 is a unit vector) can be represented by
    111 the unit quaternion \fIq\fP=(cos \fIθ\fP/2, \fIA\fPsin \fIθ\fP/2).
    112 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.
    113 The quaternion \fIq\fP transforms points by
    114 (0,\fIx',y',z'\fP) = \%\fIq\fP\u\s-2-1\s+2\d(0,\fIx,y,z\fP)\fIq\fP.
    115 Quaternion multiplication composes rotations.
    116 The orientation of an object in 3-space can be represented by a quaternion
    117 giving its rotation relative to some `standard' orientation.
    118 .PP
    119 The following routines operate on rotations or orientations represented as unit quaternions:
    120 .TF slerp
    121 .TP
    122 .B mtoq
    123 Convert a rotation matrix (see
    124 .MR matrix (3) )
    125 to a unit quaternion.
    126 .TP
    127 .B qtom
    128 Convert a unit quaternion to a rotation matrix.
    129 .TP
    130 .B slerp
    131 Spherical lerp.  Interpolate between two orientations.
    132 The rotation that carries
    133 .I q
    134 to
    135 .I r
    136 is \%\fIq\fP\u\s-2-1\s+2\d\fIr\fP, so
    137 .B slerp(q, r, t)
    138 is \fIq\fP(\fIq\fP\u\s-2-1\s+2\d\fIr\fP)\u\s-2\fIt\fP\s+2\d.
    139 .TP
    140 .B qmid
    141 .B slerp(q, r, .5)
    142 .TP
    143 .B qsqrt
    144 The square root of
    145 .IR q .
    146 This is just a rotation about the same axis by half the angle.
    147 .PD
    148 .SH SOURCE
    149 .B \*9/src/libgeometry/quaternion.c
    150 .SH SEE ALSO
    151 .MR matrix (3) ,
    152 .MR qball (3)
    153 .SH BUGS
    154 To avoid name conflicts with NetBSD,
    155 .I qdiv
    156 is a preprocessor macro defined as 
    157 .IR p9qdiv ;
    158 see
    159 .MR intro (3) .