【问题标题】:Invert Z-axis in Matrix4::Perspective在 Matrix4::Perspective 中反转 Z 轴
【发布时间】:2017-01-20 22:20:06
【问题描述】:

我正在制作一个 OpenGL 应用程序,其中我有以下代码来设置透视矩阵。

Matrix4 Matrix4::Perspective(float pL, float pR, float pB, float pT, float pN, float pF) {
    Matrix4 matrix;
    matrix[0] = 2 * pN / (pR - pL);
    matrix[5] = 2 * pN / (pT - pB);
    matrix[8] = (pR + pL) / (pR - pL);
    matrix[9] = (pT + pB) / (pT - pB);
    matrix[10] = -(pF + pN) / (pF - pN);
    matrix[11] = -1;
    matrix[14] = -(2 * pF * pN) / (pF - pN);
    matrix[15] = 0;
    return matrix;
}

当我操纵对象的平移时,-Z 向前移动它,+Z 向后移动它。

我通过将矩阵[11] 和矩阵[14] 切换为:

matrix[11] = 1;
matrix[14] = (2 * pF * pN) / (pN - pF);

但是网格会稍微变形。 (可能在更复杂的网格上发生巨大变形。)

我将如何操作这个方法来给我想要的结果(反转 z 轴)?

pF = zFar pN = zNear

【问题讨论】:

    标签: c++ opengl matrix


    【解决方案1】:

    从概念上讲,您希望在应用投影之前反转 z,这将具有将投影从 -z 镜像到 z 的效果。所以你在概念上要做的是计算P * Scale(1,1,-1) = P * diag(1,1,-1,1)。如果您进行数学运算,您会发现这只会导致对投影矩阵的第三取反,因此正确的矩阵将是:

    matrix[0] = 2 * pN / (pR - pL);
    matrix[5] = 2 * pN / (pT - pB);
    matrix[8] = -(pR + pL) / (pR - pL);
    matrix[9] = -(pT + pB) / (pT - pB);
    matrix[10] = (pF + pN) / (pF - pN);
    matrix[11] = 1;
    matrix[14] = -(2 * pF * pN) / (pF - pN);
    matrix[15] = 0;
    

    像你一样否定matrix[14] 没有任何意义,它只会将你的近处和远处的平面移动到其他地方。

    【讨论】:

    • 非常感谢您的回复...我将不得不打开旧的线性代数教科书来尝试更好地理解转换。稍后会接受答案,但我仍然有一个小问题,网格正在“折叠”并且只是稍微渲染了一下......我会得到一个截图。截图:oi66.tinypic.com/ojfd5s.jpg(让我知道您是否需要在 z 轴翻转之前使用原件之一,或者如果您想要关闭线框的图片。)
    • 对不起,我刚刚忘记在导入网格时反转 z 轴!我是否也必须反转法线?
    • 我不知道,因为我不知道你在做什么,或者为什么你甚至需要再次翻转对象空间中的 z。
    • 抱歉,我不清楚,我在 OpenGL 中渲染 3d 网格,为了解决屏幕截图中显示的问题,我需要更改以下内容:mesh.HasPositions() ? Vector3(mesh.mVertices[i].x, mesh.mVertices[i].y, 1.0f - mesh.mVertices[i].z) : Vector3(0.0f, 0.0f, 0.0f), 此代码在生成“内部模型格式”来自 assimp.这样可行!一切正常! :) 谢谢。我只需要翻转模型中的位置顶点,但是,我想知道是否也必须翻转法线。即:mesh.HasNormals() ? Vector3(mesh.mNormals[i].x, mesh.mNormals[i].y, 1.0f - mesh.mNormals[i].z)
    • 好吧,如果你翻转顶点坐标,你也必须翻转法线。但是,您的代码不仅会翻转坐标(那里是 -),还会翻译它们(那里是 1.0f)。你不能对方向向量应用平移,但你仍然必须翻转法线,所以Vector3(mesh.mNormals[i].x, mesh.mNormals[i].y, - mesh.mNormals[i].z)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2020-10-04
    • 2015-02-24
    相关资源
    最近更新 更多