官术网_书友最值得收藏!

Conjugate and inverse

Games mostly use normalized quaternions, which comes in handy when inverting quaternions. The inverse of a normalized quaternion is its conjugate. The conjugate

of a quaternion flips its axis of rotation:

  1. Implement the conjugate function in quat.cpp and remember to declare the function in quat.h:

    quat conjugate(const quat& q) {

        return quat(

            -q.x,

            -q.y,

            -q.z,

             q.w

        );

    }

  2. The proper inverse of a quaternion is the conjugate divided by the squared length of the quaternion. Implement the quaternion inverse function in quat.cpp. Add the function declaration to quat.h:

    quat inverse(const quat& q) {

       float lenSq = q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w;

       if (lenSq < QUAT_EPSILON) {

          return quat();

       }

       float recip = 1.0f / lenSq;

       return quat(-q.x * recip,

                   -q.y * recip,

                   -q.z * recip,

                    q.w * recip

       );

    }

If you need to find out whether a quaternion is normalized or not, check the squared length. The squared length of a normalized quaternion is always 1. If a quaternion is normalized, its conjugate and inverse are the same. This means you can use the faster conjugate function, instead of the inverse function. In the next section, you will learn how to multiply two quaternions together.

主站蜘蛛池模板: 鹤岗市| 扎兰屯市| 杨浦区| 临清市| 雷山县| 乐昌市| 鹤峰县| 榕江县| 蓬莱市| 布拖县| 花莲市| 阳曲县| 临海市| 庆元县| 车致| 闻喜县| 长治县| 福清市| 张掖市| 轮台县| 阿拉尔市| 沅江市| 梅州市| 来安县| 奇台县| 山丹县| 双城市| 靖西县| 旬邑县| 垣曲县| 牙克石市| 木兰县| 定州市| 荣成市| 溆浦县| 博爱县| 射阳县| 忻城县| 合山市| 始兴县| 武鸣县|