Changeset 2914


Ignore:
Timestamp:
Sep 14, 2013, 2:08:11 PM (6 years ago)
Author:
sam
Message:

math: implement vec3::toeuler_* for Tait-Bryan angles.

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/camera.cpp

    r2899 r2914  
    211211vec3 Camera::GetRotationEuler()
    212212{
    213     return vec3::toeuler(GetRotation());
     213    return vec3::toeuler_zyx(GetRotation());
    214214}
    215215
  • trunk/src/lol/math/vector.h

    r2860 r2914  
    504504      : BVec3<T>(v[0], v[1], v[2]) {}
    505505
    506     static Vec3<T> toeuler(Quat<T> const &q);
     506    static Vec3<T> toeuler_xyx(Quat<T> const &q);
     507    static Vec3<T> toeuler_xzx(Quat<T> const &q);
     508    static Vec3<T> toeuler_yxy(Quat<T> const &q);
     509    static Vec3<T> toeuler_yzy(Quat<T> const &q);
     510    static Vec3<T> toeuler_zxz(Quat<T> const &q);
     511    static Vec3<T> toeuler_zyz(Quat<T> const &q);
     512
     513    static Vec3<T> toeuler_xyz(Quat<T> const &q);
     514    static Vec3<T> toeuler_xzy(Quat<T> const &q);
     515    static Vec3<T> toeuler_yxz(Quat<T> const &q);
     516    static Vec3<T> toeuler_yzx(Quat<T> const &q);
     517    static Vec3<T> toeuler_zxy(Quat<T> const &q);
     518    static Vec3<T> toeuler_zyx(Quat<T> const &q);
    507519
    508520    LOL_MEMBER_OPS(Vec3, x)
  • trunk/src/math/vector.cpp

    r2898 r2914  
    531531}
    532532
    533 template<> vec3 vec3::toeuler(quat const &q)
     533static inline vec3 quat_toeuler_generic(quat const &q, int i, int j, int k)
    534534{
    535535    float n = norm(q);
     
    538538        return vec3(0.f);
    539539
    540     vec3 ret(atan2(2.f * (q.w * q.x + q.y * q.z),
    541                    1.f - 2.f * (q.x * q.x + q.y * q.y)),
    542              asin(2.f * (q.w * q.y - q.z * q.x)),
    543              atan2(2.f * (q.w * q.z + q.y * q.x),
    544                    1.f - 2.f * (q.z * q.z + q.y * q.y)));
     540    vec3 v(q.x, q.y, q.z), ret;
     541
     542    if (i != k)
     543    {
     544        if ((2 + i - j) % 3)
     545        {
     546            ret[0] = atan2(2.f * (q.w * v[i] - v[j] * v[k]),
     547                           1.f - 2.f * (v[i] * v[i] + v[j] * v[j]));
     548            ret[1] = asin(2.f * (q.w * v[j] + v[i] * v[k]));
     549            ret[2] = atan2(2.f * (q.w * v[k] - v[j] * v[i]),
     550                           1.f - 2.f * (v[k] * v[k] + v[j] * v[j]));
     551        }
     552        else
     553        {
     554            ret[0] = atan2(2.f * (q.w * v[i] + v[j] * v[k]),
     555                           1.f - 2.f * (v[i] * v[i] + v[j] * v[j]));
     556            ret[1] = asin(2.f * (q.w * v[j] - v[i] * v[k]));
     557            ret[2] = atan2(2.f * (q.w * v[k] + v[j] * v[i]),
     558                           1.f - 2.f * (v[k] * v[k] + v[j] * v[j]));
     559        }
     560    }
     561    else
     562    {
     563        /* FIXME: TODO */
     564    }
    545565
    546566    return (180.0f / F_PI / n) * ret;
     
    654674
    655675#define DEFINE_FROMEULER_GENERIC(name, i, j, k) \
     676    /* Create quaternions from Euler angles */ \
    656677    template<> quat quat::fromeuler_##name(vec3 const &v) \
    657678    { \
     
    664685    } \
    665686    \
     687    /* Create 3×3 matrices from Euler angles */ \
    666688    template<> mat3 mat3::fromeuler_##name(vec3 const &v) \
    667689    { \
     
    674696    } \
    675697    \
     698    /* Create 4×4 matrices from Euler angles */ \
    676699    template<> mat4 mat4::fromeuler_##name(vec3 const &v) \
    677700    { \
     
    682705    { \
    683706        return mat4::fromeuler_##name(vec3(phi, theta, psi)); \
     707    } \
     708    \
     709    /* Retrieve Euler angles from a quaternion */ \
     710    template<> vec3 vec3::toeuler_##name(quat const &q) \
     711    { \
     712        return quat_toeuler_generic(q, i, j, k); \
    684713    }
    685714
Note: See TracChangeset for help on using the changeset viewer.