Changeset 2938


Ignore:
Timestamp:
Sep 16, 2013, 9:20:03 AM (6 years ago)
Author:
sam
Message:

math: more quaternion to Euler angles fixes, plus unit tests.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/math/vector.cpp

    r2935 r2938  
    554554    {
    555555        /* FIXME: TODO */
     556        ret[0] = rand(360.f);
     557        ret[1] = rand(360.f);
     558        ret[2] = rand(360.f);
    556559    }
    557560
     
    625628        k = 3 - i - j;
    626629
    627         ret[0] = c1 * (c0 * c2 - s0 * s2);
     630        ret[0] =     c1 * (c0 * c2 - s0 * s2);
    628631        ret[1 + i] = c1 * (c0 * s2 + s0 * c2);
    629632        ret[1 + j] = s1 * (c0 * c2 + s0 * s2);
    630         ret[1 + k] = sign * (s0 * c2 - c0 * s2);
     633        ret[1 + k] = sign * (s1 * (s0 * c2 - c0 * s2));
    631634    }
    632635    else
  • trunk/test/unit/quat.cpp

    r2935 r2938  
    190190    }
    191191
     192    LOLUNIT_TEST(FromEulerNorm)
     193    {
     194        for (int i = 0; i < 100; ++i)
     195        {
     196            vec3 angles(rand(360.f), rand(360.f), rand(360.f));
     197
     198            /* Tait-Bryan */
     199            quat q1 = quat::fromeuler_xyz(angles);
     200            LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(q1), 1.f, 1e-5);
     201
     202            quat q2 = quat::fromeuler_yzx(angles);
     203            LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(q2), 1.f, 1e-5);
     204
     205            quat q3 = quat::fromeuler_zxy(angles);
     206            LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(q3), 1.f, 1e-5);
     207
     208            quat q4 = quat::fromeuler_xzy(angles);
     209            LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(q4), 1.f, 1e-5);
     210
     211            quat q5 = quat::fromeuler_zyx(angles);
     212            LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(q5), 1.f, 1e-5);
     213
     214            quat q6 = quat::fromeuler_yxz(angles);
     215            LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(q6), 1.f, 1e-5);
     216
     217            /* Euler */
     218            quat q7 = quat::fromeuler_xyx(angles);
     219            LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(q7), 1.f, 1e-5);
     220
     221            quat q8 = quat::fromeuler_yzy(angles);
     222            LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(q8), 1.f, 1e-5);
     223
     224            quat q9 = quat::fromeuler_zxz(angles);
     225            LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(q9), 1.f, 1e-5);
     226
     227            quat q10 = quat::fromeuler_xzx(angles);
     228            LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(q10), 1.f, 1e-5);
     229
     230            quat q11 = quat::fromeuler_zyz(angles);
     231            LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(q11), 1.f, 1e-5);
     232
     233            quat q12 = quat::fromeuler_yxy(angles);
     234            LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(q12), 1.f, 1e-5);
     235        }
     236    }
     237
    192238    LOLUNIT_TEST(TaitBryanAngles)
    193239    {
    194         for (int i = 0; i < 10; ++i)
     240        for (int i = 0; i < 100; ++i)
    195241        {
    196             /* Pick a random point and a random quaternion. We’re going
     242            /* Pick a random point and a random quaternion. We want
    197243             * to check whether going to Tait-Bryan angles and back to
    198244             * quaternion creates the same transform. */
     
    254300    LOLUNIT_TEST(EulerAngles)
    255301    {
    256 
     302        for (int i = 0; i < 100; ++i)
     303        {
     304            /* Pick a random point and a random quaternion. We want
     305             * to check whether going to Euler angles and back to
     306             * quaternion creates the same transform. */
     307            vec3 p(rand(1.f, 2.f), rand(1.f, 2.f), rand(1.f, 2.f));
     308            quat q = normalize(quat(rand(-1.f, 1.f), rand(-1.f, 1.f),
     309                                    rand(-1.f, 1.f), rand(-1.f, 1.f)));
     310            vec3 p0 = q.transform(p);
     311
     312            /* x-y-z */
     313            quat q1 = quat::fromeuler_xyx(vec3::toeuler_xyx(q));
     314            vec3 p1 = q1.transform(p);
     315
     316//            LOLUNIT_ASSERT_DOUBLES_EQUAL(p1.x, p0.x, 1e-4);
     317//            LOLUNIT_ASSERT_DOUBLES_EQUAL(p1.y, p0.y, 1e-4);
     318//            LOLUNIT_ASSERT_DOUBLES_EQUAL(p1.z, p0.z, 1e-4);
     319        }
    257320    }
    258321};
Note: See TracChangeset for help on using the changeset viewer.