如何在OpenGL中使用矩阵防止万向节锁?

时间:2016-11-06 20:21:02

标签: c++ opengl matrix rotation

我知道Euler和Quaternion旋转类型都有自己独特的怪癖,但是我遇到的问题是(例如)对对象执行以下旋转时:

  • rotateX = 90.0
  • rotateY = 90.0
  • ...哦,等一下......现在X和Z轴基本相同!

看,我想要的是旋转一个立方体,比如90度X,90度Y,并且仍然将所有轴点重新放回原位,而不是局部旋转。

任何代码示例都是理想的 - 这是我目前正在使用的代码:

_model =    scale(_scale) *
                    translate(_position) *
                    (   rotate(_rotation.data[0], 1.0f, 0.0f, 0.0f) * 
                        rotate(_rotation.data[1], 0.0f, 1.0f, 0.0f) * 
                        rotate(_rotation.data[2], 0.0f, 0.0f, 1.0f) );

我有一个Math.h来计算旋转,如下所示:

    template <typename T>
    static inline Tmat4<T> rotate(T angle, T x, T y, T z)
    {
        Tmat4<T> result;

        const T x2 = x * x;
        const T y2 = y * y;
        const T z2 = z * z;
        float rads = float(angle) * 0.0174532925f;
        const float c = cosf(rads);
        const float s = sinf(rads);
        const float omc = 1.0f - c;

        result[0] = Tvec4<T>(T(x2 * omc + c),           T(y * x * omc + z * s),     T(x * z * omc - y * s),     T(0));
        result[1] = Tvec4<T>(T(x * y * omc - z * s),    T(y2 * omc + c),            T(y * z * omc + x * s),     T(0));
        result[2] = Tvec4<T>(T(x * z * omc + y * s),    T(y * z * omc - x * s),     T(z2 * omc + c),            T(0));
        result[3] = Tvec4<T>(T(0),                      T(0),                       T(0),                       T(1));

        return result;
    }

0 个答案:

没有答案