OpenGL LookAt矩阵基础

时间:2019-02-05 17:55:29

标签: c++ opengl math matrix

据我所知,当我在数学上使用OpenGL的列主布局时,必须在内存中使用列的主布局。因此,我希望LookAt矩阵的列表示坐标系的基础(轴)。

我的矩阵实现在内存中占大多数。但是,当我将相机坐标系的基础设置为矩阵的列时,它将无法正常工作:

Result.Elements[0 + 0*4] = Right.x;
Result.Elements[1 + 0*4] = Right.y;
Result.Elements[2 + 0*4] = Right.z;

Result.Elements[0 + 1*4] = Up.x;
Result.Elements[1 + 1*4] = Up.y;
Result.Elements[2 + 1*4] = Up.z;

Result.Elements[0 + 2*4] = Forward.x;
Result.Elements[1 + 2*4] = Forward.y;
Result.Elements[2 + 2*4] = Forward.z;
Result.Elements[3 + 3*4] = 1.0f;

Result.Elements[0 + 3*4] = -DotProduct(From, Right);
Result.Elements[1 + 3*4] = -DotProduct(From, Up);
Result.Elements[2 + 3*4] = -DotProduct(From, Forward);

但是当我将基数设置为矩阵的行时,它的工作完全正确(我仍然将矩阵的平移部分设置为列):

Result.Elements[0 + 0*4] = Right.x;
Result.Elements[0 + 1*4] = Right.y;
Result.Elements[0 + 2*4] = Right.z;

Result.Elements[1 + 0*4] = Up.x;
Result.Elements[1 + 1*4] = Up.y;
Result.Elements[1 + 2*4] = Up.z;

Result.Elements[2 + 0*4] = Forward.x;
Result.Elements[2 + 1*4] = Forward.y;
Result.Elements[2 + 2*4] = Forward.z;
Result.Elements[3 + 3*4] = 1.0f;

Result.Elements[0 + 3*4] = -DotProduct(From, Right);
Result.Elements[1 + 3*4] = -DotProduct(From, Up);
Result.Elements[2 + 3*4] = -DotProduct(From, Forward);

我不明白为什么会这样。

我知道:

  

出于编程目的,OpenGL矩阵是16值数组,基本向量在内存中连续放置。翻译成分占据16元素矩阵的第13、14和15个元素,其中索引从1到16编号。

     

A1 A5 A9 A13
    A2 A6 A10 A14
    A3 A7 A11 A15
    A4 A8 A12 A16

因此,如果我在OpenGL中使用列优先顺序,则在内存中使用列优先布局(将A13,A14,A15用作翻译组件)。

我的矩阵乘法和叉积的实现(如果有帮助的话):

mat4 operator*(mat4 A, mat4 B)
{
    mat4 Result;

    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            float Sum = 0.0f;
            for (int e = 0; e < 4; e++)
            {
                Sum += A.Elements[j + e*4] * B.Elements[e + i*4];
            }
            Result.Elements[j + i * 4] = Sum;
        }
    }

    return(Result);
}

vec3 CrossProduct(vec3 A, vec3 B)
{
    vec3 Result;
    Result.x = A.y*B.z - A.z*B.y;
    Result.y = A.z*B.x - A.x*B.z;
    Result.z = A.x*B.y - A.y*B.x;

    return(Result);
}

0 个答案:

没有答案