mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-26 22:31:05 +00:00
Add QuatInverse to calculate 1/q.
There's still no direct quaternion division because I don't know if the definition of q1/q2 is (1/q2)*q1 or q1*(1/q2) (it does make a difference).
This commit is contained in:
parent
87ce9f5333
commit
33db650161
2 changed files with 18 additions and 6 deletions
|
@ -241,7 +241,8 @@ float anglemod (float a);
|
|||
void RotatePointAroundVector (vec3_t dst, const vec3_t axis,
|
||||
const vec3_t point, float degrees);
|
||||
|
||||
void QuatMult (const quat_t v1, const quat_t v2, quat_t out);
|
||||
void QuatMult (const quat_t q1, const quat_t q2, quat_t out);
|
||||
void QuatInverse (const quat_t in, quat_t out);
|
||||
|
||||
#define BOX_ON_PLANE_SIDE(emins, emaxs, p) \
|
||||
(((p)->type < 3)? \
|
||||
|
|
|
@ -172,18 +172,29 @@ RotatePointAroundVector (vec3_t dst, const vec3_t axis, const vec3_t point,
|
|||
}
|
||||
|
||||
VISIBLE void
|
||||
QuatMult (const quat_t v1, const quat_t v2, quat_t out)
|
||||
QuatMult (const quat_t q1, const quat_t q2, quat_t out)
|
||||
{
|
||||
vec_t s;
|
||||
vec3_t v;
|
||||
|
||||
s = v1[0] * v2[0] - DotProduct (v1 + 1, v2 + 1);
|
||||
CrossProduct (v1 + 1, v2 + 1, v);
|
||||
VectorMultAdd (v, v1[0], v2 + 1, v);
|
||||
VectorMultAdd (v, v2[0], v1 + 1, out + 1);
|
||||
s = q1[0] * q2[0] - DotProduct (q1 + 1, q2 + 1);
|
||||
CrossProduct (q1 + 1, q2 + 1, v);
|
||||
VectorMultAdd (v, q1[0], q2 + 1, v);
|
||||
VectorMultAdd (v, q2[0], q1 + 1, out + 1);
|
||||
out[0] = s;
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
QuatInverse (const quat_t in, quat_t out)
|
||||
{
|
||||
quat_t q;
|
||||
vec_t m;
|
||||
|
||||
m = QDotProduct (in, in); // in * in*
|
||||
QuatConj (in, q);
|
||||
QuatScale (q, 1 / m, out);
|
||||
}
|
||||
|
||||
#if defined(_WIN32) && !defined(__GNUC__)
|
||||
# pragma optimize( "", on )
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue