Blame


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