Rapier C — 3D / f64
0.36.0+c.0
Toggle main menu visibility
Loading...
Searching...
No Matches
rapier_math.h
Go to the documentation of this file.
1
9
#ifndef RAPIER_MATH_H
10
#define RAPIER_MATH_H
11
#include "
rapier.h
"
12
#include <math.h>
13
14
#if defined(RAPIER_DIM2)
16
#define R2_PI ((R2Real)3.14159265358979323846)
17
#else
19
#define R3_PI ((R3Real)3.14159265358979323846)
20
#endif
21
22
/* Value constructors and arithmetic for Rapier's public C math types. */
23
#if defined(RAPIER_DIM2)
25
static
inline
RAPIER_TYPE
(Vector)
RAPIER_FN
(Vector)(
RAPIER_TYPE
(Real) x,
RAPIER_TYPE
(Real) y) {
26
RAPIER_TYPE
(Vector) result = {x, y};
27
return
result;
28
}
29
31
static
inline
RAPIER_TYPE
(Rotation)
RAPIER_FN
(Rotation)(
RAPIER_TYPE
(Real) angle) {
32
RAPIER_TYPE
(Rotation) result = {angle};
33
return
result;
34
}
35
#else
37
static
inline
RAPIER_TYPE
(Vector)
RAPIER_FN
(Vector)(
RAPIER_TYPE
(Real) x,
RAPIER_TYPE
(Real) y,
RAPIER_TYPE
(Real) z) {
38
RAPIER_TYPE
(Vector) result = {x, y, z};
39
return
result;
40
}
41
43
static
inline
RAPIER_TYPE
(Rotation)
RAPIER_FN
(RotationFromAxisAngle)(
RAPIER_TYPE
(Vector) axis,
44
RAPIER_TYPE
(Real) angle) {
45
RAPIER_TYPE
(Real) length =
46
(
RAPIER_TYPE
(Real))sqrt(axis.x * axis.x + axis.y * axis.y + axis.z * axis.z);
47
if
(length == 0) {
48
RAPIER_TYPE
(Rotation) result = {0, 0, 0, 1};
49
return
result;
50
}
51
RAPIER_TYPE
(Real) scale =
RAPIER_FN
(Sin)(angle / 2) / length;
52
RAPIER_TYPE
(Rotation) result = {axis.x * scale, axis.y * scale, axis.z * scale,
53
RAPIER_FN
(Cos)(angle / 2)};
54
return
result;
55
}
56
#endif
57
59
static
inline
RAPIER_TYPE
(Vector)
RAPIER_FN
(VectorAdd)(
RAPIER_TYPE
(Vector) a,
RAPIER_TYPE
(Vector) b) {
60
#if defined(RAPIER_DIM2)
61
return
RAPIER_FN
(Vector)(a.x + b.x, a.y + b.y);
62
#else
63
return
RAPIER_FN
(Vector)(a.x + b.x, a.y + b.y, a.z + b.z);
64
#endif
65
}
66
68
static
inline
RAPIER_TYPE
(Vector)
RAPIER_FN
(VectorSub)(
RAPIER_TYPE
(Vector) a,
RAPIER_TYPE
(Vector) b) {
69
#if defined(RAPIER_DIM2)
70
return
RAPIER_FN
(Vector)(a.x - b.x, a.y - b.y);
71
#else
72
return
RAPIER_FN
(Vector)(a.x - b.x, a.y - b.y, a.z - b.z);
73
#endif
74
}
75
77
static
inline
RAPIER_TYPE
(Vector)
RAPIER_FN
(VectorScale)(
RAPIER_TYPE
(Vector) vector,
RAPIER_TYPE
(Real) scale) {
78
#if defined(RAPIER_DIM2)
79
return
RAPIER_FN
(Vector)(vector.x * scale, vector.y * scale);
80
#else
81
return
RAPIER_FN
(Vector)(vector.x * scale, vector.y * scale, vector.z * scale);
82
#endif
83
}
84
86
static
inline
RAPIER_TYPE
(Real)
RAPIER_FN
(VectorDot)(
RAPIER_TYPE
(Vector) a,
RAPIER_TYPE
(Vector) b) {
87
#if defined(RAPIER_DIM2)
88
return
a.x * b.x + a.y * b.y;
89
#else
90
return
a.x * b.x + a.y * b.y + a.z * b.z;
91
#endif
92
}
93
94
static
inline
RAPIER_TYPE
(Real)
RAPIER_FN
(VectorLength)(
RAPIER_TYPE
(Vector) vector) {
95
return
(
RAPIER_TYPE
(Real))sqrt(
RAPIER_FN
(VectorDot)(vector, vector));
96
}
97
98
static
inline
RAPIER_TYPE
(Vector)
RAPIER_FN
(VectorNormalize)(
RAPIER_TYPE
(Vector) vector) {
99
RAPIER_TYPE
(Real) length =
RAPIER_FN
(VectorLength)(vector);
100
return
length > 0 ?
RAPIER_FN
(VectorScale)(vector, 1 / length) : vector;
101
}
102
#if defined(RAPIER_DIM3)
104
static
inline
RAPIER_TYPE
(Vector)
RAPIER_FN
(VectorCross)(
RAPIER_TYPE
(Vector) a,
RAPIER_TYPE
(Vector) b) {
105
return
RAPIER_FN
(Vector)(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z,
106
a.x * b.y - a.y * b.x);
107
}
108
#endif
109
111
static
inline
RAPIER_TYPE
(Rotation)
RAPIER_FN
(RotationMul)(
RAPIER_TYPE
(Rotation) a,
RAPIER_TYPE
(Rotation) b) {
112
#if defined(RAPIER_DIM2)
113
RAPIER_TYPE
(Rotation) result = {a.angle + b.angle};
114
return
result;
115
#else
116
RAPIER_TYPE
(Rotation) result = {a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,
117
a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x,
118
a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w,
119
a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z};
120
return
result;
121
#endif
122
}
123
124
/* Rotate a vector without changing its length. The rotation must be normalized.
125
*/
127
static
inline
RAPIER_TYPE
(Vector)
RAPIER_FN
(RotationTransformVector)(
RAPIER_TYPE
(Rotation) rotation,
128
RAPIER_TYPE
(Vector) vector) {
129
#if defined(RAPIER_DIM2)
130
const
RAPIER_TYPE
(Real) c =
RAPIER_FN
(Cos)(rotation.angle),
131
s =
RAPIER_FN
(Sin)(rotation.angle);
132
return
RAPIER_FN
(Vector)(c * vector.x - s * vector.y,
133
s * vector.x + c * vector.y);
134
#else
135
const
RAPIER_TYPE
(Vector) t = {2 * (rotation.y * vector.z - rotation.z * vector.y),
136
2 * (rotation.z * vector.x - rotation.x * vector.z),
137
2 * (rotation.x * vector.y - rotation.y * vector.x)};
138
return
RAPIER_FN
(Vector)(
139
vector.x + rotation.w * t.x + rotation.y * t.z - rotation.z * t.y,
140
vector.y + rotation.w * t.y + rotation.z * t.x - rotation.x * t.z,
141
vector.z + rotation.w * t.z + rotation.x * t.y - rotation.y * t.x);
142
#endif
143
}
144
146
static
inline
RAPIER_TYPE
(Pose)
RAPIER_FN
(Pose)(
RAPIER_TYPE
(Vector) translation,
147
RAPIER_TYPE
(Rotation) rotation) {
148
RAPIER_TYPE
(Pose) result = {translation, rotation};
149
return
result;
150
}
151
153
static
inline
RAPIER_TYPE
(Pose)
RAPIER_FN
(TranslationPose)(
RAPIER_TYPE
(Vector) translation) {
154
#if defined(RAPIER_DIM2)
155
RAPIER_TYPE
(Rotation) rotation = {0};
156
#else
157
RAPIER_TYPE
(Rotation) rotation = {0, 0, 0, 1};
158
#endif
159
return
RAPIER_FN
(Pose)(translation, rotation);
160
}
161
163
static
inline
RAPIER_TYPE
(MassProperties)
RAPIER_FN
(MassProperties)(
RAPIER_TYPE
(Vector) local_com,
164
RAPIER_TYPE
(Real) mass,
165
RAPIER_TYPE
(AngVector) principal_inertia) {
166
#if defined(RAPIER_DIM2)
167
RAPIER_TYPE
(MassProperties) result = {local_com, mass, principal_inertia};
168
#else
169
RAPIER_TYPE
(Rotation) frame = {0, 0, 0, 1};
170
RAPIER_TYPE
(MassProperties) result = {local_com, mass, principal_inertia, frame};
171
#endif
172
return
result;
173
}
174
175
static
inline
RAPIER_TYPE
(Rotation)
RAPIER_FN
(RotationInverse)(
RAPIER_TYPE
(Rotation) rotation) {
176
#if defined(RAPIER_DIM2)
177
return
RAPIER_FN
(Rotation)(-rotation.angle);
178
#else
179
RAPIER_TYPE
(Rotation) result = {-rotation.x, -rotation.y, -rotation.z, rotation.w};
180
return
result;
181
#endif
182
}
183
184
static
inline
RAPIER_TYPE
(Vector)
RAPIER_FN
(PoseTransformPoint)(
RAPIER_TYPE
(Pose) pose,
185
RAPIER_TYPE
(Vector) point) {
186
return
RAPIER_FN
(VectorAdd)(
187
pose.translation,
RAPIER_FN
(RotationTransformVector)(pose.rotation, point));
188
}
189
190
static
inline
RAPIER_TYPE
(Pose)
RAPIER_FN
(PoseInverse)(
RAPIER_TYPE
(Pose) pose) {
191
RAPIER_TYPE
(Rotation) rotation =
RAPIER_FN
(RotationInverse)(pose.rotation);
192
return
RAPIER_FN
(Pose)(
RAPIER_FN
(RotationTransformVector)(
193
rotation,
RAPIER_FN
(VectorScale)(pose.translation, -1)),
194
rotation);
195
}
196
#endif
197
rapier.h
Rapier C ABI.
RAPIER_FN
#define RAPIER_FN(name)
Select an r2/r3 public function name.
Definition
rapier.h:34
RAPIER_TYPE
#define RAPIER_TYPE(name)
Select an R2/R3 public type name.
Definition
rapier.h:30
include
rapier_math.h
Generated by
1.18.0