【问题标题】:Misunderstanding of multiplyMV - OpenGL ES 2.0对multiplyMV的误解——OpenGL ES 2.0
【发布时间】:2018-03-29 21:41:15
【问题描述】:

我使用 OpenGL ES 2.0 和 Java for Android 编写了一个简单的程序。 该程序使用正射投影矩阵、视图矩阵和模型矩阵在屏幕上的随机位置绘制一个点。在着色器中,我放置了矩阵 * 位置。

一切正常,但后来为了测试目的,我尝试自己计算点的位置,所以我使用了 multiplyMV 并将我的 MVPmatrix 作为参数(通过在投影和视图之间使用 multiplyMM 然后在之间结果和模型矩阵)和我的观点(例如 2f、3.5f、0f、1f)。问题是有时我得到的 x 和/或 y 的结果大于 1 或小于 -1,尽管该点在屏幕上。但在标准化设备坐标中,该点必须在 -1 和 1 之间的范围内才能“显示在屏幕上”。

我真的不明白我的错误在哪里。

【问题讨论】:

    标签: java opengl-es opengl-es-2.0 perspectivecamera


    【解决方案1】:

    在应用投影矩阵后,该点必须位于标准化设备空间 [-1, 1](对于 x、y、z)。
    但请注意,重点可能是Homogeneous coordinate。这意味着您必须先发送Perspective divide

    投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。投影矩阵从视图空间转换到剪辑空间。通过除以剪辑坐标的w 分量,将剪辑空间中的坐标转换为范围为 (-1, -1, -1) 到 (1, 1, 1) 的标准化设备坐标 (NDC)。

    剪辑空间坐标为Homogeneous coordinates。在剪辑空间中,执行场景的剪辑。如果xyz 分量在该点齐次坐标的倒置w 分量和w 分量定义的范围内,则该点位于裁剪空间中:

    -p.w <=  p.x, p.y, p.z  <= p.w.
    

    通过Perspective divide 将剪辑坐标转换为标准化的设备坐标:

    ndc.xyz = (p.x/p.w, p.y/p.w, p.z/p.w)
    

    【讨论】:

    • 感谢您的回答,但即使我使用正交矩阵作为投影矩阵,我也必须将透视除以 w 吗?当我使用这种类型的投影时,w 不总是 1 吗?
    • 好吧,我想我理解我的错误了。我在 0;0;0 处绘制所有点,然后在我的模型矩阵中翻译它们,但是当我通过 multiplyMV 函数中的点时,我给出了已经翻译的位置。所以它使翻译两次(我认为)。现在它工作得很好,但是如果我尝试计算我的点和他的 x 和 y 分量中同样远的点之间的距离,我的 y 值是 aspect_ratio 乘以我的 x 值。这对我来说似乎很奇怪,因为在 ndc 中,左下角是-1;-1,右上角是 1;1,所以屏幕的“网格”被拉伸了,但“距离”没有跨度>
    • 好的,非常感谢,我想我明白了!对不起我的英语。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多