矩阵旋转到四元数

时间:2014-01-30 11:25:58

标签: c++ matrix quaternions

我正在开发一个将矩阵(3x3)转换为四元数的演示,但是我坚持使用对大多数人来说似乎非常简单的东西,但我的大脑正在关闭,因为我一直在努力用了几个小时。下面的代码在我选择的IDE(VS2010 Express)中使用C ++和openGL编译好,但是我收到以下错误 - “变量'm11'正在使用而没有被初始化。”我的矩阵中的所有浮点变量都会出现此错误,因此当我尝试运行代码时,它只是炸弹了。有人可以帮忙吗?谢谢

代码:

void matrixIntoQuaternions() {

            // Input matrix 3X3
            float m11,m12,m13;
            float m21,m22,m23;
            float m31,m32,m33;

            // Output quaternion
            float w,x,y,z;
            // Determine which of w,x,y, or z has the largest absolute value
            float fourWSquaredMinus1 = m11 + m22 + m33;
            float fourXSquaredMinus1 = m11 - m22 - m33;
            float fourYSquaredMinus1 = m22 - m11 - m33;
            float fourZSquaredMinus1 = m33 - m11 - m22;

            int biggestIndex = 0;
            float fourBiggestSquaredMinus1 = fourWSquaredMinus1;

            if(fourXSquaredMinus1 > fourBiggestSquaredMinus1) {
                fourBiggestSquaredMinus1 = fourXSquaredMinus1;
                biggestIndex = 1;
            }
            if (fourYSquaredMinus1 > fourBiggestSquaredMinus1) {
                fourBiggestSquaredMinus1 = fourYSquaredMinus1;
                biggestIndex = 2;
            }
            if (fourZSquaredMinus1 > fourBiggestSquaredMinus1) {
                fourBiggestSquaredMinus1 = fourZSquaredMinus1;
                biggestIndex = 3;
            }
            // Per form square root and division
            float biggestVal = sqrt (fourBiggestSquaredMinus1 + 1.0f ) * 0.5f;
            float mult = 0.25f / biggestVal;

            // Apply table to compute quaternion values
            switch (biggestIndex) {
                case 0:
                    w = biggestVal;
                    x = (m23 - m32) * mult;
                    y = (m31 - m13) * mult;
                    z = (m12 - m21) * mult;
                    break;
                case 1:
                    x = biggestVal;
                    w = (m23 - m32) * mult;
                    y = (m12 + m21) * mult;
                    z = (m31 + m13) * mult;
                    break;
                case 2:
                    y = biggestVal;
                    w = (m31 - m13) * mult;
                    x = (m12 + m21) * mult;
                    z = (m23 + m32) * mult;
                    break;
                case 3:
                    z = biggestVal;
                    w = (m12 - m21) * mult;
                    x = (m31 + m13) * mult;
                    y = (m23 + m32) * mult;
                    break;

                    quatX = x;
                    quatY = y;
                    quatZ = z;
                    quatW = w;

                    model = vec4(quatX,quatY,quatZ,quatW);
                }
            } 

1 个答案:

答案 0 :(得分:0)

将输入输入到您的函数,并且不要将它们保留为未定义:

void matrixIntoQuaternions(
            float m11, float m12, float m13, // Make these function parameters!
            float m21, float m22, float m23,
            float m31, float m32, float m33
)
{
   // Rest of your code...
}