【问题标题】:Perspective projection turns cube into weird tv shaped cuboid透视投影将立方体变成奇怪的电视形长方体
【发布时间】:2022-01-11 20:22:44
【问题描述】:

这是我的透视投影矩阵代码

inline m4
Projection(float WidthOverHeight, float FOV)
{
    float Near = 1.0f;
    float Far = 100.0f;

    float f = 1.0f/(float)tan(DegToRad(FOV / 2.0f));
    float fn = 1.0f / (Near - Far);


    float a = f / WidthOverHeight;
    float b = f;
    float c = Far * fn;
    float d = Near * Far * fn;

    m4 Result = 
    {
        {{a, 0, 0, 0},
         {0, b, 0, 0},
         {0, 0, c, -1},
         {0, 0, d, 0}}
    };
    return Result;
}

这里是主要代码

    m4 Project = Projection(ar, 90);
    m4 Move = {};
    CreateMat4(&Move,
        1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, -2,
        0, 0, 0, 1);
    m4 Rotate = Rotation(Scale);
    Scale += 0.01f;

    m4 FinalTransformation = Project * Move * Rotate;
    SetShaderUniformMat4("Project", FinalTransformation, ShaderProgram);

Here 是一些立方体旋转的图片。 在着色器代码中,我只是将变换乘以位置(变换在左侧)。

我不确定它是否有用,但这里是轮换代码:

float c = cos(Angle);
float s = sin(Angle);
m4 R =
{
    {{ c, 0, s, 0},
     { 0, 1, 0, 0},
     {-s, 0, c, 0},
     { 0, 0, 0, 1}}
};
return R;

我尝试在着色器代码中而不是在 c++ 端乘以矩阵,但后来一切都消失了。

【问题讨论】:

  • 您的矩阵似乎被转置了。
  • @Rabbid76 似乎已经修复了它。我转置了投影和平移矩阵,并在着色器一侧将它们相乘,尽管旋转一个似乎是正确的(可能是因为我没有写那个)。 OpenGL如何获取和乘以矩阵?因为它的行为似乎与我编写的乘法函数不同。

标签: c++ matrix opengl 3d projection-matrix


【解决方案1】:

OpenGL 矩阵按列主要顺序存储。您必须从左到右阅读。例如矩阵R 的第一列是{ c, 0, s, 0},第二列是{ 0, 1, 0, 0},第三列是{-s, 0, c, 0},第四列是{ 0, 0, 0, 1}。代码中的行实际上是列(而不是行)。
因此,您需要转置投影矩阵 (Project) 和平移矩阵 (Move)。

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多