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

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.

主站蜘蛛池模板: 阿勒泰市| 庆阳市| 陇南市| 长春市| 五原县| 六枝特区| 永宁县| 应城市| 滨海县| 门源| 会理县| 沁源县| 巩义市| 朝阳区| 潜江市| 定西市| 财经| 焦作市| 凤冈县| 筠连县| 土默特右旗| 辰溪县| 胶州市| 忻城县| 边坝县| 巴彦淖尔市| 滁州市| 云霄县| 和林格尔县| 策勒县| 阳原县| 北辰区| 富源县| 邵阳县| 凤凰县| 溧水县| 望江县| 汶川县| 庐江县| 玉龙| 同仁县|